Forum: FPGA, VHDL & Co. UART - Signal in Schleife ausgeben


von Hans H. (hanshirsch)


Angehängte Dateien:

Lesenswert?

Hallo ich möchte ein UART-Signal nach betätigen eines Tasters auf dem 
Spartan 3A-Starterkit bis zum nochmaligen betötigen eines anderen oder 
auch desselebn Tasters in einer Schleife ausgeben. Könnte mir da jemand 
anhand dem Quellcode helfen. Habe schon alles mögliche probiert.
Danke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich würde das RS232-Modul als Komponente in eine übergeordnete 
Verwaltung einbinden, die die Tasterabfrage und Datenverwaltung macht. 
So wie du es gerade machst, wird das unnötig unübersichtlich   :-/


Aber wenns unbedingt sein muss...
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity  RS232 is
6
  Generic ( Quarz_Taktfrequenz : integer   := 50000000;  -- Hertz               
7
            Baudrate : integer :=  5000000               -- Bits/Sec             
8
        );     
9
10
  Port ( TXD      : out  STD_LOGIC;           
11
         Taste    : in   STD_LOGIC_VECTOR(2 downto 0);           
12
         CLK      : in   STD_LOGIC);
13
end RS232;
14
15
architecture Behavioral of RS232 is
16
17
signal tx_start : std_logic := '0';
18
signal tx_busy  : std_logic := '0';
19
signal tx_data  : std_logic_vector  (7 downto 0) := "11110000";
20
signal txsr     : std_logic_vector  (9 downto 0); --:= "1111111111";      -- Startbit, 8 Datenbits, Stopbit
21
signal txbitcnt : integer range 0 to 10 := 10;
22
signal txcnt    : integer range 0 to (Quarz_Taktfrequenz/Baudrate);
23
24
begin 
25
26
-- Verwaltung
27
process begin
28
   wait until rising_edge(CLK);
29
   if (taste[0]='1') then -- Daten = 0x12
30
      tx_data <= x"12";
31
      tx_start <= '1';
32
   end if;
33
   if (taste[1]='1') then -- Daten = 0x34
34
      tx_data <= x"34";
35
      tx_start <= '1';
36
   end if;
37
   if (taste[2]='1') then -- Stoppen
38
      tx_start <= '0';
39
   end if;
40
end process;
41
42
-- Senden
43
process begin
44
   wait until rising_edge(CLK);
45
   if (tx_start = '1' and tx_busy = '0') then   -- dauernd senden, solange tx_start aktiv
46
      txcnt    <= 0;                            -- Zähler initialisieren         
47
      txbitcnt <= 0;                               
48
      txsr     <= '0' & tx_data & '1';          -- Startbit, 8 Datenbits, Stopbit      
49
  else
50
      if(txcnt < Quarz_Taktfrequenz/Baudrate) then            
51
         txcnt <= txcnt+1;
52
      else  -- nächstes Bit ausgeben              
53
         if (txbitcnt<10) then              
54
            txcnt    <= 0;              
55
            txbitcnt <= txbitcnt+1;              
56
            txsr     <= txsr(txsr'left-1 downto 0) & '1';  
57
         end if;         
58
      end if;      
59
  end if;
60
end process;
61
62
tx_busy <= '1' when (txbitcnt<10) else '0';
63
TXD <= txsr(txsr'left);
64
65
end Behavioral;

BTW:
1
signal tx_testvariable : std_logic := '0';     -- Variable für Automaischen Startprozess
Das ist keine Variable, sondern ein Signal  :-/
Du solltest einen passenden Namen verwenden...

>> fest einstellbare Bits zur Übertragung
Fest und einstellbar?

von Hans H. (hanshirsch)


Lesenswert?

Danke, aber ich bekomme nun folgende Fahlermeldung:

Ich habe für start einen Taster verwendet.

ERROR:ConstraintSystem:59 - Constraint <NET "taste" LOC = "T15" |>
ERROR:ConstraintSystem:59 - Constraint <IOSTANDARD = LVCMOS33 |>
ERROR:ConstraintSystem:59 - Constraint <PULLDOWN ;> 
[Constraints.ucf(10)]: NET

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>   Taste    : in   STD_LOGIC_VECTOR(2 downto 0);
Taste ist bei meinem Code ein Vektor aus 3 Eingängen.

>> bis zum nochmaligen betötigen eines anderen oder
>> auch desselebn Tasters in einer Schleife ausgeben.
Ah, ok, ich habe was übersehen: desselebn
Das heisst vermutlich des selben.
Demnach muß der Code für die Verwaltung etwas angepasst werden, du 
brauchst eine Flankenauswertung für den Taster.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity  RS232 is
6
  Generic ( Quarz_Taktfrequenz : integer   := 50000000;  -- Hertz               
7
            Baudrate : integer :=  5000000               -- Bits/Sec             
8
        );     
9
10
  Port ( TXD      : out  STD_LOGIC;           
11
         Taste    : in   STD_LOGIC; -- ein Taster für Start+Stop          
12
         CLK      : in   STD_LOGIC);
13
end RS232;
14
15
architecture Behavioral of RS232 is
16
17
signal tastesr : std_logic_vector (15 downto 0) := (others=>'0'); -- für die Flankenauswertung
18
19
signal tx_start : std_logic := '0';
20
signal tx_busy  : std_logic := '0';
21
signal tx_data  : std_logic_vector  (7 downto 0) := "11110000";
22
signal txsr     : std_logic_vector  (9 downto 0); --:= "1111111111";      -- Startbit, 8 Datenbits, Stopbit
23
signal txbitcnt : integer range 0 to 10 := 10;
24
signal txcnt    : integer range 0 to (Quarz_Taktfrequenz/Baudrate);
25
26
begin 
27
28
-- Verwaltung
29
process begin
30
   wait until rising_edge(CLK);
31
   tastesr <= tastesr(14 downto 0) & taste; 
32
   if (tastesr=x"7FFF") then     -- steigende Flanke Taster
33
      tx_data <= x"12";
34
      if(tx_start = '1') then tx_start <= '0';
35
      else                    tx_start <= '1';
36
      end if;
37
   end if;
38
end process;
39
40
-- Senden  <-- bleibt alles gleich, nur die Verwaltung ist geändert
41
process begin
42
   wait until rising_edge(CLK);
43
   if (tx_start = '1' and tx_busy = '0') then   -- dauernd senden, solange tx_start aktiv
44
      txcnt    <= 0;                            -- Zähler initialisieren         
45
      txbitcnt <= 0;                               
46
      txsr     <= '0' & tx_data & '1';          -- Startbit, 8 Datenbits, Stopbit      
47
  else
48
      if(txcnt < Quarz_Taktfrequenz/Baudrate) then            
49
         txcnt <= txcnt+1;
50
      else  -- nächstes Bit ausgeben              
51
         if (txbitcnt<10) then              
52
            txcnt    <= 0;              
53
            txbitcnt <= txbitcnt+1;              
54
            txsr     <= txsr(txsr'left-1 downto 0) & '1';  
55
         end if;         
56
      end if;      
57
  end if;
58
end process;

Aber ab jetzt darfst du selber mitdenken... :-/

Was mir z.B. zum Denken gibt, ist das hier:
   Baudrate : integer :=  5000000
Willst du wirklich 500 kBit/s?

von Hans H. (hanshirsch)


Lesenswert?

Ah ja, stimmt. danke. Ja, ich will sogar 5Mbit/s.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.