【发布时间】:2016-03-06 09:27:56
【问题描述】:
我正在尝试编写一个verilog代码来完成以下3个任务:
- 如果按一次右键,LED将连续向右移动
- 如果按一次左键,LED 将连续向左移动
- 任何时候我想改变led的方向(例如从右到左),我只需要按一次左键
我的代码如下:
module moveled(input clk, input buttonright, input buttonleft, output [15:0]led);
reg [15:0]led=16'b0000100000000000;
wire slowclk;
wire r;
wire qr;
wire l;
wire ql;
slowclock clk(clk, slowclk);
pulse spR(clk,buttonright,r);
pulse spL(clk,buttonleft,l);
jkff jkR(r,r,clk,qr);
jkff jkL(l,l,clk,ql);
always @(posedge slowclk)
begin
if(qr==1 && ql==0)
begin
led<=led>>1;
end
else if(qr==0 && ql==1)
begin
led<=led<<1;
end
else
led<=led;
end
endmodule
slowclock 模块使 LED 向右/向左移动更慢,以便更容易观察。脉冲模块用于消除去抖动。 2 jkff 模块是 t 触发器,用于切换 qr 和 ql 以使 LED 连续向右/向左移动。我的代码中的主要问题是始终块,当qr=1 和ql=1 时代码失败。例如,如果qr=1,我的 LED 向右移动,我按下左按钮,qr=1 和 ql=1,LED 停止。当我再次尝试按下左键将 LED 向左移动时,LED 将改为向右移动,因为ql=0 和qr=1。 if() 中的敏感度列表必须是qr==1 && ql==0 否则led 会不停地向右移动。
因此,此代码无法完成上述任务 3。任何帮助将不胜感激。
【问题讨论】:
-
您希望它如何从停止 (
11) 切换到01状态,即取消断言 ql 并在 qr 按下时断言qr。目前它们互不影响。 -
如果可能的话,我想避免一个(11)状态,向右移动应该是(01)状态,向左移动应该是(10)状态
标签: verilog