我正在尝试在Verilog中编写一个应该“移动”LED阵列上的LED灯的程序。用一个按钮,灯应该移动到左边,而另一个灯应该移动到右边。这是我的代码:如果使用三元运算符 - Verilog
module led_shift(UP, DOWN, RES, CLK, LED);
input UP, DOWN, RES, CLK;
output reg [7:0] LED;
reg [7:0] STATE;
[email protected](negedge DOWN or negedge UP or negedge RES)
begin
if(!RES)
begin
STATE <= 8'b00010000;
end
else
begin
STATE <= UP ? STATE>>1 : STATE<<1;
end
end
always @ (posedge CLK)
begin
LED <= STATE;
end
endmodule
的问题是在STATE < = UP?状态>> 1:状态< < 1;以及以下错误:
错误(10200):led_shift.v处的Verilog HDL条件语句错误(34):无法将条件中的操作数与始终包含的事件控件中的对应边相匹配构建
我试图修改代码,而无需使用那种如果:
[email protected](negedge DOWN or negedge UP or negedge RES)
begin
if(!RES)
STATE <= 8'b00010000;
else
begin
if(!DOWN)
STATE <= STATE<<1;
else
begin
if(!UP)
STATE <= STATE>>1;
else
STATE <= STATE;
end
end
end
它编译,但不工作:LED的“动作”只到左边,当我按下另一个按钮全部LED关闭。可能在我的代码中存在问题,但我不明白为什么我的第一个代码根本不能编译。 谢谢你的帮助!
harrym
谢谢!完美的答案。该项目仍然不起作用(我按下的每个按钮,LED关闭,可能转换太快),但至少它编译。我将在模拟中检查信号。我没有得到的是,在我的第二个代码中,当UP很低时,连续发生移位的原因。只有当灵敏度列表中的一个信号下降,当UP较低时才应该移动? – harrym
尝试使用门进行绘图或编写代码,'STATE'是异步低电平置位和复位的内部DFF的输出。 'UP'将是电平敏感的(不边沿敏感),所以高位将立即移出(只有潜在的减速是蠕动延迟)。 – Greg
我用一个边缘检测的例子更新了我的答案。它会根据每个恶性事件转移一次。 – Greg