考虑如下所示的n位移位寄存器电路:
为移位寄存器编写一个顶级Verilog模块(名为top_module),假设n = 4。实例化 4 个 顶级模块中 MUXDFF 子电路的副本。假设您将在 DE2 板上实现电路。
- 将 R 输入连接到 SW 开关,
- clk 到 KEY[0],
- E 转 KEY[1],
- L 到 KEY[2] 和
- w 更改为 KEY[3]。
- 将输出连接到红灯 LEDR[3:0]。
Verilog代码:
module top_module (
input [3:0] SW,
input [3:0] KEY,
output [3:0] LEDR
); //
MUXDFF mux_init(
.R (SW),
.clk(KEY[0]),
.E (KEY[1]),
.L (KEY[2]),
.W (KEY[3]),
.Q (LEDR)
);
endmodule
module MUXDFF (
input [3:0] R,
input clk,
input E,
input L,
input W,
output reg [3:0] Q
);
//wire temp0,temp1,temp2,temp3;
always@(posedge clk)
begin
//temp3 <= E?W:Q[3];
Q[3]<= L?R[3]:(E?W:Q[3]);
end
always@(posedge clk)
begin
//temp2 <= E?Q[3]:Q[2];
Q[2]<= L?R[2]:(E?Q[3]:Q[2]);
end
always@(posedge clk)
begin
//temp1 <= E?Q[2]:Q[1];
Q[1]<= L?R[1]:(E?Q[2]:Q[1]);
end
always@(posedge clk)
begin
//temp0 <= E?Q[1]:Q[0];
Q[0]<= L?R[0]:(E?Q[1]:Q[0]);
end
endmodule
起初我是写了4个always块,每个always块内由temp保存中间变量W or Q,然后再由L判断输出,但是可能在非阻塞赋值存在延误,导致时序图错误,后总结理解了网上的阻塞赋值和非阻塞赋值的区别:什么时候使用阻塞赋值,什么时候使用非阻塞赋值
①在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句,这种电路结构只与输入电平的变化有关系。