FPGA学习篇——Verilog学习5(reg,wire区分及模块例化)
1 何时用reg,何时用wire?
这个我找了一些网上的各种资料,大概说一下自己的理解,可能还不太到位...
wire相当于一根线,是实时传输的那种,而reg是一个寄存器,是可以存储数据的,需要立刻感受,或者说实时传输的则用wire,需要暂时用一个存放工作的则用reg。
比如:
initial语句我们常用于赋初值,那么,传进来的输入数据就需要暂时存放赋初值,之后才能进行电平的变化,因此,要用reg。
而在任意一个模块输入时,追求一个真实性,需要实时的传输数据,故则用一个wire类型。
以下列出了常用wire和reg的情况:
- always和initial 过程块中被赋值的变量必须是 reg 、,用 assign 连续赋值的对象必须定义成 wire。(端口定义常常在前面,若后续用到这些语句时,前面的端口就要定义特定的类型)
- 元件例化时候的输出必须用wire。
- 子模块输入时用wire。
- inout类型只能用wire。
该图引用于博主“数码逐渐远去”
原文链接:https://blog.csdn.net/kofiliu2018/article/details/128260502
2 模块例化
在我看来,模块例化就相当于C语言中函数调用。
在C语言中,我们常常写到main函数和一些其他功能的函数,而在Verilog里面就有一个顶层模块和子模块的概念:main函数就相当于顶层模块,其他功能的函数就相当于子模块。
再形象生动一点,我们学习数电的时候画的一些电路,子模块就相当于你使用的一个个与门,非门等等,顶层模块就相当于把这些门连起来,将顶层模块里端口与每个门对应的输入输出相连接的这个过程就可以理解为模块例化。
2.1 模块例化语法:
模块例化有两种方法,命名端口连接和顺序端口连接。
2.1.1 命名端口连接
将顶层模块中的端口与子模块中的对应端口用名字直接相连。
这种连接方式可不按照子模块各端口定义的顺序。
要例化的模块名 给例化的模块重新名
(
. 子模块的端口名(对应要连接的顶层模块的端口名字),.子模块的端口名(对应要连接的顶层模块的端口名字),
...
);
其中,“.”可理解为将两个端口连接的意思。
给个例子来理解上述语法:
子模块:
模块例化:
2.1.2 顺序端口连接
顺序端口连接只需要打出顶层模块端口名即可,按照子模块中各端口对应的顺序进行连接,因此,要注意顶层模块端口名的摆放顺序,才能实现对应端口相连。
要例化的模块名 给例化的模块重新名(顶层模块的端口名字,顶层模块的端口名字,顶层模块的端口名字...);
同样,由2.1.1的子模块,改为顺序端口连接的方式来例化:
2.1.3 用generate简化多次重复例化情况
当需要多次进行相同的例化时,可用generate来实现。
常见的有generate搭配for循环语句使用:
genvar i;
generate
for ( 条件 ) begin(
....
);
end
endgenerate
PS:...处内容及上述例化括号内的内容。
以下是实现一个全加器的代码例子:
genvar i ;generatefor(i=0; i<4; i=i+1) beginfull_adder1 u_adder(.Ai (a[i]),.Bi (b[i]),.Ci (co_temp[i-1]), //上一个全加器的溢位是下一个的进位.So (so[i]),.Co (co_temp[i]));endendgenerate
注:以上为学习网上各类资源经验所得,如有侵权,请联系我,欢迎指正!