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
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?
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
> 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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.