【问题标题】:Write a Verilog code that only has an output when enabled编写启用时只有输出的 Verilog 代码
【发布时间】:2016-12-08 22:24:08
【问题描述】:

我正在创建一个具有 4 个空的 4 位寄存器的寄存器文件,并且在每个时钟周期,一个寄存器获取一个推送到其上的值,然后使用 7 段解码器显示该值。如果寄存器为空,则不应该有显示,但是一旦将值加载到寄存器中,则应该有显示。我尝试为 7 段解码器编写 verilog 代码,如果 En = 1,则应该只有输出。我的问题是,7 段解码器不会显示任何内容,而是显示零,直到将值添加到寄存器中,在在这种情况下,解码器将显示加载的值。这是verilog代码。

module seven_seg_decoder(S, Z, Y, X, W,En);
input Z,Y,X,W,En; 
output [6:0] S;
reg [6:0] S;

always @(En)
    begin
        case({Z,Y,X,W,En})
            5'b00001: S = 'b0000001;
            5'b00011: S = 'b1001111;
            5'b00101: S = 'b0010010;
            5'b00111: S = 'b0000110;
            5'b01001: S = 'b1001100;
            5'b01011: S = 'b0100100;
            5'b01101: S = 'b0100000;
            5'b01111: S = 'b0001111;
            5'b10001: S = 'b0000000;
            5'b10011: S = 'b0000100;
            5'b10101: S = 'b0001000;
            5'b10111: S = 'b1100000;
            5'b11001: S = 'b0110001;
            5'b11011: S = 'b1000010;
            5'b11101: S = 'b0110000;
            5'b11111: S = 'b0111000;

        endcase
    end
endmodule

当寄存器加载一个值时,我有一个来自寄存器的输出表明它已加载,并且用作此解码器上启用的输入

【问题讨论】:

    标签: verilog quartus seven-segment-display


    【解决方案1】:

    查看您列举的{Z, Y, X, W, En} 的可能编码:

    5'b00001: S = 'b0000001;
    5'b00011: S = 'b1001111;
    5'b00101: S = 'b0010010;
    5'b00111: S = 'b0000110;
    5'b01001: S = 'b1001100;
    5'b01011: S = 'b0100100;
    5'b01101: S = 'b0100000;
    5'b01111: S = 'b0001111;
    5'b10001: S = 'b0000000;
    5'b10011: S = 'b0000100;
    5'b10101: S = 'b0001000;
    5'b10111: S = 'b1100000;
    5'b11001: S = 'b0110001;
    5'b11011: S = 'b1000010;
    5'b11101: S = 'b0110000;
    5'b11111: S = 'b0111000;
    //     ^ Look here
    

    En 的所有值都是1!如果En0,你从来没有告诉模块该怎么做。它不知道要关闭显示。在这种情况下,你需要给它一些事情做。

    你有几个选择:

    简单的解决方案
    您可以添加一个默认子句,在所有未枚举的情况下使显示空白:

     default: S = 'b0000000; //change to whatever means "turn everything off"
    

    不必要的复杂解决方案
    您可以通过使用 5'bxxxx0 作为子句和 casex 语句来获得更精确:

    casex ({Z,Y,X,W,En})
        // all other enumerated cases
        5'bxxxx0: S = 'b0000000; //change to "everything off"
        default:  S = 'b0000000; //change to "everything off"
    

    但是要知道casex 存在一些潜在的陷阱,可能会使其难以正确使用并导致令人惊讶的行为。另请注意,这最终与第一个简单的解决方案相同。我暂时避开它。

    (我的)首选解决方案

    这实际上与前两个相同,但我认为意图更加明确:

    always @(*)
        begin
            if (!En)
                S = 'b0000000; // change to "everything off"
    
            else
                case({Z,Y,X,W,En})
                    5'b00001: S = 'b0000001;
                    5'b00011: S = 'b1001111;
                    5'b00101: S = 'b0010010;
                    5'b00111: S = 'b0000110;
                    5'b01001: S = 'b1001100;
                    5'b01011: S = 'b0100100;
                    5'b01101: S = 'b0100000;
                    5'b01111: S = 'b0001111;
                    5'b10001: S = 'b0000000;
                    5'b10011: S = 'b0000100;
                    5'b10101: S = 'b0001000;
                    5'b10111: S = 'b1100000;
                    5'b11001: S = 'b0110001;
                    5'b11011: S = 'b1000010;
                    5'b11101: S = 'b0110000;
                    5'b11111: S = 'b0111000;
                    default: S = 'b0000000; // change to some error code
                endcase       
        end
    

    此解决方案的优点是您的代码目标更加明确:如果En 不正确,则其余信号无关紧要。我们清除显示。其他解决方案也会发生这种情况,但是这种结构使正在发生的事情变得更加明显。

    这里的default 案例在技术上是不必要的。不应该有任何En 为真但未枚举的情况。但是要输入很多数字。如果你打错了,在这些情况下,有一个强制显示错误的默认设置(可能只是 7seg 显示的中心线?)将帮助你识别错误。

    其他几点说明:

    1. 您应该避免使用XZ 作为变量名。他们可能会因为“不关心”和“高阻抗”而感到困惑。它使代码比需要的更难遵循。

    2. 我已经更改了您的敏感度列表。 Greg correctly pointed out,如果您希望在输入 WXYZ 更改时正确更新输出,则需要在它们更改时触发 always 块。 * 运算符将告诉 Verilog 编译器根据 always 块的内容推断正确的敏感度列表。 (请注意,这不会查看任务或功能来确定敏感度列表。)

    3. 我强烈建议您将所有位模式放在parameters 中,以使您的代码更具可读性。

    【讨论】:

    • 我明白你在说什么,但是如果我确实放入了你提到的子句,那不是仍然显示 8 吗?默认原因创建与案例 5'b10001 相同的输出
    • 对不起,我不小心按了太快了。我编辑了评论
    • 我不知道你的输出编码是什么。将其更改为“不显示任何内容”
    • 抱歉,我一直在看这个,我只是假设其他人会知道它的一切。非常感谢
    • ZYXW需要成为敏感列表的一部分;否则模拟和综合将有不同的行为。将always @(En) 更改为always @(*)
    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多