|
定义模块
CODE:
module Design(端口1,端口2,端口3……);
1)引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名。
CODE:
Design u_1(u_1的端口1,u_1的端口2,u_1的端口3,u_1的端口……);//和Design对应
2)引用时用 “ . ” 符号,标明原模块定义时规定的端口名:
CODE:
Design u_2( .(端口1(u_1的端口1),
.(端口2(u_1的端口2),
.(端口3(u_1的端口3),
…… );//推荐这种引用法引用模块时,注意对运用参数编写的模块的灵活引用。
Q:
CODE:
以下是对一个模块的例化:
m1 #(`UART_FIFO_REC_WIDTH) m1_inst(
.clk( clk ),
..........
);
该模块中定义的第一个参数是 parameter fifo_width = `UART_FIFO_WIDTH;
在另一个专门的文件里定义了:
`define UART_FIFO_WIDTH 8
`define UART_FIFO_REC_WIDTH 11
一开始我以为#(`UART_FIFO_REC_WIDTH)的意思是延时那么多,方便仿真。。。后来觉得不对,不是延时,因为又不是在做赋值。。。
编译后看RTL图发现,该模块UART_FIFO_WIDTH的值全部替换成了UART_FIFO_REC_WIDTH的值,到这里我大概明白这里的用意了。觉得很奇怪,以前从没遇到过。。。
这个意思就是:
CODE:
module Decode(A,F);
parameter Width=1,Polarity=1;
……
endmodule
引用时:
CODE:
module Top;
wire [3:0] A4;
wire [4:0] A5;
wire [15:0] F16;
wire [31:0] F32;
Decode u_D1(A4,F16);//u_D1使用默认参数,Width为1,Polarity为1
Decode #(4,0) u_D2(A4,F16);//u_D2的Width为4,Polarity为0
Decode #(5) u_D3(A5,F32);//u_D3的Width为4,Polarity为0
endmodule#(4,0)这个参数改变方法是内容对应于被引用的module的,参数的改变还可以像module的引用一样使用 ” .
“
CODE:
module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);
CODE:
module half adder (co , sum, a , b);
output co , sum;
input a,b;
parameter and_delay=2;
parameter xor_delay=4;
and #and_delay u_1(co,a,b);
xor #xor_delay u_2(sum,a,b);
参数的用户定制方法有以下两种:
1. 通过 defparam关键宇重新定义模块中的参数:
2. 直接在实例化模块时代入参数。
有意思的是,两家最大的 PLD 供应商 Altera 和 XiIinx 的通用模块定制恰好分别采用了这两种方法。
比如在 Altera 的 Quartus II 开发环境中用 MegaWiard 工具定制一个宽度为 8bit ,深度为32bit 的单口 RAM,对比使用 Xilinx 设计工具 ISE 中的 CORE Generator 产生一个单端口 8 位宽、 32 位深的 RAM ,注意观察 二者RAM 的参数是如何代入的。
更多参考《设计与验证VerilogHDL》P54
[ 本帖最后由 逍遥 于 2009-12-10 13:15 编辑 ]
|
|