Verilog,并行系列输出移位寄存器

时间:2018-03-15 07:09:57

标签: verilog shift-register

我正在学习和练习Verilog HDL。我想设计一个16位并行串行输出移位寄存器。

module verilog_shift_register_test_PISO( din, clk, load, dout );

output reg dout ;

input [15:0] din ;
input clk ;
input load ;

reg [15:0]temp;

always @ (clk or load) begin
 if (load)
  temp <= din;
 else begin
  dout <= temp[0];
  temp <= {1'b0, temp[15:1]};
 end
end
endmodule  

我编写了这段代码并尝试模拟它。

simulation result

simulation_result 我无法理解数据输出(dout)信号始终为低电压的原因

1 个答案:

答案 0 :(得分:2)

它对我有用。

<强> BUT!
那段代码不能变成门。 你必须使用'posedge clk'或'negedge clk'。 你的负载也是同步的,这是非常不寻常的 在时钟边缘提供竞争条件。

always @ (posedge clk)
begin
   if (load)
      temp <= din;
   else
   begin
     dout <= temp[0];
     temp <= {1'b0, temp[15:1]};
   end
end

此外,通常具有复位条件。只要没有“负载”信号,dout就会产生X-es。这可能会让您的电路其余部分感到非常不安。此外,你在dout中还有一个额外的时钟延迟。如果需要,您可以在那里保存一个时钟周期。这里有一个同步低电平有效复位:

always @ (posedge clk or negedge reset_n)
begin
   if (!reset_n)
      temp <= 16'h0000;
   else
   if (load)
      temp <= din;
   else
     temp <= {1'b0, temp[15:1]};
end

assign dout = temp[0];