Вопрос по – Verilog, FPGA, использование унифицированного регистра

3

У меня есть вопрос о том, что мне кажется странным поведением контроллера AGC / SPI, над которым я работаю. Это сделано в Verilog, нацелено на Xilinx Spartan 3e FPGA. Контроллер - это FSM, для запуска которого используются внешние входы. Состояние автомата хранится вstate_reg который явно не инициализирован, так как я думал, что неинициализированный регистр по умолчанию будет равен нулю. Когда я внедрил контроллер, FSM не работал. Контролируя шину SPI, я не наблюдал активности. Для мониторинга FSM я направилstate_reg к выходной шине, которая пошла в банк светодиодов. Это то, что линияassign data_out = state_reg делается. Однако я обнаружил, что когда я делал это, FSM контроллер AGC / SPI работал правильно, как это наблюдалось на шине SPI. Кажется, что происходит то, чтоstate_reg находится в неопределенном состоянии, когда он инициализируется, и, следовательно, FSM никогда не находится в каком-либо состоянии, поэтому он не работает. Но, назначивstate_reg к выходу он инициализирован00000000 как я и ожидал, с самого начала. Итак, мой вопрос, должен ли неинициализированный регистр принимать значение 0? Присваивая неинициализированный регистр выходу, это заставляет его принимать ноль, как казалось? Или что-то еще здесь происходит, что я не понимаю? Ниже мой код. Я прокомментировал соответствующую часть, где * state_reg ** назначенoutput wire [7:0] data_out, Я знаю, что это длинный вопрос, но я действительно пытаюсь понять, какой тип поведения мне следует ожидать. Благодарю.

<code>  module agc_control
        (
            input wire [7:0] agc_data,
            input wire clk,
            input wire agc_start,
            input wire AMP_DO,
            output reg MOSI,
            output reg SCK,
            output reg CS_AMP,
            output wire inhibit_ADC,
            output wire [7:0] data_out  
         );

        //signals
        reg [4:0] state_reg,
        reg [2:

0] ampclkreg;
    reg ampclk;
    reg [7:0] agc_data_reg;
    reg agc_running;
    reg [7:0] data_out_reg;
    wire agc_done;




    //ampclk generation
    always @(posedge clk)
        begin
            ampclkreg = ampclkreg + 1;
            if (ampclkreg == 3)
                begin
                    ampclkreg = 0;
                    ampclk = ~ampclk;
                end
        end

    always @(posedge clk)
        begin
            if(agc_start == 1)
                begin
                    agc_running = 1'b1;
                    agc_data_reg = agc_data;
                end
            if(agc_done == 1)
                begin
                    agc_running = 1'b0;
                end
        end



    //FSM
    always @(posedge ampclk)
        begin
            if (agc_running == 0)
                begin
                    SCK = 0;
                    state_reg = 0;
                    CS_AMP = 1;
                end
            if (agc_running == 1)
                begin
                    case (state_reg)
                        0:  begin
                                CS_AMP = 1;
                                SCK = 0;
                                state_reg = 1;
                            end
                        1:  begin
                                CS_AMP = 0;
                                MOSI = agc_data_reg[7];
                                state_reg = 2;
                            end
                        2:  begin
                                SCK = 1;
                                state_reg = 3;
                            end
                        3:  begin
                                SCK = 0;
                                MOSI = agc_data_reg[6];
                                state_reg = 4;
                            end
                        4:  begin
                                SCK = 1;
                                state_reg = 5;
                            end
                        5:  begin
                                SCK = 0;
                                MOSI = agc_data_reg[5];
                                state_reg = 6;
                            end
                        6:  begin
                                SCK = 1;
                                state_reg = 7;
                            end
                        7:  begin
                                SCK = 0;
                                MOSI    = agc_data_reg[4];
                                state_reg = 8;
                            end
                        8:  begin
                                SCK = 1;
                                state_reg = 9;
                            end
                        9:  begin
                                SCK = 0;
                                MOSI = agc_data_reg[3];
                                state_reg = 10;
                            end
                        10:begin
                                SCK = 1;
                                state_reg = 11;
                            end
                        11:begin
                                SCK = 0;
                                MOSI = agc_data_reg[2];
                                state_reg = 12;
                            end
                        12:begin
                                SCK = 1;
                                state_reg = 13;
                            end
                        13:begin
                                SCK = 0;
                                MOSI = agc_data_reg[1];
                                state_reg = 14;
                            end
                        14:begin
                                SCK = 1;
                                state_reg = 15;
                            end
                        15:begin
                                SCK = 0;
                                MOSI = agc_data_reg[0];
                                state_reg = 16;
                            end
                        16:begin
                                SCK = 1;
                                state_reg = 17;
                            end
                        17:begin
                                CS_AMP = 1;
                                state_reg = 18;
                            end
                        18:begin
                                SCK = 0;
                                state_reg = 19;
                            end
                        19:begin
                                state_reg = 19;
                            end
                    default: state_reg = 19;
                endcase
            end
        end

    //retrieve previous vlaues
    always @(posedge clk)
    begin
        case(state_reg)
            2: begin
                    if (ampclkreg == 2)             
                        data_out_reg[7] = AMP_DO;
                end
            4: begin
                    if (ampclkreg == 2)
                        data_out_reg[6] = AMP_DO;
                end
            6: begin 
                    if (ampclkreg == 2)
                        data_out_reg[5] = AMP_DO;
                end
            8:  begin
                    if (ampclkreg == 2)
                        data_out_reg[4] = AMP_DO;
                end
            10:begin
                    if (ampclkreg == 2)
                        data_out_reg[3] = AMP_DO;
                end
            12:begin
                    if (ampclkreg == 2)
                        data_out_reg[2] = AMP_DO;
                end
            14:begin
                    if (ampclkreg == 2)
                        data_out_reg[1] = AMP_DO;
                end
            16:begin
                    if (ampclkreg == 2)
                        data_out_reg[0] = AMP_DO;
                end

        endcase
    end


    //output wire [7:0] data_out--to top module to drive 7 LEDs and display state_reg
    assign data_out =  state_reg;

    assign agc_done = (state_reg == 19);
    assign inhibit_ADC = (agc_running == 1);


    endmodule
</code>
Для проектов FPGA всегда, всегда, всегда инициализируйте свои регистры. Nathan Farrington
Получаете ли вы такие же странные результаты при инициализации регистров? Мне все еще интересно, что может быть причиной этого странного поведения - обычно, если вы не укажете, инструменты по умолчанию будут равны 0, я думаю. Josh

Ваш Ответ

2   ответа
0

value of 0?

Noони предполагают х. Для синтеза вы должны сбросить, поскольку они могут содержать любое значение. У меня нет опыта работы с ПЛИС, но Натан Фаррингтон предполагает, что они также сбрасываются / инициализируются.

Для ПЛИС достаточно сделать следующее:

reg [4:0] state_reg = 'b0,

Для синтеза я бы порекомендовал сделать это внутри пункта сброса.

always @(posedge clk or negedge reset) begin
  if (!reset) begin
    state_reg <= 'b0 ;
  end
  else begin
    ..
  end
end
10

linx); Я не согласен с ответом Тима.

Когда FPGA запрограммирована и инициализирована,many внутренние ресурсы инициализируются в известное состояние. Это включает в себя все шлепки и блок-бараны. Добавив логику сброса настроек в свой дизайн, выmay сделать это значительно сложнее, чем нужно, если бы вы могли рассчитывать на внутренние элементы, инициализирующиеся в известное состояние. Сети сброса с большим разветвлением могут значительно усложнить реализацию вашего проекта для маршрутизатора, а преобразование вашего проекта в слои также усложняется выбором сброса - особенно асинхронным.

Мои предложения:

Use initialization values for your registers. Double check Xilinx XST documentation for the version you are using for supported syntax. Contrary to widely held belief, initialization values will be honored in most cases. The side benefit of doing this, is that the initial state of your chip will match the initial state of your simulation. Only reset necessary control signals and leave your datapath registers alone to allow more efficient mapping (for example, a pipeline into a shift register).
Вы делаете хорошее замечание, я не осознавал, что значение по умолчанию широко поддерживается в ПЛИС. Я позволил своему опыту ASIC омрачить мое мнение :)
Для справки, это также описано в Белой книге Xilinx:xilinx.com/support/documentation/white_papers/wp272.pdf

Похожие вопросы