KS0108B kontroller i VHDL
Postat: 23 april 2006, 19:04:44
Börjar med koden:
.ucf filen:
Nu till problembeskrivningen... när jag laddat över programmet till FPGA:n (Spartan3 -400k på en S3BOARD) så börjar lysdioden på P11 lysa (alltså status<4> = '1') vilken den inte borde göra sen stannar den vid IP = 0000 vilket inte heller stämmer.
Någon som har nån aning om vad felet kan vara? (okej koden är nog inte den bästa så all feedback är varmt välkommen då detta är mitt typ 3:e VHDL "program")
Kod: Markera allt
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LCD is
Port ( E : out STD_LOGIC;
RS : out STD_LOGIC;
DATA : inout STD_LOGIC_VECTOR (7 downto 0);
RW : inout STD_LOGIC;
CS1 : out STD_LOGIC;
CS2 : out STD_LOGIC;
clka : in STD_LOGIC;
status : out STD_LOGIC_VECTOR(4 downto 0));
end LCD;
architecture Behavioral of LCD is
signal delay : integer := 0;
signal done_sendning : STD_LOGIC;
signal wait_for : STD_LOGIC;
signal e_strobe_res : STD_LOGIC;
signal CMD : STD_LOGIC_VECTOR(8 downto 0); -- 8: (0 = Kommando, 1 = Data)
signal IP: integer := 0;
signal tempsig: STD_LOGIC_VECTOR(5 downto 0);
signal init_next_half: STD_LOGIC;
begin
e_strobe: process (clka, wait_for)
begin
if (wait_for = '1') then
if (clka'event and clka='1') then
E <= '1';
delay <= delay + 1;
if (delay >= 22500) then --0,00045 / 0,00000002 = 22500 (450 ns min)
E <= '0';
if (delay = 45000) then
delay <= 0;
e_strobe_res <= '0';
end if;
end if;
end if;
end if;
end process e_strobe;
sendCMD_D: process (CMD)
begin
if CMD > "000000000" then
done_sendning <= '0';
RW <= '1';
RS <= '0'; -- Läser status...
while DATA(7) = '1' loop
wait_for <= '1';
end loop;
if DATA(7) = '1' then
RW <= '0';
DATA(7 downto 0) <= CMD (7 downto 0);
RS <= CMD(8) and '1';
wait_for <= '1';
if e_strobe_res = '0' then
done_sendning <= '1';
end if;
end if;
end if;
end process sendCMD_D;
state_machine: process
subtype rom_word is STD_LOGIC_VECTOR(3 downto 0);
type rom_table is array(0 to 10) of rom_word;
constant State_rom: rom_table := rom_table'("0001","0000","0010","0101",
"0100","0110","1001","0111",
"0011","1011","1101");
begin
status(3 downto 0) <= State_rom(IP);
case State_rom(IP)(0) is
when '0' => --- Skicka kommando
CMD(8) <= '0';
case State_rom(IP)(3 downto 1) is
when "000" => CMD(7 downto 0) <= X"3F"; -- Sätter på display(X) utpekad av CSx
when "001" => CMD(7 downto 0) <= X"C0"; -- Sätter start linje
when "010" => CMD(7 downto 0) <= (X"B8" or ("00" & (tempsig and "111111")));
when "011" => CMD(7 downto 0) <= X"40";
when others => IP <= IP - 1;
end case;
if done_sendning = '1' then -- Behöver bara kolla denna bit
IP <= IP + 1;
end if;
when '1' => -- Gör någonting annat...
case State_rom(IP)(3 downto 1) is
when "000" => CS1 <= '1'; -- Markera CS1
CS2 <= '0';
IP <= IP + 1;
when "001" => CS1 <= '0'; -- Makera CS2
CS2 <= '1';
IP <= IP + 1;
when "010" => tempsig <= "001000";
IP <= IP + 1;
when "011" => tempsig <= tempsig - 1;
if (tempsig = 0) then
IP <= IP + 1;
else
IP <= IP - 3;
end if;
when "100" => tempsig <= "000000";
while (tempsig < "111111") loop
CMD(8 downto 0) <= "111111111";
if done_sendning = '1' then
tempsig <= tempsig + 1;
end if;
end loop;
when "101" => if init_next_half = '0' then
IP <= IP - 8;
init_next_half <= '1';
else
IP <= IP + 1;
end if;
when "110" => status(4) <= '1';-- Evighets loop...
when others => null
end case;
when others => null;
end case;
end process state_machine;
end Behavioral;
Kod: Markera allt
NET "E" LOC = "C11";
NET "RS" LOC = "C10";
NET "RW" LOC = "E10";
NET "DATA<0>" LOC = "D11";
NET "DATA<1>" LOC = "C12";
NET "DATA<2>" LOC = "D12";
NET "DATA<3>" LOC = "E11";
NET "DATA<4>" LOC = "B16";
NET "DATA<5>" LOC = "R3";
NET "DATA<6>" LOC = "C16";
NET "DATA<7>" LOC = "D16";
NET "CS1" LOC = "E16";
NET "CS2" LOC = "G15";
NET "status<4>" LOC = "P11";
NET "status<3>" LOC = "P12";
NET "status<2>" LOC = "N12";
NET "status<1>" LOC = "P13";
NET "status<0>" LOC = "N14";
NET "clka" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 50 MHz HIGH 50%;
NET "clka" LOC = "T9";
Någon som har nån aning om vad felet kan vara? (okej koden är nog inte den bästa så all feedback är varmt välkommen då detta är mitt typ 3:e VHDL "program")