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


von 123 (Gast)


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;

von Daniel R (Gast)


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!

von 123 (Gast)


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;

von Daniel R (Gast)


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!

von 123 (Gast)


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.

von Daniel R (Gast)


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!

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