Verilog,并行输入串行输出移位寄存器
Verilog, Parallel in Series out 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)信号总是低
对我有用。
但是!
该代码不能变成门。
您必须使用 'posedge clk' 或 'negedge clk'。
此外,您的负载是 a-synchronous,这是非常不寻常的,可以
给出针对时钟边沿的竞争条件。
always @ (posedge clk)
begin
if (load)
temp <= din;
else
begin
dout <= temp[0];
temp <= {1'b0, temp[15:1]};
end
end
此外,通常有重置条件。只要没有 'load' 信号,dout 就会产生 X-es。这会非常扰乱您电路的其余部分。你在 dout 中也有额外的时钟延迟。如果你愿意,你可以在那里保存一个时钟周期。这是一个 a-synchronous 低电平有效复位:
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];
我正在学习和练习 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)信号总是低
对我有用。
但是!
该代码不能变成门。
您必须使用 'posedge clk' 或 'negedge clk'。
此外,您的负载是 a-synchronous,这是非常不寻常的,可以
给出针对时钟边沿的竞争条件。
always @ (posedge clk)
begin
if (load)
temp <= din;
else
begin
dout <= temp[0];
temp <= {1'b0, temp[15:1]};
end
end
此外,通常有重置条件。只要没有 'load' 信号,dout 就会产生 X-es。这会非常扰乱您电路的其余部分。你在 dout 中也有额外的时钟延迟。如果你愿意,你可以在那里保存一个时钟周期。这是一个 a-synchronous 低电平有效复位:
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];