系统Verilog HDL-4位输入逻辑计算器

问题描述

我正在尝试设计一个可以加,乘,除,...的逻辑计算器 但是当我尝试在DE 10板上运行它时,我停留在1个部分,尽管它不符合我的逻辑 我的逻辑是,当count = 0时,操作数A将为HEX 4,5,count = 1 DoOpt将为2,并且count = 2操作数B将以HEX 1,0显示,然后将重置计数。但是,当我运行它时,它仅显示操作数B。您能为我弄清楚我的代码有什么问题吗?

module group_project (
    input logic clk,Set,AC,input logic [3:0] Operand,input logic [2:0] DoOp,output logic [6:0] Seg5,Seg4,Seg3,Seg2,Seg1,Seg0
);
    logic [1:0] count;
    always_ff@(posedge clk) begin
        if(!AC) begin
            Seg5 = 7'b000_1000;
            Seg4 = 7'b000_0110;
            Seg3 = 7'b000_1000;
            Seg2 = 7'b100_0000;
            Seg1 = 7'b001_0001;
            Seg0 = 7'b011_1111;
            count <= 2'b00;
        end
        if(!Set && count == 2'b00) begin
        count <= count + 1;
            Seg3 = 7'b111_1111;
            Seg2 = 7'b111_1111;
            Seg1 = 7'b111_1111;
            Seg0 = 7'b111_1111;

            if(Operand < 4'b1010) begin
                Seg5 = 7'b100_0000;
                case (Operand)
                    4'b0000: Seg4 = 7'b100_0000;
                    4'b0001: Seg4 = 7'b111_1001;
                    4'b0010: Seg4 = 7'b010_0100;
                    4'b0011: Seg4 = 7'b011_0000;
                    4'b0100: Seg4 = 7'b001_1001;
                    4'b0101: Seg4 = 7'b001_0010;
                    4'b0110: Seg4 = 7'b000_0010;
                    4'b0111: Seg4 = 7'b111_1000;
                    4'b1000: Seg4 = 7'b000_0000;
                    4'b1001: Seg4 = 7'b001_0000;
                endcase
            end
            else begin
                Seg5 = 7'b111_1001;
                case (Operand)
                    4'b1010: Seg4 = 7'b100_0000;
                    4'b1011: Seg4 = 7'b111_1001;
                    4'b1100: Seg4 = 7'b010_0100;
                    4'b1101: Seg4 = 7'b011_0000;
                    4'b1110: Seg4 = 7'b001_1001;
                    4'b1111: Seg4 = 7'b001_0010;
                endcase
            end
        end

        
         if(!Set && count == 2'b01) begin   
         count <= count + 1;
            Seg5 = 7'b111_1111;
            Seg4 = 7'b111_1111;
            Seg3 = 7'b111_1111;
            Seg1 = 7'b111_1111;
            Seg0 = 7'b111_1111;

            
            case(DoOp)
                3'b001: Seg2 = 7'b111_1001;
                3'b010: Seg2 = 7'b010_0100;
                3'b011: Seg2 = 7'b011_0000;
                3'b100: Seg2 = 7'b001_1001;
                3'b101: Seg2 = 7'b001_0010;
            endcase 
        end

        

        
        /*else if(!Set && count == 2'b10) begin
            Seg5 = 7'b111_1111;
            Seg4 = 7'b111_1111;
            Seg3 = 7'b111_1111;
            Seg2 = 7'b111_1111;
            count <= count;
            if(Operand < 4'b1010) begin
                Seg1 = 7'b100_0000;
                case (Operand)
                4'b0000: Seg0 = 7'b100_0000;
                4'b0001: Seg0 = 7'b111_1001;
                4'b0010: Seg0 = 7'b010_0100;
                4'b0011: Seg0 = 7'b011_0000;
                4'b0100: Seg0 = 7'b001_1001;
                4'b0101: Seg0 = 7'b001_0010;
                4'b0110: Seg0 = 7'b000_0010;
                4'b0111: Seg0 = 7'b111_1000;
                4'b1000: Seg0 = 7'b000_0000;
                4'b1001: Seg0 = 7'b001_0000;
                endcase
            end
            else begin
                Seg1 = 7'b111_1001;
                case (Operand)
                4'b1010: Seg0 = 7'b100_0000;
                4'b1011: Seg0 = 7'b111_1001;
                4'b1100: Seg0 = 7'b010_0100;
                4'b1101: Seg0 = 7'b011_0000;
                4'b1110: Seg0 = 7'b001_1001;
                4'b1111: Seg0 = 7'b001_0010;
                endcase
            end
        end
    end
endmodule

解决方法

ACSet有关。

如果AC仅用作初始复位,并且在此之后Set一直为低电平,则count最终将保持在2。它仅持续1 clk count = 0和1的周期。因此,只要clk足够快,您就不会注意到count = 0和1,并且只会看到count = 2状态。

也许您需要定期取消声明AC,并控制Set以查看每个count状态的转变。