欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    FPGA课程设计.doc

    • 资源ID:4146443       资源大小:555.50KB        全文页数:17页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    FPGA课程设计.doc

    一 设计目的: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接口,并将CPLD/FPGA的部分IO引脚引出,为用户提供一个帮助用户快速开始可编程逻辑器件学习之旅的硬件平台。三 设计要求: 要求用1602液晶显示字符; 显示内容:学号+英文姓名; 显示方式:流动显示,开关控制字符流动速度及方向;具有暂停和清屏 的功能; 扩展部分:设计汉字字符及其他功能四设计思路及实现方法1. 下图所示1602字符液晶接口与实验板内部相连之图 上图所示是从MARS-1270 CPLD实验版 的手册上截取的1602与实验板相连的图,1,2,3,15,16均与实验板内部电压相连,显示时只需注意给1602的 4-14管脚赋值。 (1)1602引脚定义 1602采用标准的16脚接口,其中: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第1516脚:空脚(2) 1602实际写时每位的地址 第一行:首地址为80H,”10000000”,最多能显示27个数;尾地址为A7H,”10100111” 第二行:首地址为 C0H,”11000000”, 最多能显示27个数;尾地址为 E7H,”11100111” (3) 1602内部1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用 的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地 址41H中的点阵字符图形显示出来,我们就能看到字母“A”LCD1602的工作时序可查阅其他资料下图为CGROM中字符码与字符字模关系对照表从下图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来就是01000001,也就是41H。可见它的代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM 写C51字符代码程序时甚至可以直接用P1'A'这样的方法。PC在编译时就把“A”先转为41H代码了。字符代码0x000x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。0x200x7F 为标准的ASCII 码,0xA00xFF 为日文字符和希腊文字符,其余字符码(0x100x1F及0x800x9F)没有定义。(4)对DDRAM的内容和地址进行操作的指令(只介绍本次设计中涉及的一些) 一清屏指令:使液晶不显示任何东西 二.设定显示屏或光标移动方向指令 三显示模式设置:写程序时从38H开写,是使液晶处于开始状态 四.暂停及流动 指令码 功能0 001Sx00若S=1,则静止不动;为0,流动显示注:上述四个功能均在RS为0时方可写入;若RS为1,则可写入在1602上显示字符的代码;E一般选取系统时钟分频后的时钟;2. 设计思路及实现方法. 根据写1602的一般顺序:(1)开始38H.(2)显示模式设置.(3)显示关闭08H.(4)显示清屏01H.(5)显示光标移动设置06H.(6)显示开及光标移动设置0CH 根据这几步决定用VHDL语言中的状态机描述方式进行编写程序,与其他描述方式相比,状态机的表述丰富多样,程序层次分明,结构清晰,易读易懂; 其中,在设计程序的过程中,由于程序包含地址和显示内容,考虑用到元件例化语句,将每个地址要显示的内容存到相应的元件例化语句中去。元件例化就是将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中的指定端口相连接。 五程序源文件与设计结果分析1.显示内容:学号+英文姓名library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.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 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_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"-/移位调整-/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 显示数据储存器地址ADD 第二行开头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 : integer 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_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_logic; -显示左移还是右移signal zanting: std_logic;-显示暂停还是流动 beginprocess(key)-该部分控制分频步进是1还是5,即是控制字符流动速度begin case key is when '0'=>k<=1; when '1'=>k<=5; when others=>null; end case;end process;process(key1)该部分控制液晶整屏左移还是右移1是左移, 0右移begincase key1 is when '1'=>yi<='1' when '0'=>yi<='0' when others=>null; end case;end process;process(key2)该部分控制整屏暂停还是流动1暂停,0流动begincase key2 is when '1'=>zanting<='1' when '0'=>zanting<='0' when others=>null; end case;end process;process(clk,reset)begin if(reset='0')thenclkcnt<="0000000000000000000" elsif(clk'event 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.5ms产生计数溢出脉冲 '0' process(tc_clkcnt,reset)begin if(reset='0')thenclkdiv<='0' elsif(tc_clkcnt'event 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(clkdiv'event and clkdiv='1')thenclk_int<= not clk_int; -/分频 t=50ms f=20hz end if;end process;process(clkdiv,reset)begin if(reset='0')thenlcd_e<='0' elsif(clkdiv'event and clkdiv='0')thenlcd_e<= not lcd_e; -/使能信号翻转 t=100ms f=10hz end if;end process;aa:char_ram2例化程序port map( address=>char_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=SWITCHMODE 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,且光标加1"00001100" when state =SWITCHMODE else -/0x0c-/开显示;不显示光标;光标不闪烁"0001" & zanting & yi &"00" when state = SHIFT else -/0x81-/显示位移;左移"00111100" when state=SETFUNCTION else-/0x3C-/8位;两行显示16*2 ; 字体5*10"01000000" when state =SETCGRAM else -/0x40 字符发生器储存器地址ACG"10000000" when state =SETDDRAM and counter =0 else -/0x80 显示数据储存器地址ADD "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 counter<40 else -/默认第一个字符地址为0x80 -/ 0-39conv_std_logic_vector( counter,7) when state= WRITERAM and counter>40 and counter<88 else -/counter>40 and counter<73 相当于在第二行中后移8个字符显示以区分第一行8-39conv_std_logic_vector( counter,7) when state= WRITERAM and counter>88 and counter<89 else -/counter>73 and counter<81 1-7"0000001" process(clk_int,Reset) begin if(Reset='0')then state<=IDLE; counter<=0; flag<='0' div_counter<=0; elsif(clk_int'event and clk_int='1')then -/分频 t=50ms f=20hz case state iswhen IDLE => -/(1)if(flag='0')then state<=SETFUNCTION; -/-/0x3C-/8位;两行显示16*2 ; flag<='1' counter<=0; -/初始地址 div_counter<=0;else if(div_counter<DIVSS )then -/constant DIVSS : integer :=15; div_counter<=div_counter +1; state<=IDLE; else div_counter<=0; state <=SHIFT; -/0x81-/显示位移;左移 -最后一直在这里 移动:t=50ms*15=750ms=0.75s end if;end if;when SETFUNCTION => -/(2)-/-/0x3C-/8位;两行显示16*2 ; state<=SWITCHMODE; when SWITCHMODE =>-/(3)-/0x0c-/开显示;不显示光标;光标不闪烁 state<=CLEAR; when CLEAR =>-/(4) -/0x01-清屏 state<=SETMODE; when SETMODE =>-/(5)-/0x06-/显示光标移动设置,当读或写一个字符后地址指针加1,且光标加1 state<=WRITERAM; when WRITERAM =>-/(6) if(counter =40)then state<=SETDDRAM; counter<=counter+1;elsif(counter/=40 and counter<81)then state<=WRITERAM; counter<=counter+1;elsestate<=SHIFT; -/开始位移end if;when SETDDRAM => -/(7) state<=WRITERAM; when SHIFT => -/(7) state<=IDLE; when SETCGRAM => state<=IDLE;when RETURNCURSOR => state<=WRITERAM;when READFLAG => state<=IDLE;when READRAM => state<=IDLE; when others => state<=IDLE; end case;end if; end process; end Behavioral;元件例化的程序: library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;entity char_ram2 isport( address : in std_logic_vector(6 downto 0) ;data : out std_logic_vector(7 downto 0);end char_ram2;architecture fun of char_ram2 isfunction char_to_integer ( indata :character) return integer isvariable result : integer range 0 to 16#7F#;begincase indata iswhen ' ' =>result := 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 '-' =>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 '' =>result := 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 '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' =>result := 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;when '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 := 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" =>data<=conv_std_logic_vector(char_to_integer (' ') ,8);when "0000001" =>data<=conv_std_logic_vector(char_to_integer ('1') ,8);when "0000010" =>data<=conv_std_logic_vector(char_to_integer ('2') ,8);when "0000011" =>data<=conv_std_logic_vector(char_to_integer ('8') ,8);when "0000100" =>data<=conv_std_logic_vector(char_to_integer ('8') ,8);when "0000101" =>data<=conv_std_logic_vector(char_to_integer ('4') ,8);when "0000110" =>data<=conv_std_logic_vector(char_to_integer ('0') ,8);when "0000111" =>data<=conv_std_logic_vector(char_to_integer ('0') ,8);when "0001000" =>data<=conv_std_logic_vector(char_to_integer ('2') ,8);when "0001001" =>data<=conv_std_logic_vector(char_to_integer (' ') ,8);when "0001010" =>data<=conv_std_logic_vector(char_to_integer ('Y') ,8);when "0001011" =>data<=conv_std_logic_vector(char_to_integer ('Q') ,8);when "0001100" =>data<=conv_std_logic_vector(char_to_integer ('Q') ,8);when "0001101" =>data<=conv_std_logic_vector(char_to_integer (' ') ,8);when "0001110" =>data<=conv_std_logic_vector(char_to_integer (' ') ,8);when "0001111" =>data<=conv_std_logic_vector(char_to_integer (' 1') ,8);when "0010000" =>data<=conv_std_logic_vector(char_to_integer ('2') ,8);when "0010001" =>data<=conv_std_logic_vector(char_to_integer ('8') ,8);when "0010010" =>data<=conv_std_logic_vector(char_to_integer ('8') ,8);when "0010011" =>data<=conv_std_logic_vector(char_to_integer (' 4') ,8);when "0010100" =>data<=conv_std_logic_vector(char_to_integer (' 0') ,8);when "0010101

    注意事项

    本文(FPGA课程设计.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开