位不移位

问题描述

我希望每次按下按钮时都能从右向左移动,但我的模拟显示我的位没有移动。

这是我写的代码

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 来指示范围。所以,我的猜测是您至少有几个问题:

  1. 缺少开始/结束:if (KEY0 == 1) begin...end
  2. 非阻塞/非阻塞分配的错误组合
  3. 锁存器编码不正确
  4. 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;

由于你没有提供任何测试平台,我没有测试代码。