Verilog, FPGA, wykorzystanie rejestru jednostkowego
Mam pytanie dotyczące tego, co wydaje mi się dziwne zachowanie kontrolera AGC / SPI, nad którym pracuję. Zostało to zrobione w Verilog, a jego celem jest FPGA Xilinx Spartan 3e. Sterownik to FSM, który uruchamia zewnętrzne wejścia. Stan FSM jest przechowywany wstate_reg który nie jest jawnie zainicjowany, ponieważ myślałem, że niezainicjowany rejestr będzie domyślnie zerowy. Kiedy zaimplementowałem kontroler, FSM nie uruchomiłby się. Monitorując magistralę SPI nie zaobserwowałem żadnej aktywności. Aby monitorować FSM, skierowałemstate_reg do magistrali wyjściowej, która trafiła do banku LED. To jest ta liniaprzypisz data_out = state_reg to robi. Odkryłem jednak, że kiedy to zrobiłem, FSM kontroler AGC / SPI działał poprawnie, jak zaobserwowano na magistrali SPI. Wydaje się, że dzieje się takstate_reg jest w stanie nieokreślonym, kiedy inicjuje, a zatem FSM nigdy nie jest w żadnym stanie, więc nie działa. Ale przypisującstate_reg do wyjścia, które zostało zainicjowane00000000 tak jak oczekiwałem od początku. Więc moje pytanie brzmi, czy niezainicjowany rejestr powinien przyjmować wartość 0? Przez przypisanie niezainicjowanego rejestru do wyjścia, czy to wymusza na nim przyjęcie zera, jak się wydawało? Czy może dzieje się coś jeszcze, czego nie rozumiem? Poniżej znajduje się mój kod. Skomentowałem odpowiednią część, do której przypisano * state_reg **przewód wyjściowy [7: 0] data_out. Wiem, że to długie pytanie, ale naprawdę próbuję zrozumieć, jakiego rodzaju zachowania powinienem się spodziewać. Dzięki.
<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>