问题描述
我希望每次按下按钮时都能从右向左移动,但我的模拟显示我的位没有移动。
这是我写的代码:
module Sipo(KEY0,qIN,qOUT,LEDsipo);
input KEY0;
output reg [5:0] qIN;
output reg [5:0] qOUT;
output [6:0] LEDsipo;
assign LEDsipo[0] = qIN[0];
assign LEDsipo[1] = qIN[1];
assign LEDsipo[2] = qIN[2];
assign LEDsipo[3] = qIN[3];
assign LEDsipo[4] = qIN[4];
assign LEDsipo[5] = qIN[5];
assign LEDsipo[6] = KEY0;
always @(KEY0) begin
if (KEY0 == 1)
qIN = 6'b000000;
qOUT[0] <= KEY0;
qOUT[1] <= qOUT[0];
qOUT[2] <= qOUT[1];
qOUT[3] <= qOUT[2];
qOUT[4] <= qOUT[3];
qOUT[5] <= qOUT[4];
if (qOUT == 7'b111111)
qOUT[0] = 0;
qOUT[1] = 0;
qOUT[2] = 0;
qOUT[3] = 0;
qOUT[4] = 0;
qOUT[5] = 0;
qIN = qOUT;
end
endmodule
我在模拟中得到的结果是 LEDsipo[0] 响应了 KEY0,但 LEDsipo 的其余部分没有响应。我不明白为什么我的位没有发生变化。
解决方法
没有测试平台很难测试你的代码,你没有提供,但我认为你重新发布是对 python 的额外接触。
Verilog 不将缩进理解为范围指示符,需要 begin
/end
来指示范围。所以,我的猜测是您至少有几个问题:
- 缺少开始/结束:
if (KEY0 == 1) begin...end
- 非阻塞/非阻塞分配的错误组合
- 锁存器编码不正确
- veriog 语法的错误使用
所以,虽然它是正确的,但您可以避免使用单独的位:
assign LEDsipo[6:0] = {KEY0,qIN[5:0]};
不要在锁存器中使用敏感性列表,它不会在您的情况下正确合成。请改用 always @*
。好吧,开始/结束。
我不知道你为什么需要 qIn,但首先将它初始化为 0 是没有意义的。此外,它不是锁存器的一部分,应该从 always 块中移出。
always @* begin
if (KEY0 == 1) begin // need begin/end for multiple statements
// qIN <= 6'b000000; -- why do you need it?
qOut[5:0] <= {qOut[4:0],KEY0};
if (qOUT == 7'b111111) // can omit begin/end for a single statement
qOut <= 6'b0;
end
end
assign qIn = qOut;
由于你没有提供任何测试平台,我没有测试代码。