这是 LCD 的子程序:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity VideoTest is
port( LCD_E, LCD_RS, LCD_RW : OUT std_logic;
LCD_DB : OUT std_logic_vector(7 downto 0);
counter: IN integer;
clk: IN std_logic);
end VideoTest;
architecture Behavioral of VideoTest is
signal InitDone: std_logic :='0';
begin
InitAndSet: process (InitDone, counter, clk) is
variable tencounter: integer :=0;
variable tempcounter: integer :=0;
begin
if (clk'event and clk='1') then
if (InitDone = '0') then
-- Enabling
LCD_E <='1';
-- Clear Screen
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7 downto 1) <= "0000000";
LCD_DB(0) <= '1';
-- Return Cursor Home
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7 downto 2) <= "000000";
LCD_DB(1) <= '1';
LCD_DB(0) <= '0';
-- Setting incrementation and moving cursor;
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7 downto 3) <= "00000";
LCD_DB(2) <= '1';
LCD_DB(1) <= '1';
LCD_DB(0) <= '0';
-- Display On, show cursor, blink cursor
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7 downto 4) <= "0000";
LCD_DB(3) <= '1';
LCD_DB(2) <= '1';
LCD_DB(1) <= '1';
LCD_DB(0) <= '1';
-- Function set
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7 downto 6) <= "00";
LCD_DB(5) <= '1';
LCD_DB(4) <= '0';
LCD_DB(3) <= '1';
LCD_DB(2) <= '0';
LCD_DB(1) <= '1';
LCD_DB(0) <= '1';
-- Set DD Adress to 0
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7)<='1';
LCD_DB(6 downto 0) <= "0000000";
InitDone <= '0';
end if;
-- Setting the value (0 to 9 is equal to 00110000 to 00111001)
if (InitDone = '1') then
if (counter < 10) then
LCD_RS<='1';
LCD_RW<='0';
case counter is
when 0 =>
LCD_DB <="00110000";
when 1 =>
LCD_DB <="00110001";
when 2 =>
LCD_DB <="00110010";
when 3 =>
LCD_DB <="00110011";
when 4 =>
LCD_DB <="00110100";
when 5 =>
LCD_DB <="00110101";
when 6 =>
LCD_DB <="00110110";
when 7 =>
LCD_DB <="00110111";
when 8 =>
LCD_DB <="00111000";
when 9 =>
LCD_DB <="00111001";
when others =>
LCD_DB <="00000000";
end case;
-- if counter is greater than 10, then put the number in two addresses.
elsif (counter > 9) then
LCD_DB <="00000000";
tempcounter :=counter;
for i in 0 to 8 loop
if tempcounter > 9 then
tempcounter := tempcounter - 10;
end if;
end loop;
tencounter := counter - tempcounter;
case tencounter is
when 0 =>
LCD_DB <="00110000";
when 1 =>
LCD_DB <="00110001";
when 2 =>
LCD_DB <="00110010";
when 3 =>
LCD_DB <="00110011";
when 4 =>
LCD_DB <="00110100";
when 5 =>
LCD_DB <="00110101";
when 6 =>
LCD_DB <="00110110";
when 7 =>
LCD_DB <="00110111";
when 8 =>
LCD_DB <="00111000";
when 9 =>
LCD_DB <="00111001";
when others =>
LCD_DB <="00000000";
end case;
LCD_RS<='0';
LCD_RW<='0';
LCD_DB(7)<='1';
LCD_DB(6 downto 1) <= "000000";
LCD_DB(0) <='1';
case tempcounter is
when 0 =>
LCD_DB <="00110000";
when 1 =>
LCD_DB <="00110001";
when 2 =>
LCD_DB <="00110010";
when 3 =>
LCD_DB <="00110011";
when 4 =>
LCD_DB <="00110100";
when 5 =>
LCD_DB <="00110101";
when 6 =>
LCD_DB <="00110110";
when 7 =>
LCD_DB <="00110111";
when 8 =>
LCD_DB <="00111000";
when 9 =>
LCD_DB <="00111001";
when others =>
LCD_DB <="00000000";
end case;
end if;
end if;
end if;
end process InitAndSet;
end Behavioral;
以下是用户约束:
-- Constraints
NET "LCD_E" LOC = "AB4" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_RS" LOC = "Y14" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_RW" LOC = "W13" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<7>" LOC = "Y15" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<6>" LOC = "AB16" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<5>" LOC = "Y16" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<4>" LOC = "AA12" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<3>" LOC = "AB12" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<2>" LOC = "AB17" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<1>" LOC = "AB18" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "LCD_DB<0>" LOC = "Y13" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
正如我所看到的,这个程序应该激活 LCD 显示器,因为我已经清除了内存中所有旧的保存的东西,我已经将光标设置为 0 位置,然后在特定的数字上增加(在主项目中)它表示屏幕上的数字。我直接从 Spartan 3AN - Beginner Kit 的用户手册中获取了约束和编码。
我错过了什么吗?它的作用是因为它没有通电或其他东西。
在此先感谢博扬·马托夫斯基