【问题标题】:Bits Not Shifting位不移位
【发布时间】:2021-03-26 18:11:03
【问题描述】:

我希望能够在每次按下按钮时创建从右到左的移位,但我的模拟显示我的位没有移位。

这是我写的代码:

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 的其余部分没有。我不明白为什么我的位没有移动。

【问题讨论】:

    标签: verilog bit-shift


    【解决方案1】:

    如果没有您没有提供的测试平台,很难测试您的代码,但我认为您重新发布的是对 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;
    

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

    【讨论】:

    • 谢谢 Serge 我对代码进行了一些编辑,代码确实发生了变化,但并没有像我预期的那样发生变化。它从 00000001111111 。我制作的版本是把 qIN 和 qOUT 变成简单的 q,并给它 [7:0] 而不是 [5:0] 。我想使用 qIN 和 qOUT 因为在我添加 qIN 和 qOUT 之前它只是 q,当我使用 6'b000000 启动 q 并进行代码移位时,我希望新的移位位是新的 q 而不是启蒙。我没有提供测试平台,因为我不知道它是什么。模拟是测试台吗?
    • testbench 只是一个在模拟中测试您的设计的代码。它提供输入数据(刺激)并检查模拟结果的正确性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多