Verilog, FPGA, Verwendung eines einheitlichen Registers

Ich habe eine Frage zum merkwürdigen Verhalten eines AGC / SPI-Controllers, an dem ich arbeite. Es wird in Verilog ausgeführt und zielt auf ein Xilinx Spartan 3e-FPGA ab. Der Controller ist ein FSM, dessen Start von externen Eingängen abhängt. Der Status des FSM wird in gespeichertstate_reg Das ist nicht explizit initialisiert, da ich dachte, ein nicht initialisiertes Register würde standardmäßig auf Null gesetzt. Als ich den Controller implementierte, lief der FSM nicht. Bei der Überwachung des SPI-Busses habe ich keine Aktivität festgestellt. Um den FSM zu überwachen, habe ich denstate_reg zu einem Ausgangsbus, der zu einer LED-Bank ging. Das ist was die Linieweisen Sie data_out = state_reg zu macht. Ich stellte jedoch fest, dass bei dieser Ausführung der FSM ein AGC / SPI-Controller korrekt funktionierte, wie auf dem SPI-Bus beobachtet. Es scheint, dass das, was passiert, das iststate_reg befindet sich bei der Initialisierung in einem unbestimmten Zustand und daher befindet sich der FSM nie in einem Zustand, sodass er nicht ausgeführt wird. Sondern durch Zuweisungstate_reg auf einen Ausgang, auf den es initialisiert wurde00000000 wie ich es von Anfang an erwartet hatte. Meine Frage ist also, soll ein nicht initialisiertes Register den Wert 0 annehmen? Erzwingt dies durch Zuweisen eines nicht initialisierten Registers zu einem Ausgang die Annahme von Null, wie es schien? Oder ist hier noch etwas los, was ich nicht verstehe? Unten ist mein Code. Ich habe den relevanten Teil kommentiert, dem * state_reg ** zugewiesen istAusgangskabel [7: 0] data_out. Ich weiß, dass dies eine lange Frage ist, aber ich versuche wirklich zu verstehen, welche Art von Verhalten ich erwarten sollte. Danke.

<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>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage