用 d 触发器 verilog 旋转移位寄存器
Rotating shift register with d flip-flops verilog
目前我正在尝试做 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
一种解决方案是将其中一个 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(
...
目前我正在尝试做 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
一种解决方案是将其中一个 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(
...