> 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?