pc-com: geht jetzt zumindest mit minicom auch.
authorBernhard Urban <lewurm@gmail.com>
Thu, 27 May 2010 23:28:21 +0000 (01:28 +0200)
committerBernhard Urban <lewurm@gmail.com>
Thu, 27 May 2010 23:28:21 +0000 (01:28 +0200)
trotzdem ein komisches verhalten (bei minicom als auch bei cat):
- eine rechnung eingeben
- dumpen -> ausgabe wie erwartet
- 2xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- 3xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- 4xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- 5xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- zweite rechnung eingeben
- dumpen -> ausgabe wie erwartet
- 2xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- 3xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- 4xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- dritte rechnung eingeben
- dumpen -> ausgabe wie erwartet
- 2xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- 3xdumpen -> erstes zeichen der ersten berechnung fehlt (sonst wie erwartet)
- usw...

das erste zeichen fehlt wirklich immer nur bei der ersten berechnung (das is
kein C/P-fehler)!

=> fehler in der state-maschine? aber wo? :(

TODO:
- bug finden, vllt mit simulation

logic elements atm: 2971

spec/speck.tex
src/pc_communication.vhd

index 238fc36ce9a78d816b336d94f623ae9027e9ff98..fe2bf7e6d3616ebfa3a29fae9a5150ff55f698f8 100644 (file)
@@ -632,8 +632,8 @@ wirklich $\Rightarrow$ Tonne
 ebenfalls so breit wie \emph{p\_zeile} sein (zumindest vereinfacht das die
 Implementierung)
 \item RS232: \emph{tx\_done} hinzugefuegt.
-\item PC-Kommunikation: auch die aktuelle Eingabe wird gesendet.
+\item PC-Kommunikation: der gesamte RAM fuer die berechnungen wird immer
+gedumpt. Auch wird der Dump bei einem beliebigen Zeichen gesendet, da es mit
+\emph{0x0a} nicht mit jedem Terminal funktionierte.
 \end{itemize}
-
 \end{document}
-
index 8a29ba7976e6b6c802c7a372b6e6800c91ecec7d..290f1fd1914104add23882c7ca13fcd662324270 100644 (file)
@@ -36,7 +36,7 @@ architecture beh of pc_communication is
        type STATE_PC is (IDLE, FETCH, FORWARD, UART_DONE, CR, CR_WAIT,
                NL, NL_WAIT, PRINT_NO1, PRINT_NO1_WAIT, PRINT_NO2, PRINT_NO2_WAIT,
                PRINT_NO3, PRINT_NO3_WAIT, PRINT_NO4, PRINT_NO4_WAIT, PRINT_NO5,
-               PRINT_NO5_WAIT, PRINT_NO6, PRINT_NO0_WAIT);
+               PRINT_NO5_WAIT, PRINT_NO6);
        signal state, state_next : STATE_PC ;
 begin
        pc_zeile <= hzeile(std_logic_vector(to_unsigned(zeile,7)));
@@ -80,14 +80,11 @@ begin
                state_next <= state;
                case state is
                        when IDLE =>
-                               if (rx_new = '1' and rx_data = x"0a") or btn_a = '0' then
-                                       state_next <= PRINT_NO0_WAIT;
-                               end if;
-
-                       when PRINT_NO0_WAIT =>
-                               if tx_done_i = '0' then
+                               --if (rx_new = '1' and rx_data = x"0a") or btn_a = '0' then
+                               if (rx_new = '1' or btn_a = '0') and tx_done_i = '0' then
                                        state_next <= PRINT_NO1;
                                end if;
+
                        when PRINT_NO1 =>
                                tx_data_i_next <= x"28"; -- '('
                                new_i_next <= '1';
@@ -179,7 +176,9 @@ begin
                                        state_next <= NL_WAIT;
                                end if;
                        when NL_WAIT =>
-                               state_next <= CR;
+                               if tx_done_i = '0' then
+                                       state_next <= CR;
+                               end if;
                        when CR =>
                                tx_data_i_next <= x"0d";
                                new_i_next <= '1';
@@ -187,13 +186,15 @@ begin
                                        state_next <= CR_WAIT;
                                end if;
                        when CR_WAIT =>
-                               tmp := std_logic_vector(to_unsigned(zeile,7));
-                               if tmp(0) = '0' then
-                                       -- es handelt sich um eingabe im naechsten schritt
-                                       -- => print zeilennummer
-                                       state_next <= PRINT_NO0_WAIT;
-                               else
-                                       state_next <= FETCH;
+                               if tx_done_i = '0' then
+                                       tmp := std_logic_vector(to_unsigned(zeile,7));
+                                       if tmp(0) = '0' then
+                                               -- es handelt sich um eingabe im naechsten schritt
+                                               -- => print zeilennummer
+                                               state_next <= PRINT_NO1;
+                                       else
+                                               state_next <= FETCH;
+                                       end if;
                                end if;
                                if zeile = HZEILE_MAX then
                                        state_next <= IDLE;