system verilog HDL - 4-битный логический калькулятор ввода

Я пытаюсь разработать логический калькулятор, который может складывать, умножать, делить, ... но я застрял на 1 части, когда пытаюсь запустить его на плате DE 10, он не действует как логика, хотя моя логика что, когда count = 0, операнд A будет иметь шестнадцатеричное значение 4,5, а count = 1 DoOpt будет иметь значение 2, а операнд count = 2 будет отображаться в шестнадцатеричном формате 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

person Hieu    schedule 18.09.2020    source источник


Ответы (1)


Это как-то связано с AC и Set.

Если AC используется только в качестве начального сброса, а после этого Set будет постоянно низким, то count, наконец, останется на 2. Он длится всего 1 clk цикл для count = 0 и 1. Так что, пока clk достаточно быстро, вы мы не сможем заметить count = 0 и 1 и увидим только состояние count = 2.

Возможно, вам нужно периодически отключать AC и контролировать Set, чтобы видеть переход каждого состояния count.

person Light    schedule 18.09.2020
comment
Можете ли вы показать мне небольшой пример этого? Я не могу понять логику этого - person Hieu; 20.09.2020
comment
@Hieu Не могли бы вы опубликовать свой тестовый стенд? Или опишите тайминги AC и Set. Потому что эти 2 управляющих сигнала важны и управляются за пределами вашего модуля. - person Light; 20.09.2020