Gast
#895299
Ich bin gerade dabei Verilog zu lernen. Leider scheine ich dafuer wohl zu doof zu sein. Jedenfalls popel ich hier bereits seit einer Woche damit rum einen SPI-Bus zu implementieren, etwas das ich in C vermutlich in 1-2min runterschreiben koennte. Eniviroment: Xilinx Webpack8.2, Demoboard mit XC3S100E, mehrere Taste(entprellt), LEDs, diverse IO-Ports... SPI_CLK gewinne ich ueber einen Teiler aus einem 33Mhz Quarz und betraegt momentan 1Hz. Waer nett wenn da mal einer drueber schauen koennte und mir sagt wo der Fehler liegt. reg [3:0] state, next_state; parameter S_0 = 4'b0000, S_1 = 4'b0001, S_2 = 4'b0010, S_3 = 4'b0011, S_4 = 4'b0100, S_5 = 4'b0101, S_6 = 4'b0110, S_7 = 4'b0111; reg [7:0] tmp; integer bitcounter; //Ausgabe eines Datenbit und generierung des notwendigen Clocks //Ausserdem bei Reset das Datenregister initialisieren always@(state) begin case (state) S_0 : begin tmp <= {tmp[6:0],MAX_DOUT}; next_state <= S_1; end S_1 : begin clockout <= 1'b1; //Clock auf HighPegel next_state <= S_7; end S_2 : begin clockout <= 1'b0; //Clock auf Low bitcounter = bitcounter +1; if (bitcounter == 7) next_state <= S_7; else next_state <= S_0; end S_6 : begin tmp <= 8'b10101010; //Bei Reset Kommandowort laden bitcounter = 0; next_state <= S_0; //Statemachine starten end S_7 : begin //Wir sind fertig next_state <= S_7; end endcase end assign Led1 = tmp[7]; assign Led2 = !clockout; //Haelt unser Statemachine in Schwung always @(posedge SPI_CLK) begin if (Taste1 == 1'b1) //Das ist erstmal unsere Resettaste begin state <= S_6; // tmp <= 8'b10101010; end else begin state <= next_state; //Statemachine triggern end end Meine Vorstellung ist das das Programm beim druecken von 'Taste1' die Statemachine bei S6 startet, den Vorgabewert ins Register laedt, die einzelnen Bits ausgibt und dazu jeweils einen Clock generiert. Danach sollte die UEbertragung anhalten. Passieren tut folgendes: Nach dem reinladen des Programms in den FPGA werden unendlich viele Clockimpulse ausgeben, aber kein Registerinhalt. Druecke ich Taste1 stoppt die Ausgabe der Clockimpulse, laesst man los werden sie wieder erzeugt. Aber sie hoeren halt nicht auf. Dabei sollte die Statemachine doch irgendwann mal anhalten. Ausserdem wird entweder mein Vorgabewerte nicht uebernommen, oder es wird nicht geshiftet. Es sieht so aus als wenn nur S1 und S2 in einer Endlosschleife abgearbeitet werden. Warum ist das so? Irgendwie muss ich da was entscheidendes in der Logic von Verilog nicht verstanden haben. Olaf