如何以递归方式编写移位寄存器

How to write a shift register in a recursive way

我想知道是否有一种递归的方法来编写一个已经具有触发器模块的移位寄存器?

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 的名称?

一种方法是使用带有 for 循环的 generate 块:

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