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>