旋转移位寄存器与d触发器verilog

时间:2016-01-21 20:37:42

标签: verilog fpga shift-register

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

到目前为止,我已经让每个人在复位信号的持续时间内模拟点亮,因为我已将其用于输入。然而,这样做的目的是让每个指示灯只亮一个时钟滴答,并无限旋转。

这是我的问题:如何将输入作为一个开始,如何使其复位信号不会影响后续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 9clk0, posedge (rst))
begin
    if (rst == 1)
        Q <=1'b0;
    else
        Q <= D;
end
endmodule

1 个答案:

答案 0 :(得分:0)

一种解决方案是将其中一个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(
...