完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LCD1602 is Port ( CLK : in std_logic; Reset : in std_logic; LCD_RS : out std_logic; LCD_RW : out std_logic; LCD_EN : out std_logic; data : out std_logic_vector(3 downto 0)); end LCD1602; architecture Behavioral of LCD1602 is type iState is ( Write_instr, --写命令字 Write_DataUP4_1, --写LCD一线高4位 Write_DataDown4_1, --写LCD一线低4位 Set_DDRamAddUp, --设置DDRam地址高4位 Set_DDRamAddDown, --设置DDRam地址低4位 Write_DataUP4_2, --写LCD二线高4位 Write_DataDown4_2 --写LCD二线低4位 ); signal State:iState; type Ram is array(0 to 15) of std_logic_vector(7 downto 0); constant MyRamUp:Ram:=(x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"41",x"42",x"42",x"42"); --AAAAAAAABBB constant MyRamDown:Ram:=(x"42",x"42",x"42",x"42",x"42",x"42",x"42",x"42",x"42",x"42",x"42",x"42",x"41",x"41",x"41",x"41"); --BBBBBBBBBBAAAA signal LCD_Clk : std_logic :='0'; signal datacnt : integer range 0 to 15:=0; begin LCD_RW <= '0'; LCD_EN <= LCD_Clk; process(CLK) --20000分频,满足时序要求 variable n1:integer range 0 to 19999; begin if rising_edge(CLK) then if n1<19999 then n1:=n1+1; else n1:=0; LCD_Clk<=not LCD_Clk; end if; end if; end process; process(LCD_Clk,state,reset) begin if Reset='0' then state<=Write_instr; LCD_RS <= '0'; data<="0000"; datacnt<=0; elsif rising_edge(LCD_Clk) then case state is when Write_instr=> --写命令字到LCD控制器 LCD_RS<='0'; if(datacnt=0)then data<="0011"; --0011 datacnt<=datacnt+1; elsif(datacnt=1)then data<="0011"; --0011 datacnt<=datacnt+1; elsif(datacnt=2)then data<="0011"; --0011 datacnt<=datacnt+1; elsif(datacnt=3)then data<="0010"; --0010 datacnt<=datacnt+1; elsif(datacnt=4)then --0x28 : 0010 1000 =>功能设置 data<="0010"; datacnt<=datacnt+1; elsif(datacnt=5)then data<="1000"; datacnt<=datacnt+1; elsif(datacnt=6)then --0x06 : 0000 0110 =>模式设定 data<="0000"; datacnt<=datacnt+1; elsif(datacnt=7)then data<="0110"; datacnt<=datacnt+1; elsif(datacnt=8)then --0x0c : 0000 1100 =>显示设定 data<="0000"; datacnt<=datacnt+1; elsif(datacnt=9)then data<="1100"; datacnt<=datacnt+1; elsif(datacnt=10)then --0x10 : 1000 0000 =>00H 设定读写地址位 data<="1000"; datacnt<=datacnt+1; else data<="0000"; datacnt<=0; state<=Write_DataUP4_1; end if; when Write_DataUP4_1=> LCD_RS<='1'; data <= MyRamUp(datacnt)(7 downto 4); state <= Write_DataDown4_1; when Write_DataDown4_1=> if datacnt=15 then data <= MyRamUp(datacnt)(3 downto 0); datacnt<=0; state <=Set_DDRamAddUp; else data <= MyRamUp(datacnt)(3 downto 0); datacnt<=datacnt+1; state <=Write_DataUP4_1; end if; when Set_DDRamAddUp=> --0xc0 : 1100 0000=>40H 设定读写地址位 LCD_RS<='0'; data<="1100"; state<=Set_DDRamAddDown; when Set_DDRamAddDown=> data<="0000"; state<=Write_DataUP4_2; when Write_DataUP4_2=> LCD_RS<='1'; data <= MyRamDown(datacnt)(7 downto 4); state <= Write_DataDown4_2; when Write_DataDown4_2=> if datacnt=15 then data <= MyRamDown(datacnt)(3 downto 0); datacnt<=0; state <=Write_DataUP4_1; else data <= MyRamDown(datacnt)(3 downto 0); datacnt<=datacnt+1; state <=Write_DataUP4_2; end if; when others=> state<=Write_instr; end case; end if; end process; end Behavioral; 仿真不出结果,有人用这个程序弄出来了,我没弄出来 |
|
相关推荐
3个回答
|
|
楼主首先得有激励文件啊,就是写一个Testbench文件来给你的Entity产生激励,看输出响应,你所说的仿真不出结果是指什么呢?
|
|
|
|
输入的激励有点小问题,没输出常见可能有二:1,复位信号的时间小于一个时钟周期
2,时序不对,因为你第一个进程产生敏感信号驱动下面两个进程,你给的激励永远不会触发后面两个进程 |
|
|
|
输入没有激励信号 怎么会有输出呢?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1533 浏览 1 评论
1313 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1523 浏览 0 评论
925 浏览 0 评论
2317 浏览 0 评论
1458 浏览 35 评论
5671 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 09:51 , Processed in 0.547053 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号