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

问题描述 投票:0回答:1

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

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

verilog shift-register
1个回答
2
投票

一种方法是使用带有

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

© www.soinside.com 2019 - 2024. All rights reserved.