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;
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!
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;
<"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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.