www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Quelltext verkürzen VHDL


Autor: Toni Müller (Firma: Private) (toggle2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab ein Quelltext für die Ansteuerung eines Displays geschrieben. Dabei 
ist mir aufgefallen, dass dieser durch die Statemachine sehr lang ist. 
Kann man die Sache auch irgendwie verkürzen und vereinfachen, oder geht 
das nicht anders?

THX for your ideas

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

Bewertung
0 lesenswert
nicht lesenswert
Du könntest die Initialisierungssequenz incl. Steuersignale in ein 
konstantes Array stecken (das wird dann als ROM abgebildet) ...
  type Rom13x10 is array (0 to 12) of standard_logic_vector (9 downto 0); -- 8 Datenbits + 2 Steuerbits E und RS
LCDrom : Rom13x10 :=  (x"34"&'1'&'0',  -- Data(7..4)=0x3, Data(3..0)= 0x4, E=1, RS=0
                       x"34"&'0'&'0',
                       x"34"&'1'&'1',
                       x"34"&'0'&'1',
                       :
                       x"34"&'1'&'0');
... und das mit einem Integer-Index schrittweise nacheinander 
abarbeiten. Wie der Zugriff auf so ein ROM funktioniert, kannst du an 
meinem DDFS-Beispiel sehen: 
http://www.lothar-miller.de/s9y/categories/31-DDFS

Auf diese Art sollte der Quelltext auf eine Bildschirmseite zu 
reduzieren sein ;-)

BTW:
LCD_RW hängt statisch auf '0', das reicht, wenn es einmal gesetzt wird.
Allerdings würde ich das Toggeln des LCD_E abseits abhandeln.

Autor: toggle2 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetz einfach mal ein array programmiert, synthetisiert wird das 
schon, aber es kommen folgende Warnungen:

WARNING:Xst:790 - "C:/Users/Millers/Documents/Xilinx Projekte/display_01 
- Kopie/array/array/daten.vhd" line 34: Index value(s) does not match 
array range, simulation mismatch.

WARNING:Xst:1710 - FF/Latch <DOUT_int_1> (without init value) has a 
constant value of 0 in block <test_RAM>. This FF/Latch will be trimmed 
during the optimization process.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_2> 
(without init value) has a constant value of 0 in block <test_RAM>. This 
FF/Latch will be trimmed during the optimization process.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_3> 
(without init value) has a constant value of 0 in block <test_RAM>. This 
FF/Latch will be trimmed during the optimization process.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_5> 
(without init value) has a constant value of 0 in block <test_RAM>. This 
FF/Latch will be trimmed during the optimization process.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_7> 
(without init value) has a constant value of 0 in block <test_RAM>. This 
FF/Latch will be trimmed during the optimization process.

Woran könnte das denn liegen? Hab schon ein paar Sachen ausprobiert, 
aber irgendwie will die Sache nicht so laufen...

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

Bewertung
0 lesenswert
nicht lesenswert
> conv_integer(ADDR_int)
ADDR_int kann mit 3 Bits die Werte von 0 bis 7 annehmen. Nimm doch als 
Index einen integer range 0 to 4, dann passt das besser zum array.

> others => (x"00")
Die Klammern kannst du hier weglassen.

> ROM: process (takt, ADDR_int)
Hier reicht takt aus, der Prozess muß nicht neu berechnet werden, wenn 
sich ADDR_int ändert.

> (x"11", x"50", others => x"00")
Mit diesen Intitialwerten sind natürlich DOUT_int_2, 3, 5 und 7 immer 0. 
Das sagt dir der Synthesizer mit den Warnungen...

Autor: Toni Müller (Firma: Private) (toggle2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, jetzt hab ich es gerafft. Funktioniert jetzt ohne Warnungen.

Wie kann ich denn die jeweiligen Adressen des array in der Statemachine 
ansprechen und auf die Ausgänge zuweisen und dadurch den Quelltext 
verkürzen?

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

Bewertung
0 lesenswert
nicht lesenswert
Nimm mal diesen Code, leg mit einer simplen Testbench einen 50MHz-Takt 
an, und sieh dir an, was herauskommt (als Tipp: mindestens 15 ms laufen 
lassen):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity LCD_Controller_16x2 is
    Port ( -- Signale an LCD
           rw   : out  STD_LOGIC;
           rs   : out  STD_LOGIC;
           en   : out  STD_LOGIC;
           dout : out  STD_LOGIC_VECTOR(7 downto 0);
          -- der Takt
           clk  : in  STD_LOGIC
          );
end LCD_Controller_16x2;

architecture Behavioral of LCD_Controller_16x2 is
type ramtyp is array (0 to 31) of std_logic_vector(11 downto 0); -- "00" & Delayzeit & RS Steuerbit & 8 Datenbits
signal ram : ramtyp := ( "0010" & x"f2",
                         "0000" & x"f3",
                         "0011" & x"f4",
                         "0001" & x"f5",
                         "0000" & x"e6",
                         "0000" & x"e7",
                         "0001" & x"e8",
                         "0001" & x"e9",
                         "0000" & x"da",
                         "0000" & x"db",
                         "0000" & x"dc",
                         "0001" & x"dd",
                         "0001" & x"ce",
                         "0000" & x"cf",
                         "0000" & x"c1",
                         "0000" & x"c2",
                         "0000" & std_logic_vector(to_unsigned(character'pos('h'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos('a'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos('l'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos('l'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos('o'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos(' '),8)),
                         "0001" & std_logic_vector(to_unsigned(character'pos('w'),8)),
                         "0001" & std_logic_vector(to_unsigned(character'pos('e'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos('l'),8)),
                         "0000" & std_logic_vector(to_unsigned(character'pos('t'),8)),
                         "0001" & std_logic_vector(to_unsigned(character'pos('!'),8)),
                         others => ("0000" & std_logic_vector(to_unsigned(character'pos('#'),8)))
                       );

constant fosc      : integer := 50000000; 
signal   pre1us    : integer range 0 to fosc/1000000 := 0; 
constant longtime  : integer := 5000;  --  5 ms
constant shorttime : integer := 20;    -- 20 us
signal   delay     : integer range 0 to longtime := 0; 
signal   index     : integer range 0 to 31 := 0; 
begin

   process begin
      wait until rising_edge(clk);
      if (pre1us<fosc/1000000) then
         pre1us <= pre1us+1;
      else -- 1us vorbei
         pre1us <= 0;
         if (delay<1) then en<='1';  -- 1us Latency --> tsu für Adressen
         else              en<='0'; 
         end if;
         if ( (ram(index)(9)='1' and delay=longtime) or (ram(index)(9)='0' and delay=shorttime) ) then
            delay <= 0;
            if (index<31) then index <= index+1; end if;
         else 
            delay <= delay+1;
         end if;
      end if;
      if (index=31) then en <= '0'; end if; -- fertig, kein enable mehr ausgeben
   end process;
   
   dout <= ram(index)(dout'range);
   rs   <= ram(index)(8);
   rw   <= '0';
   
end Behavioral;
Wenn du das dann so in etwa nachvollzogen hast, ist deine Frage 
automatisch beantwortet ;-)

BTW: die ganzen Hex-Werte müssen noch an das Display angepasst werden...

Autor: Toni Müller (Firma: Private) (toggle2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay, werd mich mal da rein arbeiten, thx

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.