【问题标题】:Rotating shift register with d flip-flops verilog带 d 触发器的旋转移位寄存器 verilog
【发布时间】:2020-12-21 00:34:42
【问题描述】:

目前我正在尝试做this 项目,但我被困在移位寄存器上。 问题是,我相当肯定他们希望我们用 d 触发器来实现这一点,但我只见过简单的 if/then 移位器。

到目前为止,我已经让每个 LED 模拟在复位信号期间点亮,因为我已将其用于输入。但是,这样做的整体目标是让每个 LED 仅在时钟的一个滴答时间内亮起,并无限旋转。

这是我的问题:如何将输入作为一个开始,以及如何使复位信号不影响后续 LED 亮起多长时间? (另一个问题——我是不是做错了,以至于我现在应该放弃并以不同的方式做事?)

移位器代码:

module shift_reg(
    input clk,
    input rst,
    output [7:0] led
    );

//connector wire between flipflops
wire [7:0] bitshift;

// creating the shifter out of d flipflops

//1st one
d_ff d_ff0(
    .clk(clk),
    .rst(rst),
    .D(bitshift[0]),
    .Q(bitshift[1])
);

//middle ones
genvar i;
generate
for (i=1; i<7; i=i+1)
begin : d_ff_gen_label0
    d_ff d_ff_inst1(
        .clk(clk),
        .rst(rst),
        .D(bitshift[i]),
        .Q(bitshift[i+1])
    );
    end
endgenerate;

//last one
d_ff d_ff1(
    .clk(clk),
    .rst(rst),
    .D(bitshift[7]),
    .Q(bitshift[0])
);

assign led = bitshift;

endmodule

d 触发器代码:

module d_ff(
    input D,
    input clk,
    input rst,
    output reg Q
    );
always @(posedge (clk), posedge (rst))
begin
    if (rst == 1)
        Q <=1'b0;
    else
        Q <= D;
end
endmodule

【问题讨论】:

    标签: verilog fpga shift-register


    【解决方案1】:

    一种解决方案是将其中一个 FF 重置为 1 而不是 0

    要使您的周期长度相等,请使用同步重置(而不是异步重置,就像您实现的那样)

    例如:

    module d_ff_high(
        input D,
        input clk,
        input rst,
        output reg Q
        );
    always @(posedge clk)
    begin
        if (rst == 1)  //only reset on a clock edge!
            Q <=1'b1;
        else
            Q <= D;
    end
    endmodule
    
    ...
    //1st one
    d_ff_high d_ff0(
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多