Verilog代码总是涉及块

时间:2016-03-06 09:27:56

标签: verilog

我正在尝试编写verilog代码来执行以下3个任务:

  1. 如果按下右键一次,则LED将连续向右移动
  2. 如果按下左键一次,则LED将连续向左移动
  3. 在任何时候我想改变LED的方向(例如从右到左),我只需要按下左按钮一次
  4. 我的代码如下:

    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=1ql=1时失败。例如,如果qr=1,我的指示灯向右移动,我按下左按钮以便qr=1ql=1,指示灯停止。当我尝试再次按下左按钮向左移动时,led将向右移动,因为ql=0qr=1。 if()中的敏感度列表必须为qr==1 && ql==0,否则led将向右移动。

    因此,该代码如上所述使任务3失败。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

假设你的脉冲按一个按钮的水平按下一个1个时钟宽的脉冲(边缘检测),那么你可能只有:

注意:需要通过初始或低电平有效复位来添加复位以将状态设置为S_IDLE。

SELECT x.*
  FROM my_table x
  JOIN my_table y
    ON y.category_id = x.category_id
   AND y.timestamp >= x.timestamp
 GROUP
    BY x.category_id,x.timestamp
HAVING COUNT(*) <= 2;