mikrocontroller.net

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


Autor: Hans Hirsch (hanshirsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity  RS232 is
  Generic ( Quarz_Taktfrequenz : integer   := 50000000;  -- Hertz               
            Baudrate : integer :=  5000000               -- Bits/Sec             
        );     

  Port ( TXD      : out  STD_LOGIC;           
         Taste    : in   STD_LOGIC_VECTOR(2 downto 0);           
         CLK      : in   STD_LOGIC);
end RS232;

architecture Behavioral of RS232 is

signal tx_start : std_logic := '0';
signal tx_busy  : std_logic := '0';
signal tx_data  : std_logic_vector  (7 downto 0) := "11110000";
signal txsr     : std_logic_vector  (9 downto 0); --:= "1111111111";      -- Startbit, 8 Datenbits, Stopbit
signal txbitcnt : integer range 0 to 10 := 10;
signal txcnt    : integer range 0 to (Quarz_Taktfrequenz/Baudrate);

begin 

-- Verwaltung
process begin
   wait until rising_edge(CLK);
   if (taste[0]='1') then -- Daten = 0x12
      tx_data <= x"12";
      tx_start <= '1';
   end if;
   if (taste[1]='1') then -- Daten = 0x34
      tx_data <= x"34";
      tx_start <= '1';
   end if;
   if (taste[2]='1') then -- Stoppen
      tx_start <= '0';
   end if;
end process;

-- Senden
process begin
   wait until rising_edge(CLK);
   if (tx_start = '1' and tx_busy = '0') then   -- dauernd senden, solange tx_start aktiv
      txcnt    <= 0;                            -- Zähler initialisieren         
      txbitcnt <= 0;                               
      txsr     <= '0' & tx_data & '1';          -- Startbit, 8 Datenbits, Stopbit      
  else
      if(txcnt < Quarz_Taktfrequenz/Baudrate) then            
         txcnt <= txcnt+1;
      else  -- nächstes Bit ausgeben              
         if (txbitcnt<10) then              
            txcnt    <= 0;              
            txbitcnt <= txbitcnt+1;              
            txsr     <= txsr(txsr'left-1 downto 0) & '1';  
         end if;         
      end if;      
  end if;
end process;

tx_busy <= '1' when (txbitcnt<10) else '0';
TXD <= txsr(txsr'left);

end Behavioral;

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

Autor: Hans Hirsch (hanshirsch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity  RS232 is
  Generic ( Quarz_Taktfrequenz : integer   := 50000000;  -- Hertz               
            Baudrate : integer :=  5000000               -- Bits/Sec             
        );     

  Port ( TXD      : out  STD_LOGIC;           
         Taste    : in   STD_LOGIC; -- ein Taster für Start+Stop          
         CLK      : in   STD_LOGIC);
end RS232;

architecture Behavioral of RS232 is

signal tastesr : std_logic_vector (15 downto 0) := (others=>'0'); -- für die Flankenauswertung

signal tx_start : std_logic := '0';
signal tx_busy  : std_logic := '0';
signal tx_data  : std_logic_vector  (7 downto 0) := "11110000";
signal txsr     : std_logic_vector  (9 downto 0); --:= "1111111111";      -- Startbit, 8 Datenbits, Stopbit
signal txbitcnt : integer range 0 to 10 := 10;
signal txcnt    : integer range 0 to (Quarz_Taktfrequenz/Baudrate);

begin 

-- Verwaltung
process begin
   wait until rising_edge(CLK);
   tastesr <= tastesr(14 downto 0) & taste; 
   if (tastesr=x"7FFF") then     -- steigende Flanke Taster
      tx_data <= x"12";
      if(tx_start = '1') then tx_start <= '0';
      else                    tx_start <= '1';
      end if;
   end if;
end process;

-- Senden  <-- bleibt alles gleich, nur die Verwaltung ist geändert
process begin
   wait until rising_edge(CLK);
   if (tx_start = '1' and tx_busy = '0') then   -- dauernd senden, solange tx_start aktiv
      txcnt    <= 0;                            -- Zähler initialisieren         
      txbitcnt <= 0;                               
      txsr     <= '0' & tx_data & '1';          -- Startbit, 8 Datenbits, Stopbit      
  else
      if(txcnt < Quarz_Taktfrequenz/Baudrate) then            
         txcnt <= txcnt+1;
      else  -- nächstes Bit ausgeben              
         if (txbitcnt<10) then              
            txcnt    <= 0;              
            txbitcnt <= txbitcnt+1;              
            txsr     <= txsr(txsr'left-1 downto 0) & '1';  
         end if;         
      end if;      
  end if;
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?

Autor: Hans Hirsch (hanshirsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, stimmt. danke. Ja, ich will sogar 5Mbit/s.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.