VHDL LCD Display - Modelēšana kļūdu izmantojot XILINX ISE

P

Peter_L

Guest
Hello All,

Man šobrīd ir Spartan3A DDR2 Development Kit.Es cenšos radīt VHDL kodu, lai ieslēgtu vienu LED no (0) LED ar LED (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Vēss" border="0" />

un displejs ziņojumu LCD ekrāns everytime kombinācija slēdži toggled switch (0) pāriet (2).Es, izmantojot vairākus process ir, bet es regulāri saņemt kļūda, kad es imitēšanai.Es esmu mēģinājis daudz veidu, kā atbrīvoties no šo kļūdu, bet nothign AHS strādāja.Es ceru, ka kāds var palīdzēt!Piestiprinātas priekšstatu par modelēšanas kļūdas un VHDL kodu.

Kods:

bibliotēka IEEE;

izmantot IEEE.STD_LOGIC_1164.ALL;

izmantot IEEE.STD_LOGIC_ARITH.ALL;

izmantot IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment šādu bibliotēka deklarāciju, ja instantiating

---- Jebkurā XILINX primitīvu šajā kodā.

- bibliotēka UNISIM;

- izmantot UNISIM.VComponents.all;vienība dekoders ir

Osta (sel: in STD_LOGIC_VECTOR (2 downto 0); - selektora slēdzi, ko izmanto, lai pārslēgtos LED

y: out STD_LOGIC_VECTOR (0 7 downto), - izeja uz 8 LEDs

LCD_DB: inout std_logic_vector (7 downto 0): = "00.000.000";

LCD_RWS: inout std_logic_vector (1 downto 0): = "00";

LCD_E: out STD_LOGIC: = '0 ');

end decoder;

-------------------------------------------------- -------------------------------------------------arhitektūra Uzvedības no dekodera ir

signālu lcd_clr_s, lcd_e_disable_s: std_logic: = '0 ';

sāktdecoder: process (SEL)

sākt

ja sel ir

ja "000" => y <= "00.000.001";

ja "001" => y <= "00.000.010";

ja "010" => y <= "00.000.100";

ja "011" => y <= "00.001.000";

ja "100" => y <= "00.010.000";

ja "101" => y <= "00.100.000";

ja "110" => y <= "01.000.000";

kad citi => y <= "10000000";

end gadījumā;

lcd_clr_s <= nav lcd_clr_s;

end process decoder;

--------------------------------------------lcd_clr: process (lcd_clr_s)

sākt

lcd_rws <= "00"; - Clear LCD displejs

lcd_e <= '1 ';

lcd_db <= "00000001";lcd_e_disable_s <= nav lcd_e_disable_s;

end process lcd_clr;

--------------------------------------------------

lcd_e_disable: process (lcd_e_disable_s)

sāktlcd_e <= '0 ';

lcd_db <= "00000000";end process lcd_e_disable;end arhitektūra uzvedības;
 
Ekrāna attēls izskatās ļoti pazīstams.Vai jūs joprojām mēģina atrisināt uninitialized "X" valsti?
http://www.edaboard.com/viewtopic.php?t=296876

Jums nav parādījis pietiekamu kodu reproducēt imitācijai, vai pietiekami simulācija izsekot, kāpēc divus signālus mainīts uz "X".I'm guessing vaininieks ir augstāka līmeņa moduli vai izmēģinājumu stenda.

 
Hi Echo, es esmu joprojām mēģina atrisināt manu problēmu.Es paņēmu savu padomu un kam piešķirts sākotnējās vērtības manā vhdl kodu uzvedības mans FPGA, bet tas neatrisināja problēmu.Es piešķiršu testbench kodu, kas XILINX ISE radušies.Lūdzu, dariet man zināmu, ja jūs redzat kaut ko nepareizi.

Kods:

bibliotēka IEEE;

izmantot IEEE.STD_LOGIC_1164.ALL;

izmantot IEEE.STD_LOGIC_ARITH.ALL;

izmantot IEEE.STD_LOGIC_UNSIGNED.ALL;

LIETOŠANAS IEEE.STD_LOGIC_TEXTIO.ALL;

LIETOŠANAS STD.TEXTIO.ALL;PERSONA decoder_tb2 IS

END decoder_tb2;ARHITEKTŪRA testbench_arch OF decoder_tb2 IS

FILE REZULTĀTI: Teksts OPEN WRITE_MODE IR "results.txt";COMPONENT dekodētājs

PORT (

sel: In std_logic_vector (2 DownTo 0);

y: Out std_logic_vector (0 7 DownTo);

LCD_DB: InOut std_logic_vector (7 DownTo 0);

LCD_RWS: InOut std_logic_vector (1 DownTo 0);

LCD_E: Out std_logic

);

END DETAĻAS;SIGNAL sel: std_logic_vector (2 DownTo 0): = "000";

SIGNAL y: std_logic_vector (7 DownTo 0): = "00.000.000";

SIGNAL LCD_DB: std_logic_vector (7 DownTo 0): = "ZZZZZZZZ";

SIGNAL LCD_RWS: std_logic_vector (1 DownTo 0): = "ZZ";

SIGNAL LCD_E: std_logic: = '0 ';BEGIN

UUT: dekodētājs

PORT MAP (

sel => sel,

y => y,

LCD_DB => LCD_DB,

LCD_RWS => LCD_RWS,

LCD_E => LCD_E

);PROCESS

BEGIN

- ------------- Current Time: 600ns

Pagaidiet 600 ns;

sel <= "001";

- -------------------------------------

- ------------- Current Time: 1200ns

Pagaidiet 600 ns;

sel <= "011";

- -------------------------------------

- ------------- Current Time: 1300ns

Pagaidiet 100 ns;

sel <= "010";

- -------------------------------------

Pagaidiet 1.700 ns;END PROCESS;END testbench_arch;
 
Es tagad var vairoties problēmu.Es neesmu ļoti labi VHDL, bet es domāju, ka es redzu vaininieks...
and lcd_e_disable_s
change simultaneously, so the two processes are simultaneously trying to update lcd_e
and lcd_db
with unequal values.

Signals lcd_clr_s
un lcd_e_disable_s
mainīt vienlaicīgi, lai abi procesi vienlaicīgi mēģinot atjaunināt lcd_e
un lcd_db,
nevienlīdzīgu vērtībām.No konflikta rezultāts ir "X", nezināma valsts.

Es nevaru ieteikt labu risinājumu, jo es nezinu, kā šie dažādie signāli vajadzība rīkoties jūsu pieteikumu.Varbūt kāds cits zina LCD laiku.

 
Thanks again Echo savu atbildi, es noteikti appreciate your help.

Ko jūs sakāt, ir jēga, bet man ir izstrādātas procedūras tā, lai katrs izpilda secīgi.Kāpēc gan "lcd_clr" un "lcd_e_disable" procesu vada simultaniously?Vai tas notiek laikā pirmās sērijas, kad signāli "lcd_clr_s" un "lcd_e_disable_s" ir inicializēts, tādējādi izraisot gan procesus palaist simultanioiusly?

Ja jā, tad kā es varu apiet šo problēmu?Palīdzību no personām, ieskats par šo problēmu, būtu ļoti appreciated.

Arī es labprāt vēlētos redzēt paraugu VHDL kods rakstīts, lai parādītu uz LCD displeja.Mana metode nedrīkst būt visefektīvākais, tomēr tas ir, kā es domāju to darbu.Ja kādam ir, lūdzu, nosūtiet to šeit.

 
Sveiki,

lai jums saku patiesību, es nevaru iedomāties, ka jūsu veidā radīt LCD kontroles signāliem varētu kādreiz strādāt, ne simulācija, ne synthesizable ccode.

and you can't have a timing without a clock that schedules a sequence of control signals.

Vienkārša lieta ir: LCD kontrolieris nepieciešams laiks
un to nevar būt laiku bez pulksteņa, ka grafiki secības kontroles signāliem.

Parasti būtu jābūt pamata pulksteni, automāts un kavēšanos novērstu, ka valstīm nepieciešams paplašināt, intervāls definēts datsheet.

Es neesmu vēl neizmanto LCD kontrolieris ar FPGA, tāpēc es nevaru sniegt jums piemērs kodu.
Dit jūs pārbaudāt forums līdzīgas tēmas ar risinājums?

Sveicieni,
Frank

 
Es piekrītu FVM bažas.Kopējais asinhronais dizains šķiet aizdomīgs, bet man likās, ka LCD laika signālus var nāk no ne-rāda ārējo sequencer ar I / O ports.Bet, ja tā nav taisnība, tad tur nekādi projektēšanas darba laiku.Labākais veids, kā izstrādāt projektu, kā tas ir ar clocked sinhrono loģiku.
and lcd_e_disable_s
.

Divi procesi ir izraisījusi pārmaiņas signāliem lcd_clr_s
un lcd_e_disable_s.Šie signāli toggle vienlaicīgi (skatīt manu ModelSim valodās), tāpēc abu procesu palaist vienlaicīgi.

Kādu laiku atpakaļ, es uzrakstīju vienkāršu jēlnaftas Verilog (nav VHDL) moduli, kas rāda "Hello World!"par LUMEX LCM-S01602DTR / M LCD, kas ir izmantota dažās XILINX attīstības dēļi.Es nezinu, vai ka LCD ir līdzīga jūsu LCD, bet varbūt mans kods palīdzēs jums.Tas ir pie grunts šo ļoti ilgām diskusijām:
ftopic202710.html # 852.813

 
Thanks guys.Man bija iespēja atrast VHDL kods rakstīts, lai parādītu uz LCD.Es to izmantoja kā rokasgrāmatai, kas izskaidro dažas echo47 koncepcijas un FVM runāja iepriekš.

Esmu pievienots šeit, lai ikvienam, kas ir ieinteresēts.
Atvainojiet, bet jums ir nepieciešams autorizēties, lai skatītu šo pielikumu

 
Pateicoties palīdzību daudzi cilvēki šajā valdē, esmu gandrīz pabeidza savu pirmo FPGA projektu.Vēl viens šķērslis, un es esmu pie finiša līniju.

I have created VHDL kodu, lai parādītu uz LCD.Es uzskatu, ka ir laika jautājums manu kodu, bet es pārbaudīju ar diviem dažādiem LCD lapas un laiks, šķiet, atbilst (es strādāju ar Spartan3A DDR2 Dev kit).Modelēšana rāda, ka manā koda loģika ir labi.Esmu pavadīja dažas dienas mēģina salabot šo problēmu un centās daudzas lietas, bet man vēl nav bijusi veiksmīga, tāpēc es ceru kāds šeit ar pieredzi, var man palīdzēt.Attached ir pirmkodu VHDL.

PS.Es esmu ievērojis, ka ir kaut kas ko sauc f_osc no 250kHz robežās LCD datu lapās.No f_osc skaidrojums nav ļoti labs.Ja f_osc var ietekmēt manu kodu kādā veidā?Ja tas tā ir, var kāds paskaidrot f_osc?

Kods:

bibliotēka IEEE;

izmantot IEEE.STD_LOGIC_1164.ALL;

izmantot IEEE.STD_LOGIC_ARITH.ALL;

izmantot IEEE.STD_LOGIC_UNSIGNED.ALL;--------------------------------------

vienība LED_LCD_Display ir

--------------------------------------

Ostas

(

CLK: in std_logic - 50 Mhz pulksteņa signālu- LCD_Display procesu, ko izmanto ostas

--------------------------------------

LCD_RWS: inout std_logic_vector (1 downto 0); - LCD RWS in / out

LCD_DB: inout std_logic_vector (7 downto 0); - LCD produkcija DB (0 - 7)

LCD_E: inout std_logic) - LCD Ieslēgt

gada beigām uzņēmumam LED_LCD_Display;-----------------------------------------

arhitektūra RTL of LED_LCD_Display ir

------------------------------------------ Sākums "LCD_DISPLAY" Process konstantes

-----------------------------------------------

konstante delay_40ms: integer: = 8000000; - 40ms kavēšanos pieņemot 50MHz clokc (> 2000000 50MHz clk)

konstante delay_37us: integer: = 2000000; - Pagaidiet, kad minimālā 37us (> 1850), pieņemot, 50MHz Pulkstenis

konstante delay_1d52ms: integer: = 2000000; - minimālais waith laiks 1.52ms (> 76.000), pieņemot, 50MHz pulksteni

konstante delay_4d1ms: integer: = 2000000; - Pagaidiet vairāk nekā 4.1ms (> 205000) (pēc pirmā funkcija komplektā)

konstante delay_tr: integer: = 10; - rada termiņa nokavējumu "LCD_E" max 20ns (> 1 for 50MHz clk) (OV 2)

konstante delay_tpw: integer: = 100; - ir laiks ar "E" augsts min 230ns (> 12 50MHz clk) (OV 7)

konstante delay_tf: integer: = 10; - uz laiku atlikt uz signālu "LCD_E" max 20ns (> 1 for 50MHz clk) (OV 2)

konstante delay_th: integer: = 2; - Datu turēt laika signāls "LCD_db" min uz 10ns (= 1 50MHz clk) (OV 1)- Sākums "LCD_DISPLAY" Process izmantoti mainīgie un signāli

-------------------------------------------------- ------------

tips State_type is (Boot FunctionSet, FunctionSetTwo, FunctionSetThree, Display, DisplayClr, EntryModeSet, WriteChar, HomeCursor, EndState);

signāls valsts: State_type: = Boot;

signāls count_LCD: integer robežās no 0 līdz delay_40ms: = 0;

signāls count_Char: integer: = 0; - Counter, uz kuras parādās zīmes- LCD instrukcijas, ko izmanto "LCD_DISPLAY" process

-------------------------------------------------- ------------

konstante off_DB: std_logic_vector (7 downto 0): = "00.000.000";

konstante off_RWs: std_logic_vector (1 downto 0): = "00";konstante functionset_DB: std_logic_vector (7 downto 0): = "00.111.100";

konstante functionset_RWS: std_logic_vector (1 downto 0): = "00";konstante Display_DB: std_logic_vector (7 downto 0): = "00.001.111";

konstante Display_RWS: std_logic_vector (1 downto 0): = "00";konstante DisplayClr_DB: std_logic_vector (7 downto 0): = "00.000.001";

konstante DisplayClr_RWS: std_logic_vector (1 downto 0): = "00";konstante EntryModeSet_DB: std_logic_vector (7 downto 0): = "00.000.111";

konstante EntryModeSet_RWS: std_logic_vector (1 downto 0): = "00";konstante HomeCursor_DB: std_logic_vector (7 downto 0): = "00.000.010";

konstante HomeCursor_RWS: std_logic_vector (1 downto 0): = "00";konstante WriteChar_RWS: std_logic_vector (1 downto 0): = "10";

signāls WriteChar_DB: std_logic_vector (7 downto 0): = "00.000.000";sāktLCD_display: process (clk)sākt

ja rising_edge (clk), tadlietu stāvoklis

kad Boot => - jāgaida 40ms

ja count_LCD <delay_40ms tam

count_LCD <= count_LCD 1;

elsif count_LCD> = delay_40ms tam

Valsts <= FunctionSet;

count_LCD <= 0;

beidzas, ja;kad FunctionSet => - Set funkcija

lcd_rws <= functionset_rws;

lcd_db <= functionset_db;

ja count_LCD <delay_37us tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_37us tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_37us delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_37us delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= FunctionSetTwo;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad FunctionSetTwo => - Komplekti Function atkal

lcd_rws <= functionset_rws;

lcd_db <= functionset_db;

ja count_LCD <delay_4d1ms tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_4d1ms tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_4d1ms delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_4d1ms delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= FunctionSetThree;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad FunctionSetThree => - Komplekti Function atkal

lcd_rws <= functionset_rws;

lcd_db <= functionset_db;

ja count_LCD <delay_4d1ms tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_4d1ms tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_4d1ms delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_4d1ms delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= Display;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;ja displejs =>

lcd_rws <= display_rws;

lcd_db <= display_db;

ja count_LCD <delay_4d1ms tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_4d1ms tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_4d1ms delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_4d1ms delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= DisplayClr;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad DisplayClr =>

lcd_rws <= DisplayClr_RWS;

lcd_db <= DisplayClr_DB;

ja count_LCD <delay_37us tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_37us tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_37us delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_37us delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= EntryModeSet;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad EntryModeSet =>

lcd_rws <= EntryModeSet_RWS;

lcd_db <= EntryModeSet_DB;

ja count_LCD <delay_1d52ms tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_1d52ms tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_1d52ms delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_1d52ms delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= HomeCursor;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad HomeCursor =>

lcd_rws <= HomeCursor_RWS;

lcd_db <= HomeCursor_DB;

ja count_LCD <delay_1d52ms tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_1d52ms tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_1d52ms delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_1d52ms delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

Valsts <= WriteChar;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad WriteChar =>

lieta count_Char ir - Izvēlas kas ASCII rakstzīme rakstīt LCD

ja 0 =>

writeChar_DB <= "01001000", - ASCII ar "H"

kad 1 =>

WriteChar_DB <= "01100101", - ASCII ar "e"

ja 2 =>

WriteChar_DB <= "01101100", - ASCII par "l"

kad 3 =>

WriteChar_DB <= "01101100", - ASCII par "l"

ja 4 =>

WriteChar_DB <= "01101111", - ASCII ar "o"

kad 5 =>

WriteChar_DB <= "01001110", - ASCII pēc "N"

ja 6 =>

WriteChar_DB <= "01111001", - ASCII ar "y"

Kad 7 =>

WriteChar_DB <= "01110100", - ASCII ar "t"

ja 8 =>

WriteChar_DB <= "01110010", - ASCII ar "r"

kad 9 =>

WriteChar_DB <= "01101001", - ASCII ar "i"

kad citi =>

WriteChar_DB <= "01100011", - ASCII ar "c"

end gadījumā count_Char;lcd_rws <= WriteChar_RWS;

lcd_db <= WriteChar_DB;

ja count_LCD <delay_1d52ms tam

count_LCD <= count_LCD 1;

elsif count_LCD = delay_1d52ms tam

lcd_e <= '1 ';

count_LCD <= count_LCD 1;

elsif count_LCD = delay_1d52ms delay_tr delay_tpw tam

lcd_e <= '0 ';

count_LCD <= count_LCD 1;

elsif count_LCD> delay_1d52ms delay_tr delay_tpw delay_tf delay_th tam

count_LCD <= 0;

count_Char <= count_Char 1;

Valsts <= WriteChar;

ja count_Char> = 10, tad

Valsts <= EndState;

beidzas, ja;

citādi

count_LCD <= count_LCD 1;

beidzas, ja;kad EndState =>end gadījumā stāvoklī;

beidzas, ja;

end process lcd_display;end RTL;

 
Čau

Es cenšos izmantot VHDL tiktu rādīta no 3E Spartan LCD.Priecātos, ja Pēteris vai kāds var dot man resursus pārāk.Pateicība.

 
Hello Drifterz,

Patiešām labs resurss meklē hte datu lapu uz LCD displeja.Tas iet pa secības komandas, kas vajadzīgi, lai parādītu uz LCD.Spartan3A izmanto Sitronix ST7066U LCD displeja draiveris.Man ir paraugs VHDL kodu iepriekšējās atbildēs, kas sniedz jums idejas, kā rakstīt komandas LCD.

Diemžēl es neesmu labākā persona runāt, jo mans kods nav konsekventi displeju LCD.Es vēl joprojām strādā pie šīs problēmas.Ja Jums ir veiksmīgi attēlot uz LCD Lūdzu, sūtiet savus rezultātus šeit un, ja iespējams, ļaujiet man zināt, ko es esmu darījis nepareizi.

 
Hi Peter_L,

Es vēl izmēģināt, kā es esmu pilnīgi jauni VHDL un FPGA.
Vai dariet man zināmu, ja jums ir izpētījuši,.Pateicība.

 
Hi Drifterz,

Ja jūs izmantojat XILINX FPGA ar Xinlinx ISE redaktors, es esmu atradis lielisku pamācību par XILINX mājas lapā (meklēt "XILINX ise Tutorial").Tas soli pa solim pamācība ir VHDL vai Verilog (atkarībā no tā, kurā jūsu apmierina), kas iet caur projektēšanas Stop Watch izmantojot Spartan3A attīstības padomes pasākumus.Šī apmācība notiek caur izmantojot skaitītāji un attēlot uz LCD displeja.Check it out!Es esmu to strādāt tagad, un es esmu iemācījās dažas lietas jau.

Labu veiksmi.Keep me updated par to, kā tas notiek.Tas vienmēr ir labi zināt, ka es neesmu hte vienīgais, kurš ir jauns, lai FPGA's!=)

 

Welcome to EDABoard.com

Sponsor

Back
Top