5.3.1 模块概念 模块(module)是verilog最基本的概念,是v设计中的基本单元,每个v设计的系统中都由若干module组成。 1、模块在语言形式上是以关键词module开始,以关键词endmodule结束的一段程序。 3、每个模块都实现特定的功能。 4、模块之间是并行运行的。 5、模块是分层的,高层模块通过例化、连接低层模块的实例来实现复杂的功能。 7、各模块连接完成整个系统需要一个顶层模块(top-module)。 5.3.2 模块结构module <模块名>(<端口列表>); <参数声明> <端口声明> <定义> <模块条目> endmodule 其中: 1. <模块名> 模块名是模块唯一的标识符。 2. <端口列表> 端口列表是输入、输出和双向端口的列表,这些端口用来与其他模块进行连接。这里只需要列出信号名,不需要指出端口方向和位宽。
上面代码,指出了模块名是mul_module,同时该模块的接口有clk,rst_n,mul_a,mul_b和mul_result。 3. <参数声明> 用parameter定义参数,例如位宽、长度、状态机命名等参数。 4. <端口声明> 端口声明指出端口方向和位宽。端口方向可以是输入、输出和双向。
上面代码指出,clk,rst_n是输入信号并且是1位位宽;mul_a是输入信号并且是4位位宽;mul_b是输入信号并且是3位位宽;mul_result是输出信号并且是7位位宽。 5. <定义> 定义是一段程序,用来指定数据对象的类型和位宽。类型一般为寄存器型、线型;
上面代码指出,clk、rst_n、mul_a、mul_b都是wire型;mul_result_tmp和mul_result都是reg型。 至于是用reg型还是wire型,请看后面的reg和wire一节。 6. <模块条目> 模块条目也是一段程序,将上面<定义>和<端口>组合起来,是说明这个模块要做什么的语句。其形式如下:
FPGA电路一般分两种:组合逻辑和时序逻辑。组合逻辑是不受时钟影响,输入变化输出立刻变化的电路。时序逻辑是在时钟边沿变化(常用上升沿),只有在时钟边沿时,输出才会根据输入变化的电路。 关于组合逻辑详细内容,请看后面的组合逻辑一节。 关于时序逻辑详细内容,请看后面的时序逻辑一节。 提示:用GVIM打开.v文件后,输入“Module”并回车,即可得到模块的设计文件,非常方便。 5.3.3 reg和wire区别设计代码中所有的信号定义,只能用reg和wire两种。 设计代码中,如果是本模块always产生的信号,都用reg;其他都用wire。 测试文件中,ini tial内赋值的代码也用reg。 注意:reg虽然是寄存器的缩写,但用reg定义的信号不一定生成寄存器。既然这样,就没必要认为reg是寄存器类型,就当它是一个名称。 练习1:eoc_cnt是用reg还是wire型
答案:很明显,eoc_cnt由always产生的,因此用reg类型。 练习2:row1_data和row2_data是用reg还是wire型
答案:连接到例化模块的输出信号,都用wire型。 练习3:rdreq_cfg是用reg还是wire型
答案:虽然本always是组合逻辑电路,不会生成寄存器,但rdreq_cfg是always产生的,因此仍然是用reg型。 练习4:sdata是用reg还是wire型
答案:用assign产生的信号,都用wire型。 以上文章出自明德扬点拨FPGA高手进阶,版权归明德扬所有,如需转载,请注明明德扬,谢谢!
|