verilog 中的移位寄存器

Shift Register in verilog

我设计了一个串行输入并行输出移位寄存器作为编码器的输入寄存器

module ShiftRegister_SIPO(clk, in, out);
input clk,in;
output [3:0] out;
reg [3:0] tmp;

always @(posedge clk)
begin
tmp = {tmp[2:0], in};
end
assign PO = tmp;
endmodule

一旦获得所需的并行输出数据,我如何保留该值,即使 clk=1?因为即使在获得输出数据之后,该值也会不断变化。例如,如果我给
部分测试平台

in=1;
#10
in=0;
#10
in=1;
#10
in=1;

#5 clk=~clk;

我在第 4 个时钟周期得到 1011,但该值随后不断变化。我能否在剩余时间内将其保留为 1011,仍然保持 clk=1。 提前致谢

在您的示例中,该值将在时钟的每个上升沿移动。为了防止它在某些情况下移动,您需要一种启用或禁用移动的方法。例如:

always @(posedge clk)
begin
   if (enable)
      tmp <= {tmp[2:0], in};
end

所以,控制 enable 信号就可以控制变速。如果它的值很低,则不会发生移位,并且 'tmp' 的值将保持不变,直到您再次启用它。