《CPLD/FPGA 》课程设计报告题目:128X64液晶显示程序设计院(系):信息科学与工程学院专业班级:通信1001班学生姓名:学号:同组学生:指导教师:20 13 年 10 月 14 日至20 13 年 10 月 25 日128X64液晶显示程序设计课程设计任务书一、设计(调查报告/论文)题目128X64液晶显示程序设计二、设计(调查报告/论文)主要内容下述设计内容需由学生个人独立完成:1.设计EP1C6Q240C8控制128X64液晶屏显示电路原理图;2.分析128X64液晶工作原理;3.能按要求进行元器件的焊接;4. 能正确处理安装与调试过程中所遇到的问题;三、原始资料1. 通信与电子系统实验指导书;2. 128X64液晶显示电路制作套件。
四、要求的设计(调查/论文)成果1.元件布局美观,硬件焊接可靠,无虚焊,短路;2. 能在液晶屏上正确显示相关文字信息;3.结合实际编出具有特色功能程序,程序结构合理,语言简洁,格式规范,注释详细;4. 按要求完成课程设计报告,格式符合学校规范标准,字数不少于2000字。
五、进程安排第 1 天理论讲解,材料发放,学生进行元器件清理并检测;第 2天安装焊接,电路调试,硬件故障排查;第 3 天,软件编程调试;第4-5 天调测,验收,评分。
六、主要参考资料[1] 陈曦.通信与电子系统实验指导书,武汉:华中科技大学武昌分校.[2] 谭会生.EDA技术及应用,西安:西安电子科技大学出版社,2010.[3] 潘松,黄继业.EDA技术与VHDL,北京:清华大学出版社,2009.指导教师(签名):20 年月日目录摘要 (3)1.课程设计的目的 (4)2.课程设计题目和要求 (4)3.课程设计报告内容 (4)3.1课程设计原理 (4)3.2课程设计相关图 (5)3.3课程设计程序 (6)3.4课程设计的结果 (14)3.5课程设计的波形仿真 (15)4.课程设计所遇到的问题及解决方案 (15)5.课程设计总结 (17)摘要在硬件电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,而VHDL语言是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体出发,自上至下地将设计任务分为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。
本课设主要是基于FPGA的128X64的液晶显示控制器。
控制部分采用VHDL语言编写,主体程序采用状态机作为主要控制方式。
关键字:VHDL,状态机,128641 课程设计的目的通过对液晶屏的安装调试,需学习掌握:(1)液晶屏显示文字的整体设计流程。
(2)Quartus2软件的调试方法及相关工具的使用。
(3)液晶屏LCD12864的使用方法。
(4)各种常见元器件的选择及使用。
2 课程设计题目描述和要求题目描述:频率计的设计制作要求:用VHDL编程控制LCD12864显示的频率计。
(1)用LCD12864显示“频率及姓名”等内容。
(2)显示过程:实验板通电开机后,下载运行之后,LCD显示器显示“频率及姓名”,本组成员等内容。
(3)熟悉单片机系统的工作原理及调测方法。
软硬件安装调测完成后根据系统的工作原理、过程、测试数据及遇到的问题与处理情况、体会等完成课设报告。
3 课程设计报告内容3.1 课程设计原理该设计分为三个模块:信号源模块,频率计模块,显示模块。
通过软件程序下载运行在LCD上显示频率等信息。
采用一个标准的基准时钟,在单位时间如(1s)里对被测信号的脉冲数进行计数,即为信号的频率。
由于闸门起始和结束时刻对于信号来说是随机的,将会有一个脉冲周期的量化误差。
进一步分析测量准确度:设待测信号脉冲周期为TX,频率为FX,当测量时间为T=1s时,测量精度为&=TX/T =1/FX..由此可知直接测频法的测量准确度与信号的频率有关:当代侧信号频率较高时,测量准确度也较高。
反之测量准确度较低。
因此直接测频法适合频率较高的信号,不能满足在整个测量频段内的测量进度保持不变的要求。
若要得到整个频段内较高的精确度,应该考虑等精度测量等其他方法。
最后将测得的频率送到显示部分显示。
3.2课设相关图(1)顶层原理图(2)频率计原理图(3)引脚匹配(4)硬件电路3.3课程设计程序1.信号源模块(信号源是为了产生1HZ的门控信号和待测的定频信号,而对输入系统时钟clk(50MHZ)进行分频的模块):LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT ISPORT(CLK :IN STD_LOGIC;FREQ1 :OUT STD_LOGIC;FREQ488 :OUT STD_LOGIC;FREQ1953 :OUT STD_LOGIC;FREQ7812 :OUT STD_LOGIC;FREQ31250:OUT STD_LOGIC;FREQ125K :OUT STD_LOGIC;FREQ500K :OUT STD_LOGIC);END CNT;ARCHITECTURE BEHV OF CNT ISSIGNAL TEMP: STD_LOGIC_VECTOR(19 DOWNTO 0);BEGINPROCESS(CLK)BEGINIF CLK'EVENT AND CLK='1' THENIF TEMP="11110100001000111111" THENTEMP<="00000000000000000000";ELSETEMP<=TEMP+1;END IF;END IF;END PROCESS;FREQ1<=TEMP(19);FREQ488<=TEMP(10);FREQ1953<=TEMP(8);FREQ7812<=TEMP(6);FREQ31250<=TEMP(4);FREQ125K<=TEMP(2);FREQ500K<=TEMP(0);END BEHV;2.FREQ模块:是通过元件例化将各个功能模块组合在一起的。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQ ISPORT(CLK: IN STD_LOGIC;FSIN:IN STD_LOGIC;DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END FREQ;ARCHITECTURE BEHV OF FREQ ISCOMPONENT TESTCTLPORT(CLK: IN STD_LOGIC;TSTEN: OUT STD_LOGIC;CLR_CNT:OUT STD_LOGIC;LOAD: OUT STD_LOGIC);END COMPONENT;COMPONENT CNT10PORT(CLK: IN STD_LOGIC;CLR: IN STD_LOGIC;ENA: IN STD_LOGIC;CQ: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END COMPONENT;COMPONENT REG32BPORT(LOAD: IN STD_LOGIC;DIN: IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT: OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END COMPONENT;SIGNAL LOAD1,TSTEN1,CLR_CNT1:STD_LOGIC;SIGNAL DTO1:STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL CARRY_OUT1:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINU1: TESTCTL PORT MAP(CLK=>CLK,TSTEN=>TSTEN1,CLR_CNT=>CLR_CNT1,LOAD=>LOAD1);U2: REG32B PORT MAP(LOAD=>LOAD1,DIN=>DTO1,DOUT=>DOUT);U3: CNT10 PORT MAP(CLK=>FSIN,CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(3 DOWNTO 0),CARRY_OUT=>CARRY_OUT1(0));U4: CNT10 PORT MAP(CLK=>CARRY_OUT1(0),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(7 DOWNTO 4),CARRY_OUT=>CARRY_OUT1(1));U5: CNT10 PORT MAP(CLK=>CARRY_OUT1(1),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(11 DOWNTO 8),CARRY_OUT=>CARRY_OUT1(2));U6: CNT10 PORT MAP(CLK=>CARRY_OUT1(2),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(15 DOWNTO 12),CARRY_OUT=>CARRY_OUT1(3));U7: CNT10 PORT MAP(CLK=>CARRY_OUT1(3),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(19 DOWNTO 16),CARRY_OUT=>CARRY_OUT1(4));U8: CNT10 PORT MAP(CLK=>CARRY_OUT1(4),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(23 DOWNTO 20),CARRY_OUT=>CARRY_OUT1(5));U9: CNT10 PORT MAP(CLK=>CARRY_OUT1(5),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(27 DOWNTO 24),CARRY_OUT=>CARRY_OUT1(6));U10: CNT10 PORT MAP(CLK=>CARRY_OUT1(6),CLR=>CLR_CNT1,ENA=>TSTEN1,CQ=>DTO1(31 DOWNTO 28));END BEHV;3.分频模块(50MHZ经过50分频得到1MHZ)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pin1mhz isport(clkin : in std_logic;clkout : out std_logic);end pin1mhz;architecture a of pin1mhz isbeginprocess(clkin)variable cnttemp: integer range 0 to 49;beginif clkin='1' and clkin'event thenif cnttemp=49 then cnttemp:=0;elseif cnttemp<25 then clkout<='1';else clkout<='0';end if;cnttemp:=cnttemp+1;end if;end if;end process;end architecture a;4.显示模块(由状态机来完成液晶屏的时序)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;entity clock_lcd_disp isgeneric(divide_to_100k:integer:=500);port(clk:in std_logic;DATAIN:in std_logic_vector(31 downto 0);rw,rs,e,lcd_rst:out std_logic;lcd_data:out std_logic_vector(7 downto 0));end clock_lcd_disp;architecture tcl of clock_lcd_disp issignal clk_100k:std_logic;signal clkout:std_logic;signal temp:std_logic_vector(7 downto 0);type state is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12);signal current_s:state;type data_buffer is array(0 to 15)ofstd_logic_vector(7 downto 0);type data_buffer1 is array(0 to 7)ofstd_logic_vector(7 downto 0);signal time:std_logic_vector(23 downto 0);signal disp_time:data_buffer1:=(x"31",x"32",x"3a",x"33",x"34",x"3a",x"35",x"36");constant data_buf0:data_buffer:=(x"c6",x"b5",x"c2",x"ca", --频率x"20",x"20",x"20",x"20", --空格x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20");constant data_buf1:data_buffer:=(x"20",x"20",x"20",x"20", --x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20");constant data_buf2:data_buffer:=(x"c7",x"d8",x"c5",x"e5", --秦佩x"a1",x"aa",x"a1",x"aa", -- ——x"d1",x"d4",x"c5",x"f4", --訚鹏x"20",x"20",x"20",x"20");begin--U1:divclk1 port map(clk,clk_100k);process(clk)variable cnt:integer range 0 to divide_to_100k;beginif(clk'event and clk='1')then cnt:=cnt+1;if(cnt=divide_to_100k)then cnt:=0;end if;if(cnt<divide_to_100k/2) then clk_100k<='0';else clk_100k<='1';end if;end if;end process;disp_time(7)<=DATAIN(3 downto 0)+x"30";disp_time(6)<=DATAIN(7 downto 4)+x"30";disp_time(5)<=DATAIN(11 downto 8)+x"30";disp_time(4)<=DATAIN(15 downto 12)+x"30";disp_time(3)<=DATAIN(19 downto 16)+x"30";disp_time(2)<=DATAIN(23 downto 20)+x"30";disp_time(1)<=DATAIN(27 downto 24)+x"30";disp_time(0)<=DATAIN(31 downto 28)+x"30";read_time:process(time)beginend process;process(clk_100k)variable cnt1:integer range 0 to 10000;variable cnt_1:integer range 0 to 1000;variable code_cnt:integer range 0 to 13;variable data_cnt:integer range 0 to 480;beginif(clk_100k'event and clk_100k='1')thencase current_s iswhen s0=>rw<='1';rs<='1';e<='1';cnt1:=cnt1+1;if cnt1<500 then lcd_rst<='0';elsif cnt1<1000 then lcd_rst<='1';elsif cnt1=1000 thenlcd_rst<='1';cnt1:=0;current_s<=s1;end if;when s1=>cnt_1:=cnt_1+1;if cnt_1<1*3 thene<='1';rs<='0';rw<='0';elsif cnt_1<2*3 thenlcd_data<=x"0c";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 thencnt_1:=0;current_s<=s2;end if;when s2=>cnt_1:=cnt_1+1;if cnt_1<1*3 thene<='1';rs<='0';rw<='0';elsif cnt_1<2*3 thenlcd_data<=x"90";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 thencnt_1:=0;current_s<=s3;end if;when s3=>if cnt_1<1*3 thene<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=data_buf1(data_cnt);elsif cnt_1=2*3 thendata_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=16 then current_s<=s4;data_cnt:=0;end if;end if;when s4=>cnt_1:=cnt_1+1;if cnt_1<1*3 thene<='1';rs<='0';rw<='0';elsif cnt_1<2*3 thenlcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 thencnt_1:=0;current_s<=s5;end if;when s5=>if cnt_1<1*3 thene<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=data_buf2(data_cnt);elsif cnt_1=2*3 thendata_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=16 then current_s<=s6;data_cnt:=0;end if;end if;when s6=>cnt_1:=cnt_1+1;if cnt_1<1*3 thene<='1';rs<='0';rw<='0';elsif cnt_1<2*3 thenlcd_data<=x"80";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 thencnt_1:=0;current_s<=s7;end if;when s7=>if cnt_1<1*3 thene<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=data_buf0(data_cnt);elsif cnt_1=2*3 thendata_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=16 then current_s<=s8;data_cnt:=0;end if;end if;--动态显示when s8=>cnt_1:=cnt_1+1;if cnt_1<1*3 thene<='1';rs<='0';rw<='0';elsif cnt_1<5*3 thenlcd_data<=x"90";elsif cnt_1<20*3 then e<='0';elsif cnt_1=20*3 thencnt_1:=0;current_s<=s9;end if;when s9=>if cnt_1<1*3 thene<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=disp_time(data_cnt);elsif cnt_1=2*3 thendata_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s8;data_cnt:=0;end if;end if;when others=>current_s<=s0;end case;end if;end process;end tcl;3.4课程设计结果3.5课程设计的波形仿真上图中可以很明显的看到显示模块程序的S1这个状态,根据程序来观察时序图,发现时序与程序一致,并且满足液晶屏要显示文字的条件。