Счетчик задержек не увеличивается? FSM

#verilog #fpga #vlsi

Вопрос:

Я писал код для регистра DAC, и требуется задержка. Однако в состоянии задержки DAC_counter_2 значение не увеличивается, и задержка не достигается. Я скопировал код в другой проект и попытался проверить. Проблема все еще существует. Любая помощь была бы очень кстати.

 module dac_card
(   output reg DAC_SCLK,
    output reg SYNC,
    output reg SDIN,
    input MHZ_50_CLK,
    input RST,
    output reg [7:0] DAC_counter_1,
    output reg [7:0] DAC_counter_2
    );
    
    reg [7:0] pst_state, nxt_state;
    
    reg [23:0] DAC_reg;
    
    always @(posedge MHZ_50_CLK)
    begin
        if (RST)
        begin
            DAC_reg <= 24'hEEEEEE;
            SYNC <= 1'b1;
            DAC_SCLK <= 1'b0;
            SDIN <=1'b0;
            DAC_counter_1 <= 8'd0;
            DAC_counter_2 <= 8'd0;
            pst_state <= 8'd0;
        end
        else
        begin
            pst_state <= nxt_state;
            DAC_counter_1 <= DAC_counter_1   1'b1;
        end
    end
    
    always @(pst_state or DAC_counter_2)
    begin
        case (pst_state)
            8'd0            :   begin
                                    if (DAC_counter_2 == 8'd24)
                                    begin
                                        DAC_counter_2 = 8'd0;
                                        SYNC = 1'b1;
                                        SDIN = 1'b0;
                                        nxt_state = 8'd2;
                                    end
                                    else
                                    begin
                                        SYNC = 1'b0;
                                        DAC_SCLK = 1'b1;
                                        DAC_counter_2 = DAC_counter_2   1'b1;
                                        SDIN = DAC_reg [23];                         //Writing DAC register
                                        DAC_reg = DAC_reg << 1;
                                        nxt_state = 8'd1;
                                    end
                                end
            8'd1            :   begin
                                    DAC_SCLK = 1'b0;
                                    nxt_state = 8'd0;
                                end
            8'd2            :   begin
                                    if (DAC_counter_2 == 8'd10)                      //Minimum delay for SYNC to be low for write mode
                                    begin
                                        SYNC = 1'b1;
                                        DAC_counter_2 = 8'd0;
                                        nxt_state = 8'd3;
                                    end
                                    else
                                    begin
                                        SYNC = 1'b0;
                                        //Not incrementing
                                        DAC_counter_2 = DAC_counter_2   1'b1;
                                    end                                   
                                end
            8'd3            :   begin
                                    nxt_state = 8'd0;
                                end
            default         :   begin
                                    nxt_state = 8'd0;
                                end
        endcase
    end
endmodule
 

Вот испытательный стенд

 module test_bench
();
//Analog Card DAC wires and registers
    reg MHZ_50_CLK;
    reg RST;
    wire DAC_SCLK;
    wire SYNC;
    wire SDIN;
    wire [7:0] DAC_counter_1;
    wire [7:0] DAC_counter_2;
    
    //Instatntiate DAC
    dac_card dc (.DAC_SCLK(DAC_SCLK),
                 .SYNC(SYNC),
                 .SDIN(SDIN),
                 .MHZ_50_CLK(MHZ_50_CLK),
                 .RST(RST),
                 .DAC_counter_1(DAC_counter_1),
                 .DAC_counter_2(DAC_counter_2)
                 );
    initial
    begin
        MHZ_50_CLK = 1'b0;
        #10 RST = 1'b1; 
        #20 RST = 1'b0;
    end
    
    always
    begin
        #10 MHZ_50_CLK <= ~MHZ_50_CLK;
    end
endmodule
 

Вот форма сигнала. После 24 отсчетов DAC_counter_2 задержка для 8’d10 не достигается.

введите описание изображения здесь

Ответ №1:

Вам необходимо выполнить назначение nxt_state во всех разделах вашего case заявления. Это также позволяет избежать вывода о непреднамеренных защелках. Например, обратитесь к строке // MISSING nxt_state = ниже:

         8'd2            :   begin
                                if (DAC_counter_2 == 8'd10)                      //Minimum delay for SYNC to be low for write mode
                                begin
                                    SYNC = 1'b1;
                                    DAC_counter_2 = 8'd0;
                                    nxt_state = 8'd3;
                                end
                                else
                                begin
                                    SYNC = 1'b0;
                                    //Not incrementing
                                    DAC_counter_2 = DAC_counter_2   1'b1;
                                    //  MISSING nxt_state =
                                end                                   
                            end
 

Как показывают ваши волны, как только вы входите в состояние 2, вы остаетесь в состоянии 2. Поскольку DAC_counter_2 в состоянии 2 не 10, вы всегда выполняете else предложение, которое не меняется nxt_state .


Есть пара других проблем, которые также могут вызывать проблемы.

Хорошие методы кодирования рекомендуют назначать a reg из одного always блока. DAC_counter_2 назначается в 2 разных блоках.

Кроме того, один и тот же сигнал не должен появляться как на LHS, так и на RHS задания в комбинационном always блоке, поскольку он создает петлю обратной связи. Например, DAC_counter_2 = DAC_counter_2 1 вероятно, должно быть в последовательном always блоке, например DAC_counter_1 .