0
我想写一个Verilog代码做以下3项任务:如果右按键一次,Verilog代码总是涉及块
- 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
慢时钟模块正在使led向左/向右移动,使其更易于观察。脉冲模块用于消除反弹。 2 jkff模块是触发器来切换qr和ql,使led可以连续向右/向左移动。我的代码中的主要问题是在always块中,当qr=1
和ql=1
时代码失败。例如,如果qr=1
,我的LED正在向右移动,并且我按下左侧按钮,使qr=1
和ql=1
,led停止。当我尝试再次按下左按钮向左移动时,LED将移向右侧,因为ql=0
和qr=1
。 if()中的灵敏度列表必须是qr==1 && ql==0
否则led将移动到正确的非停止位置。
因此,如上所述,此代码未能完成任务3。任何帮助将不胜感激。
你希望如何从停止('11')切换到'01'状态,即在qr按下时取消ql和断言qr。目前它们互不影响。 – Morgan
如果可能,我想避免(11)状态,当它向右移动时应该是(01)状态,并且在向左移动时应该是(10)状态 – David