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

#system #quartus #digital

#verilog #system-verilog #quartus #цифровой

Вопрос:

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

Ответ №1:

Есть что-то, что связано с AC и Set .

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

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

Комментарии:

1. можете ли вы показать мне небольшой пример этого? Я не могу продумать логику этого

2. @Hieu Не могли бы вы опубликовать свой тестовый стенд? Или опишите синхронизацию переменного тока и Set. Потому что эти 2 управляющих сигнала важны и выводятся за пределы вашего модуля.