|
直接交叉输出是上帖的做法,其实有时候需要模块内部寄存器之间在一个时钟周期之内互相交换数据,可以借助非阻塞赋值用二个FDRE达到目的:
module change_2register_1cycle(
input clk,
input enable,
input reset,
input in,
output out
);
//交换tmp1和tmp2两个寄存器的值
reg tmp1;
reg tmp2;
always @(posedge clk) begin
if(reset) begin
tmp1 <= 1'b0;
tmp2 <= 1'b0;
end
else if(enable == 1'b1) begin //enable必须是一个周期的脉冲信号
tmp1 <= in; //当启动交换时,先将输入送给tmp临时寄存器 本实验并不是研究模块的in和out,所以in,out只是为实验而实验而已。
end
else begin
tmp1 <= tmp2;
tmp2 <= tmp1;
//上面两句执行之后:tmp1就是tmp2的值,而tmp2就是原来tmp1的旧值
end
end
assign out = tmp2;
endmodule
|
|