www.mikrocontroller.net

Forum: FPGA, VHDL & Co. array (0 to 639,0 to 489) ist nicht syntesefähig


Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Bin vhdl anfänger und will auf einem vga monitor daten anzeigen. dazu
mach ich ein "array (0 to 639,0 to 489) of std_logic_vector (1 DOWNTO
0)" ich kann es aber nicht syntesieren. ich benuetze mentorgrafics
Precision auf einem spartan 2. bin um jede hilfe dankbar.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

ENTITY ram_sym IS
   PORT(
      sys_clk        : IN     std_logic;
      reset          : IN     std_logic;
      l_avarage      : IN     std_logic_vector (8 DOWNTO 0);
      l_colume       : IN     std_logic_vector (8 DOWNTO 0);
      l_new_data_clk : IN     std_logic;
      r_avarage      : IN     std_logic_vector (8 DOWNTO 0);
      r_colume       : IN     std_logic_vector (8 DOWNTO 0);
      r_new_data_clk : IN     std_logic;
      colum          : IN     std_logic_vector ( 9 DOWNTO 0 );
      line           : IN     std_logic_vector ( 8 DOWNTO 0 );
      pixel          : OUT    std_logic_vector ( 1 DOWNTO 0 )
   );

-- Declarations

END ram_sym ;

--
ARCHITECTURE behav OF ram_sym IS
   type  MEMORY is array (0 to 639,0 to 489) of std_logic_vector (1
DOWNTO 0);
               --column , line
  Signal colum_ram: MEMORY;
  Signal colour: std_logic_vector (1 DOWNTO 0);


BEGIN
 colour<="01";
 process(sys_clk,reset)
     begin
      if(reset='0') then
         for line_ctr in 0 to 489 loop
          for columne_ctr in 0 to 639 loop

colum_ram(conv_integer(columne_ctr),conv_integer(line_ctr))<="00";
          end loop;
        end loop;




      elsif (sys_clk = '1'and sys_clk'event)then
        colum_ram(conv_integer(l_colume),conv_integer(l_avarage(8
downto 1)))<=colour;
        colum_ram(conv_integer(r_colume),(conv_integer(r_avarage(8
downto 1))+233))<=colour;
        pixel<=colum_ram(conv_integer(colum),conv_integer(line));


      else

      end if;

  end process;



END ARCHITECTURE behav;

Autor: Daniel R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du dir wirklich sicher, dass du einen 1278-Bit(0 to 639 of SLV 1
downto 0) breiten Array anlegen willst???
Ich glaube, du willst eher sowas hier:
signal XXX : Integer Range 0 to 639;

Vergiss das am Besten mit den Arrays.
Du kommst aus der C-Ecke...hab ich recht???  ;)

Gruß Daniel!

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich komm aus der c ecke. das blockramm war zu klein. nun hab ich ne
neue frage: man kann ja nicht gleichreitig in ein blockram schreiben
und lesen. kan ich nun bei rising edge lesen und bei fallender
schreiben  wie in folgendem code?

TYPE MEM IS ARRAY(0 to 480) of std_logic_vector(8 downto 0);
signal ram_block: MEM;

begin

read: process (clk)
begin
 if rising_edge(clk) then
  if (read_en='1') then
   data_out<=ram_block(conv_integer(unsigned(readaddr)));
  end if;
 end if;
end process;

write: process(clk)
begin
 if falling_edge(clk) then
  if (write_en='1') then
   ram_block(conv_integer(unsigned(writeaddr)))<=data_in;
  end if;
 end if;
end process;

Autor: Daniel R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<"das blockramm war zu klein">
Aha, deswegen die vielen Arrays.
Dein Code würde schon laufen, nur man macht sowas eigentlich nicht. Das
kann Timingprobleme geben. Man versucht normalerweise immer nur mit
einer Taktflanke zu arbeiten, dann gibts keine Probleme.
Du kannst ja den Takt verdoppeln und einfach bei jeder steigenden
Flanke eine Operation ausführen.

Hast du wirklich den ganzen Blockram voll???

Das mit den Arrays von den Bildschirmcountern würde ich auf jeden Fall
mit Signalen machen.
Wenn du willst, kann ich dir ein 640*480*60Hz Timing zur Verfügung
stellen. Man muss dabei aufpassen, dass man das Timing zu 100%
einhält...sonst kann der Monitor schaden nehmen.


Gruß Daniel!

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das timing fuer den vga ausgang hab ich schon, geht auch. das problem
ist wo soll amn die daten des monitors abspeichern? wie machst du das?

zu meinem projekt: ein digi oszi 2 kanal. ich will es so machen :
2*  490 gemittelte werte im blockram gespeichert
meine vga lib gibt immer den pixel und die spalte auch und hat als
eingang einen 2 bit farbwert.
ein anderer block schaut ob die pixel und der ram-inhalt
uebereinstimmen und gibt dann wenn ja ein pixel aus.

Autor: Daniel R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bis jetzt habe ich eigentlich nur mal das Timing und ein paar
Buchstaben, die auf dem Schirm stehen. Ich wollte auch ein Oszi damit
erreichen, hab aber grad ein wichtiges Projekt am Laufen und hab somit
keine Zeit.
Bisher hab ich eigentlich nur eine Case Anweisung, die die
Bildschirmcounter abfragt. Wenn diese bestimmte Werte haben, wird halt
was ausgegeben....
Weiter bin ich eben noch nicht.

Aber so wie du das machst ist ok. Habs am Anfang falsch verstanden. Ich
dachte du willst mit den Arrays nur das Timing realisieren.

So wie du hab ich mir das auch ungefähr vorgestellt, nur dass ich
definitiv den Blockram/bzw. ein externes RAM verwenden will.
Mein FPGA (Spartan3 XC3S200) hat genug BlockRAM um ein paar Schirme
anzusteuern ;)

Leider kann ich dir zu deinem konkreten Problem, dass der Code sich
nicht synthetisieren lässt nicht helfen, da ich ebenfalls Anfänger bin
und auf die Schnelle nicht weiß, an was es liegt. Ich schau den Code
morgen mal genauer an und sag dir Bescheid.
Ansonsten ist das wohl ein Fall für die VHDL-Profis hier im Forum ;)


Gruß Daniel!

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.