VFD-styrning med VHDL -Hjälp tack

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Jimmie
Inlägg: 4
Blev medlem: 25 februari 2005, 19:43:04

VFD-styrning med VHDL -Hjälp tack

Inlägg av Jimmie »

Hej,

Jag sitter med en CPLD och försöker skriva ett tecken på en Noritake VFD display med i80 cpu type mode.

Displayen är en CU20045SCPB-U1J, datablad hittas här: http://www.elfa.se/pdf/75/07556087.pdf

Jag har skrivit en liten VHDL kod för att testa att skriva ett tecken till displayen men jag får det inte att funka. Har redan kört testsekvensen för displayen så jag vet att den funkar. CPLDn jag använder är en Xilinx 9572 med 44 portar.

Koden ser ut som följer:

[kod]

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity display is
Port ( clk : in std_logic;
rst : in std_logic;
data : out std_logic_vector(7 downto 0);
RW : out std_logic;
RS : out std_logic);
end display;

architecture Behavioral of display is

-- 512 räknare
signal R512 : std_logic_vector(0 to 9);
signal R512RCO : std_logic;

-- 12 räknare
signal R12 : std_logic_vector(0 to 2);
signal R12RCO : std_logic;

--Ovrigt
signal softrst : std_logic;
signal flag : std_logic;
signal PC : std_logic_vector(0 to 2);
signal PC2 : std_logic_vector(0 to 3);
signal init : std_logic;


begin

--Klockor för att användas vid initiering av display samt utskrift av tecken
process(clk,rst)
begin

--kör delay för att displayen ska hinna starta.
if rst = '1' or softrst = '1' then
R512 <= "0000000000";
elsif rising_edge(clk) then
if R512 < 510 then
R512 <= R512 + 1;
R512RCO <= '0';
else
R512 <= "0000000000";
R512RCO <= '1';
end if;

end if;

--12 räknare(120us)
if rst = '1' or softrst = '1' then
R12 <= "000";
elsif rising_edge(clk) then
if R12 < 11 then
R12 <= R12 + 1;
R12RCO <= '0';
else
R12 <= "000";
R12RCO <= '1';
end if;
end if;

if rst = '1' then
PC <= "000";
PC2 <= "0000";
flag <= '0';
rs <= '0';
RW <= '1';
data <= "00000000";
init <= '1';

elsif rising_edge(clk) and init = '1' then

--Initieringsfasen behöver ej köras då det är en power on reset som sköter detta
--det enda som måste göras är att sätta display on


--Steg 1
if PC = "000" then


--kör delay
if flag = '0' then
flag <= '1';
softrst <= '1';
elsif R512RCO = '1' then

--Lägger data på utgångar(display on)
data <= "00001100";
rs <= '0';

PC <= "001";
PC <= "001";
flag <= '0';
else
softrst <= '0';
end if;


elsif PC = "001" then

--Sätter RW till låg(skriv) under 1 klockpuls(10us)
RW <= '0';
PC <= PC + 1;

elsif PC = "010" then

--sätter RW till hög igen
RW <= '1';
PC <= PC + 1;

elsif PC = "011" then

--Lägger data på utgångarna(tecknet A - "01000001") (rs <= 1 ger ascii-tecken)
data <= "01000001";
rs <= '1';

--Kör delay på 120us
if flag = '0' then
softrst <= '1';
flag <= '1';
else
if R12RCO = '1' then
PC <= PC + 1;
flag <= '0';
end if;
end if;

elsif PC = "100" then

--Sätter RW till låg(skriv) under 1 klockpuls(10us)
RW <= '0';
PC <= PC + 1;

elsif PC = "101" then
--sätter RW till hög(läs) igen
RW <= '1';
PC <= PC + 1;
end if;
end if;
end process;

end Behavioral;

[/kod]

Kan påpekas igen att jag kör i80 cpu bus mode då jag har lödit samman JP4 "bryggan".

Är väldigt tacksam för svar då jag har sysslat med detta ett bra tag utan att lyckas :(

Tack
Senast redigerad av Jimmie 25 februari 2005, 20:16:23, redigerad totalt 1 gång.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Jag hoppas att det är JP2 du lött ihop och inte JP4. JP4 är nämligen reset :-)
Jimmie
Inlägg: 4
Blev medlem: 25 februari 2005, 19:43:04

Inlägg av Jimmie »

Jag råkade visst länka till fel datablad. Det korrekta är detta:

http://www.elfa.se/pdf/75/07556087.pdf

Blev lite nervös där ett tag: "Kan jag ha gjort så fel?"

Kan säga att jag har provat att vänta 15ms innan jag skrev första instruktionen till displayen men det funkar fortfarande inte... :(

Frågan är om jag behöver köra initialiseringssekvensen? Den ska dock köras då man sätter på strömmen enligt databladet...

Tack
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Nu kan jag inte ett smack om VHDL-kod, men är inte din 12-räknare lite konstig när den bara använder 3 bitar för att räkna till 12? För 12 går det åt 4 bitar i vanliga fall.

Jag skulle inte lita på att displayen auto-initierar sig vid strömtillslag, allt som oftast så skiter det sig på LCD'er s det kanske är samma här?
Jimmie
Inlägg: 4
Blev medlem: 25 februari 2005, 19:43:04

Inlägg av Jimmie »

Jo,såg att tolvräknaren var lite dum. Givetvis ska den ha 4 bitar... Dock så har jag kört hela kretsen(vhdl:n) i en testbänk och tittat på utsignalerna den genererar och de har varit korrekta enligt specen i databladet...

Jag ska sätta mig ner imorgon och fortsätta med detta. Återkommer förhoppningsvis med en fungerande testkod där jag kommer att använda ett hex-tangentbord för att mata in data till displayen och ska även lägga in initieringssekvensen för säkerhets skull.

Tack.

MVH jimmie Pettersson
Jimmie
Inlägg: 4
Blev medlem: 25 februari 2005, 19:43:04

Inlägg av Jimmie »

Hej,

Har fått ordning på displayen och skrivit ett testprogram i VHDL som tar ni data från ett hex-tangentbord och skriver ut det kolumnvis på displayen. Kanske är bra om någon ska göra något liknande i framtiden.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity display is
Port ( strobe : in std_logic;
clk : in std_logic;
rst : in std_logic;
data : out std_logic_vector(7 downto 0);
data_in : in std_logic_vector(3 downto 0);
RW : out std_logic;
-- R512RCO_U : out std_logic;
-- R14RCO_U : out std_logic;
-- R1500RCO_U : out std_logic;
-- softrst_U : out std_logic;
RS : out std_logic);
end display;

architecture Behavioral of display is

-- Synka och enpulsa stroben
signal strobe_sync : std_logic;
signal strobe_sync2 : std_logic;
signal strobe_klar : std_logic;
signal strobe_on : std_logic;

-- 1500 räknare
signal R1500 : std_logic_vector(0 to 10);
signal R1500RCO : std_logic;

-- 512 räknare
signal R512 : std_logic_vector(0 to 10);
signal R512RCO : std_logic;

-- 14 räknare
signal R14 : std_logic_vector(0 to 3);
signal R14RCO : std_logic;


--Ovrigt
signal softrst : std_logic;
signal flag : std_logic;
signal PC : std_logic_vector(0 to 3);
signal init : std_logic;

signal line : std_logic_vector(0 to 1);
signal count : std_logic_vector(0 to 4);

begin

--utsignaler
-- R512RCO_U <= R512RCO;
-- R14RCO_U <= R14RCO;
-- R1500RCO_U <= R1500RCO;
-- softrst_U <= softrst;


-- ******** Synka och enpulsa stroben ********
-- Det två d-vippan i synka stroben och en pulsa stroben
process(clk,rst)
begin
if rst = '1' then
strobe_sync <= '0';
strobe_sync2 <= '0';
elsif rising_edge(clk) then
strobe_sync <= strobe;
strobe_sync2 <= strobe_sync;
end if;
end process;

-- Enpulsa stroben
strobe_klar <= (not strobe_sync) and strobe_sync2;
-- //******** Synka och enpulsa stroben ********


--Klockor för att användas vid initiering av display samt utskrift av tecken
process(clk,rst)
begin


--15ms delay
if rst = '1' or softrst = '1' then
R1500 <= "00000000000";
elsif rising_edge(clk) then
if R1500 < 1500 then
R1500 <= R1500 + 1;
R1500RCO <= '0';
else
R1500 <= "00000000000";
R1500RCO <= '1';
end if;
end if;

--5.12 ms delay
if rst = '1' or softrst = '1' then
R512 <= "00000000000";
elsif rising_edge(clk) then
if R512 < 511 then
R512 <= R512 + 1;
R512RCO <= '0';
else
R512 <= "00000000000";
R512RCO <= '1';
end if;
end if;

--14 räknare(140us)
if rst = '1' or softrst = '1' then
R14 <= "0000";
elsif rising_edge(clk) then
if R14 < 11 then
R14 <= R14 + 1;
R14RCO <= '0';
else
R14 <= "0000";
R14RCO <= '1';
end if;
end if;


--hårdvarureset med tryckknapp
if rst = '1' then
PC <= "0000";
flag <= '0';
rs <= '0';
RW <= '1';
data <= "00000000";
init <= '0';
strobe_on <= '0';
count <= "00000";
line <= "00";


elsif rising_edge(clk) then

if init = '0' then
--Initieringsfas av displayen, enligt datablad behöver detta ej göras
--men för säkerhets skull så gör vi det ändå.


--Vänta 15 ms så att displayen hinner starta
if PC = "0000" then
if flag = '0' then
softrst <= '1';
flag <= '1';
elsif R1500RCO = '1' then
PC <= PC + 1;
flag <= '0';
softrst <= '0';
else
softrst <= '0';
end if;


--Skriver 0x30 till displayen och väntar sedan 5ms
elsif PC = "0001" then

if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00110000";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R512 = "0000000001" then
--skriv
RW <= '0';
softrst <= '0';
elsif R512 = "0000000010" then
--sluta skriv
RW <= '1';
elsif R512RCO = '1' then
PC <= PC + 1;
flag <= '0';
softrst <= '0';
else
softrst <= '0';
end if;

--Skriver 0x30 till displayen och väntar sedan 120us
elsif PC = "0010" then

if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00110000";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R14 = "0010" then
--skriv
RW <= '0';
softrst <= '0';
elsif R14 = "0011" then
--sluta skriv
RW <= '1';
elsif R14RCO = '1' then
PC <= PC + 1;
flag <= '0';
softrst <= '0';
else
softrst <= '0';
end if;

--Skriver 0x30 till displayen och väntar sedan 120us
elsif PC = "0011" then
if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00110000";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R14 = "0001" then
--skriv
RW <= '0';
softrst <= '0';
elsif R14 = "0010" then
--sluta skriv
RW <= '1';
elsif R14RCO = '1' then
PC <= PC + 1;
flag <= '0';
softrst <= '0';
else
softrst <= '0';
end if;

--Skriver 0x38(function set) till displayen och väntar sedan 120us
elsif PC = "0100" then
if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00111000";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R14 = "0001" then
--skriv
RW <= '0';
elsif R14 = "0010" then
--sluta skriv
RW <= '1';
elsif R14RCO = '1' then
PC <= PC + 1;
flag <= '0';
else
softrst <= '0';
end if;

--Skriver 0x01(clear display) till displayen och väntar sedan 5ms
elsif PC = "0101" then
if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00000001";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R512 = "0001" then
--skriv
RW <= '0';
elsif R512 = "0010" then
--sluta skriv
RW <= '1';
elsif R512RCO = '1' then
PC <= PC + 1;
flag <= '0';
else
softrst <= '0';
end if;

--Skriver 0x06(Entry mode set) till displayen och väntar sedan 120us
elsif PC = "0110" then
if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00000110";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R14 = "0001" then
--skriv
RW <= '0';
elsif R14 = "0010" then
--sluta skriv
RW <= '1';
elsif R14RCO = '1' then
PC <= PC + 1;
flag <= '0';
else
softrst <= '0';
end if;

--Skriver 0x0F(Display on) till displayen och väntar sedan 120us
elsif PC = "0111" then
if flag = '0' then
--Lägger ut data och sätter flaggor
data <= "00001111";
RS <= '0';
softrst <= '1';
flag <= '1';
elsif R14 = "0001" then
--skriv
RW <= '0';
elsif R14 = "0010" then
--sluta skriv
RW <= '1';
elsif R14RCO = '1' then
init <= '1';
PC <= "0000";
flag <= '0';

else
softrst <= '0';
end if;
end if;

--Initiering klar!
elsif init = '1' and (strobe_klar = '1' or strobe_on = '1') then


--Steg 1 - Skriver tecken på display
if PC = "0000" then
--lägger data på datautgångar
data(7 downto 4) <= "0011";
data(3 downto 0) <= data_in;
rs <= '1'; --Säger att det är ett ascii-tecken.
PC <= PC + 1;
strobe_on <= '1';


elsif PC = "0001" then
--delay
PC <= PC + 1;

elsif PC = "0010" then
--Sätter RW till låg(skriv) under 1 klockpuls(10us)
RW <= '0';
PC <= PC + 1;

elsif PC = "0011" then
--sätter RW till hög igen
RW <= '1';
PC <= PC + 1;

--steg 1 - räkna ut ddram adress
elsif PC = "0100" then
if line = "00" then
line <= "01";
data <= "10100000" + count;
elsif line = "01" then
line <= "10";
data <= "11000000" + count;
elsif line = "10" then
line <= "11";
data <= "11100000" + count;
elsif line = "11" then
line <= "00";
data <= "10000000" + count;
count <= count + 1;
end if;
PC <= PC + 1;
rs <= '0'; --skriver instruktion

-- kör set ddram instruktion
elsif PC = "0101" then
--skriver instruktionen till displayen
RW <= '0';
PC <= PC + 1;

-- kör set ddram instruktion
elsif PC = "0110" then
--kör en liten delay samt sätter RW till ett.
RW <= '1';
PC <= PC + 1;

--kör delay
elsif PC = "0111" then
if flag = '0' then
softrst <= '1';
flag <= '1';
elsif R14RCO = '1' then
flag <= '0';
PC <= "0000";
strobe_on <= '0';
elsif R14 = "0000" then
softrst <= '0';
end if;

end if;


--skrivning klar

end if;
end if;
end process;

end Behavioral;



MVH Jimmie Pettersson
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

snälla bifoga mer kod! :roll:
Skriv svar