FPGA课程设计.doc

上传人:laozhun 文档编号:4146443 上传时间:2023-04-07 格式:DOC 页数:17 大小:555.50KB
返回 下载 相关 举报
FPGA课程设计.doc_第1页
第1页 / 共17页
FPGA课程设计.doc_第2页
第2页 / 共17页
FPGA课程设计.doc_第3页
第3页 / 共17页
FPGA课程设计.doc_第4页
第4页 / 共17页
FPGA课程设计.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《FPGA课程设计.doc》由会员分享,可在线阅读,更多相关《FPGA课程设计.doc(17页珍藏版)》请在三一办公上搜索。

1、一 设计目的:1、 熟练掌握和使用基于CPLD/FPGA的数字系统开发工具、开发流程,能够自主进行成熟的基于CPLD/FPGA的数字系统设计,能够发现和独立解决开发过程中遇到的问题。 2、了解时序电路FPGA的实现。3、学习用VHDL语言来描述时序电路的过程。4、了解LCD1602液晶显示器的工作原理。二设计环境: QUARTUSH 9.0 软件 MARS-1270 CPLD实验版 1602液晶 MARS-1270 CPLD实验版是针对CPLD/FPGA的初中级学者设计,该板可 以配合其扩展板进行相应的实验,也可以作为相关CPLD/FPGA研发的原型。核心板简单实用扩展性好,板上提供ISP接口

2、,并将CPLD/FPGA的部分IO引脚引出,为用户提供一个帮助用户快速开始可编程逻辑器件学习之旅的硬件平台。三 设计要求: 要求用1602液晶显示字符; 显示内容:学号+英文姓名; 显示方式:流动显示,开关控制字符流动速度及方向;具有暂停和清屏 的功能; 扩展部分:设计汉字字符及其他功能四设计思路及实现方法1. 下图所示1602字符液晶接口与实验板内部相连之图 上图所示是从MARS-1270 CPLD实验版 的手册上截取的1602与实验板相连的图,1,2,3,15,16均与实验板内部电压相连,显示时只需注意给1602的 4-14管脚赋值。 (1)1602引脚定义 1602采用标准的16脚接口,

3、其中: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第151

4、6脚:空脚(2) 1602实际写时每位的地址 第一行:首地址为80H,”10000000”,最多能显示27个数;尾地址为A7H,”10100111” 第二行:首地址为 C0H,”11000000”, 最多能显示27个数;尾地址为 E7H,”11100111” (3) 1602内部1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用 的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地 址41H中的点阵字符图形显示出来,我们就能

5、看到字母“A”LCD1602的工作时序可查阅其他资料下图为CGROM中字符码与字符字模关系对照表从下图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来就是01000001,也就是41H。可见它的代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM 写C51字符代码程序时甚至可以直接用P1A这样的方法。PC在编译时就把“A”先转为41H代码了。字符代码0x000x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。0x200x7F 为标准的ASCII 码,0xA00xFF 为日文字符和

6、希腊文字符,其余字符码(0x100x1F及0x800x9F)没有定义。(4)对DDRAM的内容和地址进行操作的指令(只介绍本次设计中涉及的一些) 一清屏指令:使液晶不显示任何东西 二.设定显示屏或光标移动方向指令 三显示模式设置:写程序时从38H开写,是使液晶处于开始状态 四.暂停及流动 指令码 功能0 001Sx00若S=1,则静止不动;为0,流动显示注:上述四个功能均在RS为0时方可写入;若RS为1,则可写入在1602上显示字符的代码;E一般选取系统时钟分频后的时钟;2. 设计思路及实现方法. 根据写1602的一般顺序:(1)开始38H.(2)显示模式设置.(3)显示关闭08H.(4)显示

7、清屏01H.(5)显示光标移动设置06H.(6)显示开及光标移动设置0CH 根据这几步决定用VHDL语言中的状态机描述方式进行编写程序,与其他描述方式相比,状态机的表述丰富多样,程序层次分明,结构清晰,易读易懂; 其中,在设计程序的过程中,由于程序包含地址和显示内容,考虑用到元件例化语句,将每个地址要显示的内容存到相应的元件例化语句中去。元件例化就是将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中的指定端口相连接。 五程序源文件与设计结果分析1.显示内容:学号+英文姓名library IEEE;use IEEE.STD_LOGIC_1164.ALL;use I

8、EEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity yejing2 is Port ( clk : in std_logic;-40MHZ Reset : in std_logic;-rst lcd_rs : out std_logic;-data/mingling(en0) lcd_rw : out std_logic;-read/write(en1) lcd_e : buffer std_logic;-enable(en2) data : out std_logic_vector(7 downto 0);-/data

9、 shumaguan key:in std_logic; -拨码开关0 key1:in std_logic; -拨码开关1 key2:in std_logic -拨码开关2 );end yejing2 ;architecture Behavioral of yejing2 isconstant IDLE : std_logic_vector(10 downto 0) :=00000000000;-/闲置constant CLEAR : std_logic_vector(10 downto 0) :=00000000001;-/清屏 constantRETURNCURSOR:std_logic_

10、vector(10downto0) :=00000000010 ;-/光标返回constantSETMODE : std_logic_vector(10 downto 0) :=00000000100;-/输入方式-/0x06-/显示光标移动设置,当读或写一个字符后地址指针加1,且光标加1constantSWITCHMODE:std_logic_vector(10downto0) :=00000001000;-/显示开关-/0x0c-/开显示;不显示光标;光标不闪烁constant SHIFT : std_logic_vector(10 downto 0) :=00000011000;-/移位

11、调整-/0x81-/显示位移;左移constantSETFUNCTION:std_logic_vector(10downto0) :=00000100000;-/功能设置-/0x3C-/8位;两行显示16*2 ; constantSETCGRAM:std_logic_vector(10downto 0) :=00001000000;-/字符发生存储器地址ACGconstantSETDDRAM:std_logic_vector(10downto 0) :=00010000000;-/设置DDRAM(显示数据RAM)的地址-/0x80 显示数据储存器地址ADD -/0xc0 显示数据储存器地址AD

12、D 第二行开头constant READFLAG : std_logic_vector(10 downto 0) :=00100000000;-/忙标志constant WRITERAM: std_logic_vector(10 downto 0) :=01000000000; -写数据到CGRAM或者DDRAMconstantREADRAM: std_logic_vector(10 downto 0) :=10000000000;-/从CGRAM或者DDRAM读数signal state : std_logic_vector(10 downto 0);signal counter : int

13、eger range 0 to 127;signal div_counter : integer range 0 to 15;signal flag : std_logic;constant DIVSS : integer :=15;signal char_addr: std_logic_vector(6 downto 0);signal data_in : std_logic_vector(7 downto 0);component char_ram2port( address : in std_logic_vector(6 downto 0) ; data : out std_logic_

14、vector(7 downto 0) );end component;-元件例化语句signal clk_int: std_logic;signal clkcnt: std_logic_vector(18 downto 0);constant divcnt: std_logic_vector(18 downto 0):=1111001110001000000; -/498752signal a:integer;signal clkdiv: std_logic;signal tc_clkcnt: std_logic; signal k: integer; -显示步进signal yi: std_

15、logic; -显示左移还是右移signal zanting: std_logic;-显示暂停还是流动 beginprocess(key)-该部分控制分频步进是1还是5,即是控制字符流动速度begin case key is when 0=kknull; end case;end process;process(key1)该部分控制液晶整屏左移还是右移1是左移, 0右移begincase key1 is when 1=yiyinull; end case;end process;process(key2)该部分控制整屏暂停还是流动1暂停,0流动begincase key2 is when 1=

16、zantingzantingnull; end case;end process;process(clk,reset)begin if(reset=0)thenclkcnt=0000000000000000000; elsif(clkevent and clk=1)then if(clkcnt=divcnt)then-/ t=498752*25ns=12.5msclkcnt=0000000000000000000; elseclkcnt=clkcnt+k; end if; end if;end process;tc_clkcnt=1 when clkcnt=divcnt else -/12.5

17、ms产生计数溢出脉冲 0; process(tc_clkcnt,reset)begin if(reset=0)thenclkdiv=0; elsif(tc_clkcntevent and tc_clkcnt=1)thenclkdiv=not clkdiv; -/翻转时钟 t=25ms f=40hz end if;end process;process(clkdiv,reset)begin if(reset=0)thenclk_int=0; elsif(clkdivevent and clkdiv=1)thenclk_int= not clk_int; -/分频 t=50ms f=20hz en

18、d if;end process;process(clkdiv,reset)begin if(reset=0)thenlcd_e=0; elsif(clkdivevent and clkdiv=0)thenlcd_echar_addr,data=data_in);lcd_rs = 1 when state =WRITERAM or state = READRAM else 0; -/当lcd_rs=1时,为数据;=0时,为命令 lcd_rw = 0 when state =CLEAR or state = RETURNCURSOR or state=SETMODE or state=SWITC

19、HMODE or state=SHIFT or state= SETFUNCTION or state=SETCGRAM or state =SETDDRAM or state =WRITERAM else 1; -/=0,写;=1,读 data =00000001 when state =CLEAR else -/0x01-清屏00000010 when state =RETURNCURSOR else -/0x02-光标返回00000110 when state = SETMODE else -/0x06-/显示光标移动设置,当读或写一个字符后地址指针加1,且光标加100001100 wh

20、en state =SWITCHMODE else -/0x0c-/开显示;不显示光标;光标不闪烁0001 & zanting & yi &00 when state = SHIFT else -/0x81-/显示位移;左移00111100 when state=SETFUNCTION else-/0x3C-/8位;两行显示16*2 ; 字体5*1001000000 when state =SETCGRAM else -/0x40 字符发生器储存器地址ACG10000000 when state =SETDDRAM and counter =0 else -/0x80 显示数据储存器地址ADD

21、 11000000 when state =SETDDRAM and counter /=0 else -/0xc0 显示数据储存器地址ADD 第二行开头 data_in when state = WRITERAM else -/写入数据 ZZZZZZZZ; char_addr =conv_std_logic_vector( counter,7) when state =WRITERAM and counter40 and counter40 and counter88 and counter73 and counter81 1-70000001; process(clk_int,Reset)

22、 begin if(Reset=0)then state=IDLE; counter=0; flag=0; div_counter -/(1)if(flag=0)then state=SETFUNCTION; -/-/0x3C-/8位;两行显示16*2 ; flag=1; counter=0; -/初始地址 div_counter=0;else if(div_counterDIVSS )then -/constant DIVSS : integer :=15; div_counter=div_counter +1; state=IDLE; else div_counter=0; state -

23、/(2)-/-/0x3C-/8位;两行显示16*2 ; state-/(3)-/0x0c-/开显示;不显示光标;光标不闪烁 state-/(4) -/0x01-清屏 state-/(5)-/0x06-/显示光标移动设置,当读或写一个字符后地址指针加1,且光标加1 state-/(6) if(counter =40)then state=SETDDRAM; counter=counter+1;elsif(counter/=40 and counter81)then state=WRITERAM; counter=counter+1;elsestate -/(7) state -/(7) stat

24、e state state state state stateresult := 32;when ! =result := 33;when =result := 34;when # =result := 35;when $ =result := 36; when % =result := 37;when & =result := 38;when =result := 39;when ( =result := 40;when ) =result := 41;when * =result := 42;when + =result := 43;when , =result := 44;when -

25、=result := 45;when . =result := 46;when / =result := 47;when 0 =result := 48;when 1 =result := 49;when 2 =result := 50;when 3 =result := 51;when 4 =result := 52;when 5 =result := 53;when 6 =result := 54;when 7 =result := 55;when 8 =result := 56;when 9 =result := 57;when : =result := 58;when ; =resul

26、t := 59;when result := 60;when = =result := 61;when =result := 62;when ? =result := 63;when =result := 64;when A =result := 65;when B =result := 66;when C =result := 67;when D =result := 68;when E =result := 69;when F =result := 70;when G =result := 71;when H =result := 72;when I =result := 73;when

27、J =result := 74;when K =result := 75;when L =result := 76;when M =result := 77;when N =result := 78;when O =result := 79;when P =result := 80;when Q =result := 81;when R =result := 82;when S =result := 83;when T =result := 84;when U =result := 85;when V =result := 86;when W =result := 87;when X =res

28、ult := 88;when Y =result := 89;when Z =result := 90;when =result := 91;when =result := 92;when =result := 93;when =result := 94;when _ =result := 95;when =result := 96;when a =result := 97;when b =result := 98;when c =result := 99;when d =result := 100;when e =result := 101;when f =result := 102;whe

29、n g =result := 103;when h =result := 104;when i =result := 105;when j =result := 106;when k =result := 107;when l =result := 108;when m =result := 109;when n =result := 110;when o =result := 111;when p =result := 112;when q =result := 113;when r =result := 114;when s =result := 115;when t =result :=

30、 116;when u =result := 117;when v =result := 118;when w =result := 119;when x =result := 120;when y =result := 121;when z =result := 122;when =result := 123;when | =result := 124;when =result := 125;when =result := 126;whenothers = result :=32;end case;return result;end function;begin process (address)begincase address iswhen 0000000 =datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata=conv_std_logic_vector(char_to_integer ( 0) ,8);when 0010101

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号