我想知道是否有递归的方式来编写已经具有触发器模块的移位寄存器?
module DFF_N(Q,D,CK);
output Q;
input D,CK;
reg Q;
always @(negedge CK) begin
Q<=D;
end
endmodule
我想使用这个模块来创建一个像这样的移位寄存器:
`include "DFF_N.v"
module shift_reg(Q,D,CK);
output [10:1] Q;
input D,CK;
DFF_N FFN_1(Q[1],D,CK);
DFF_N FFN_2(Q[2],Q[1],CK);
DFF_N FFN_3(Q[3],Q[2],CK);
DFF_N FFN_4(Q[4],Q[3],CK);
DFF_N FFN_5(Q[5],Q[4],CK);
DFF_N FFN_6(Q[6],Q[5],CK);
DFF_N FFN_7(Q[7],Q[6],CK);
DFF_N FFN_8(Q[8],Q[7],CK);
DFF_N FFN_9(Q[9],Q[8],CK);
DFF_N FFN_10(Q[10],Q[9],CK);
endmodule
有没有更简单的方法来编写它,而不必手动更改每个
FFN_i
的名称?
一种方法是使用带有
generate
循环的 for
块:
module shift_reg(Q,D,CK);
output [10:1] Q;
input D,CK;
genvar i;
generate
for (i=1; i<=10; i=i+1) begin : shifter
if (i==1) begin
DFF_N FFN (Q[i], D, CK);
end else begin
DFF_N FFN (Q[i], Q[i-1], CK);
end
end
endgenerate
endmodule
请参阅 IEEE Std 1800-2017,第 27.3 节 生成构造语法。
这可以轻松缩放到不同的寄存器宽度,特别是如果您使用
parameter
而不是 10
。