基于FPGA的数字系统设计与实践课件.ppt
《基于FPGA的数字系统设计与实践课件.ppt》由会员分享,可在线阅读,更多相关《基于FPGA的数字系统设计与实践课件.ppt(199页珍藏版)》请在三一办公上搜索。
1、第六章 综合数字系统实例,6.1 矩阵键盘扫描接口设计6.2 交通灯控制的设计6.3 6层电梯控制器的设计6.4 快速傅里叶变换FFT处理器的设计,第六章 综合数字系统实例6.1 矩阵键盘扫描接口设,本章分别以矩阵键盘扫描接口、交通灯控制、6层电梯、快速傅里叶变换FFT处理器四个实例的详细设计,帮助读者深入学习理解FPGA的设计思想、方法。,本章分别以矩阵键盘扫描接口、交通灯控制、6层电梯、快速,6.1 矩阵键盘扫描接口设计,本节介绍矩阵式键盘扫描接口设计,该实例的目的在于学习复杂数字系统的设计思想,掌握矩阵式键盘输入阵列的设计方法。,6.1 矩阵键盘扫描接口设计 本节介绍矩,6.1.1 实例
2、内容说明,在电子、控制、信息处理等各种系统中,操作人员经常需要向系统输入数据和命令来实现人机通信。实现人机通信最常用的输入设备是键盘。在EDA技术的综合应用设计中,常用的键盘输入电路有独立式键盘输入电路、矩阵式键盘输入电路和“虚拟式”键盘输入电路。,6.1.1 实例内容说明 在电子、控制、信息处理,所谓矩阵式键盘输入电路,就是将水平键盘扫描线和垂直输出译码线的交叉处通过一个按键来连通,再通过一个键盘输入译码电路,将各种键盘扫描线和垂直输出译码线信号的不同组合编码转换成一个特定的输入信号值或输入信号编码。利用这种行列矩阵结构的键盘,只需N个行线和M个列线即可组成NM按键。矩阵式键盘输入电路的优点
3、是当需要键数较多时,可以节省I/O口线;缺点是编程相对困难。,所谓矩阵式键盘输入电路,就是将水平键盘扫描线和垂直输,本实验使用实验设备上的键盘单元设计一个44矩阵键盘的扫描译码电路。此设计包括键盘扫描模块和扫描码锁存模块,实现每按下键盘阵列的一个按键立即在七段数码管上显示相应的数值。 本实例设计中,主要涉及到VHDL语言的case语句的应用,以及Quartus II开发工具的逻辑分析仪(SignalTap II Logic Analyzer)的使用。,本实验使用实验设备上的键盘单元设计一个44矩阵键盘,6.1.2 设计思路与原理,键盘输入接口一般有两种方式:一个按键对应一个输入引脚方式和矩阵扫
4、描方式。前者原理比较简单,如图6.1所示,按键一端(这里称作左端)接地;另一端(这里称作右端)通过一个电阻R上拉到VCC,并且接FPGA的输入引脚。如果按键没有被按下即按键两端是断开的,由于右端通过一个电阻R上拉到VCC,此时FPGA的输入引脚的输入值为高;如果按键被按下即按键的左端和右端连通到地,此时FPGA的输入引脚的输入值为低。,6.1.2 设计思路与原理 键盘输入接口一般有两,图6.1 一个按键对应一个输入引脚的按键原理图,图6.1 一个按键对应一个输入引脚的按键原理图,一个按键对应一个输入引脚的按键方式的优点是原理简单、实现方便;缺点是每个按键都需要占用一个FPGA的I/O引脚,按键
5、数量多,而FPGA的可用引脚又不够丰富的情况下,这个缺点是不能忽视的,甚至是不能容忍的。而键盘的矩阵扫描方式正好能很好解决这个问题。相对一个按键对应一个输入引脚的按键方式,矩阵扫描方式的优点就是在按键数量一定的情况下,占用FPGA的I/O引脚数量你那个有效减少。假设按键的数量为M*N个,则所需的FPGA的I/O引脚数量为M+N个。但是矩阵扫描方式的原理也相对一个按键对应一个输入引脚的按键方式更为复杂,矩阵键盘的原理图如图6.2所示。,一个按键对应一个输入引脚的按键方式的优点是原理简单、,图6.2 矩阵键盘的原理图,图6.2 矩阵键盘的原理图,首先对矩阵键盘的每个按键进行编码,编码如图6.2所示
6、(0000、0001、1110、1111)。由于COL通过电阻上拉到VCC,因此当没有键被按下时,COL的值为“1111”;当有按键被按下(假设被按下的键是编码为“0000”的键)时,FPGA输出的行扫描信号ROW连续为“1110”“1101”“1011”“0111”,当ROW等于“1110”即ROW0为低时,COL0也为低,则表示FPGA判断出编码为“0000”的按键被按下,FPGA输出有按键被按下的指示信号和该按键的编码。FPGA的输入/输出接口如图6.3所示。,首先对矩阵键盘的每个按键进行编码,编码如图6.2所,图6.3 键盘扫描输入电路顶层设计电路图,图6.3 键盘扫描输入电路顶层设计
7、电路图,6.1.3 程序设计与验证,有了设计思路与原理,接下来要做的就是具体的实现过程与验证。,6.1.3 程序设计与验证 有了设计思路,6.1.3.1 创建Quartus II 工程(1)运行Quartus II 软件,选择菜单FileNew Project Wizard,工程名称及顶层文件名称为“matrikeyscan”,在选择器件设置对话框中选择目标器件,建立新工程。选择FileNew菜单,创建VHDL描述语言设计文件,在文本编辑器界面中编写键盘扫描模块matrikeyscan的VHDL源程序、键盘消抖模块JPCD的VHDL源程序以及D触发器电路DCFQ的VHDL源程序 ,分别保存设计
8、文件并设“matrikeyscan.vhd”为顶层文件。如图4-4所示。,6.1.3.1 创建Quartus II 工程,图6.4 Quartus II新工程创建对话框,图6.4 Quartus II新工程创建对话框,(2)接连单击“Next”按钮到“Family & Device Setting”对话框,进行相应FPGA芯片的设置,本实例所用DE2实验板的Cyclone II系列EP2C35F672C6芯片,如图4-5所示。读者可根据实际情况进行相应调整,点击“Finish”按钮,完成工程创建。,(2)接连单击“Next”按钮到“Family & Devi,图6.5 FPGA芯片设置,图6.
9、5 FPGA芯片设置,6.1.3.2 VHDL代码设计在Quartus II开发环境下,选择“File”-“New”命令或是点击工具栏中的 图标,在弹出的“New”对话框中,选择“VHDL File”单击“OK”按钮,如图6.6所示。,6.1.3.2 VHDL代码设计,图6.6 “New”对话框,图6.6 “New”对话框,在代码编辑窗口输入设计代码分别如下:-键盘输入消抖电路的VHDL源程序。 JPXD.VHD-由于本设计中使用的矩阵式键盘是机械开关结构,因此在开关切换的瞬间会在-接触点出现信号来回弹跳的现象,从而会造成误动作影响键盘操作的正确性。-出现弹跳的原因是:虽然只是按下按键一次然后
10、放掉,然而实际产生的按键信号-却不止跳动一次,经过取样信号的检查后,将会造成误判断,以为键盘按了两次。-如果调整抽样频率可以改善弹跳现象,因此必须加上弹跳清除电路,避免误操作信号,在代码编辑窗口输入设计代码分别如下:,-的发生。弹跳消除电路所使用的脉冲信号的频率必须比其他电路使用的脉冲信号的频率-更高;通常将扫描电路的工作频率定在24Hz左右,而将弹跳消除电路的工作频率定在128Hz-左右,其工作频率通常是前者的4倍或者更高library ieee;use ieee.std_logic_1164.all;entity jpxd is port(d_in : in std_logic;,-的发生
11、。弹跳消除电路所使用的脉冲信号的频率必须比其他电路,clk : in std_logic;dd1,dd0,qq1,qq0: out std_logic;d_out:out std_logic);d_out1:out std_logic);end entity jpxd ;architecture behv of jpxd is component dcfq is port(clk: in std_logic; -时钟信号 clrn: in std_logic; -清零信号 prn: in std_logic; -预置信号 d: in std_logic;,clk : in std_logic;
12、,q: out std_logic); end component dcfq; signal vcc,inv_d:std_logic; signal q0,q1:std_logic; signal d1,d0:std_logic; begin vccclk,clrn=inv_d,prn=vcc,d=vcc,q=q0); umn2:dcfq port map(clk=clk,clrn=q0,prn=vcc,d=vcc,q=q1);,q: out std_logic);,process(clk) begin if clkevent and clk=1 then d0=not q1; d1=d0;
13、end if;end process; -dd0=d0;dd1=d1;qq1=q1;qq0=q0; d_out = not(d1 and not d0); - d_out1=not q1;end architecture behv;,process(clk),-键盘扫描电路的vhdl源程序:jpscan.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity jpscan is port(sclk : in std_l
14、ogic; -系统时钟:1khZ yline : in std_logic_vector(4 downto 1); -y列按键输入 rclk : out std_logic; -x行键盘扫描时钟,-键盘扫描电路的vhdl源程序:jpscan.vhd,yxd : out std_logic_vector(3 downto 0); -y列消抖输出 data : out std_logic_vector(7 downto 0); -数字输出 xrow : out std_logic_vector(4 downto 1);-x行键盘扫描end entity jpscan; architecture b
15、ehv of jpscan is component jpxd is port(d_in : in std_logic; clk : in std_logic; d_out:out std_logic); end component jpxd;,yxd : out std_logic_vector(,signal clk:std_logic; -控制电路工作时钟:512hZ signal key_scan : std_logic_vector(1 downto 0);-键盘扫描时钟信号00-01-10-11 signal clk_jpxd : std_logic; -去抖电路工作时钟: sig
16、nal y_xd : std_logic_vector(3 downto 0); -键盘列输入去抖后的寄存器 signal x_scan : std_logic_vector(3 downto 0); -键盘行扫描输出寄存器 -1110-1101-1011-0111 signal value : std_logic_vector(7 downto 0); -,signal clk:std_logic;,按键译码数值寄存器 begin data=value; -信号扫描发生器 counter: block is signal q : std_logic_vector(6 downto 0); -
17、计数器实现分频 begin process(sclk) is begin if sclkevent and sclk=1 then q=q+1; end if;,按键译码数值寄存器,clk=q(0); -控制电路工作时钟:512hZ系统时钟的二分频clk_jpxd=q(2); -去抖时钟信号,大约128hZkey_scan=q(6 downto 5); -产生键盘扫描信号00-01-10-11,大约16hZ end process;x_scan=“1110” when key_scan=“00” else1101 when key_scan=01 Else1011 when key_scan=
18、10 Else0111 when key_scan=11 else,clk=q(0); -控制电路工作时钟:512hZ系统,“1111”;xrow(4 downto 1)yline(1),d_out=y_xd(0),clk=clk_jpxd);u2 : jpxd port map(d_in=yline(2),d_out=y_xd(1),clk=clk_jpxd);u3 : jpxd port map(d_in=yline(3),d_out=y_xd(2),clk=clk_jpxd);,“1111”;,u4 : jpxd port map(d_in=yline(4),d_out=y_xd(3),
19、clk=clk_jpxd);yxd(3 downto 0)=y_xd(3 downto 0);rclk=sclk; -键盘扫描时钟等于控制电路工作时钟:512hZ end block jpxdmk;key_decoder : block is -键盘译码模块signal z:std_logic_vector(5 downto 0);begin process(clk) begin z=key_scan,u4 : jpxd port map(d_in=yline,if clkevent and clk=1 thencase z iswhen “001110” = value value valu
20、e value value value value value value value value=01110111; -a,if clkevent and clk=1 then,when “111011” = value value value value value value=“00000000”; -otherend case;end if;end process;end block key_decoder;end architecture behv;,when “111011” = value=“01111,-输出锁存器vhdl源程序:reg.vhdllibrary ieee;use
21、 ieee.std_logic_1164.all;entity reg is port( rclk : in std_logic; -扫描时钟yxd : in std_logic_vector(3 downto 0); -y列消抖输入data : in std_logic_vector(7 downto 0); -输入数据led : out std_logic_vector(7 downto 0);-锁存数据输出end entity reg;,-输出锁存器vhdl源程序:reg.vhdl,architecture behv of reg is signal rst : std_logic; -
22、锁存器复位清零 signal olddata : std_logic_vector(7 downto 0);-锁存器旧数据 signal newdata : std_logic_vector(7 downto 0);-锁存器新数据 begin process(rclk) begin if rclkevent and rclk=1 then rst=yxd(3) and yxd(2) and yxd(1) and yxd(0); -判断是否有按键按下,architecture behv of reg is,end if;end process;process(rst) is begin if(r
23、st=1) then -rst=1没有按键按下 newdata=olddata; else olddata=data; -rst=0有按键按下打入新数据 end if; led=newdata; end process;end architecture behv;,end if;,完成代码编写后,选择“Processing”“Start Compilation”命令或是单击工具栏中的 图标对代码进行编译。编译正确完成后,选择“Assignment”“Pin Planer”命令或是单击工具栏 图标,进行FPGA引脚分配,具体分配如图6.7所示。,完成代码编写后,选择“Processing”“St
24、art,图6.7 FPGA引脚分配,图6.7 FPGA引脚分配,引脚分配完成后,选择“Processing”“Start” “Start I/O Assignments Analysis”命令进行FPGA引脚分配的合法性验证。通过FPGA引脚分配的合法性验证后,选择“Processing”“Start Compilation”命令或是单击工具栏中的 图标对代码进行编译。编译无误,即完成了矩阵键盘扫描的设计阶段。,引脚分配完成后,选择“Processing”“Start,6.1.3.3 矩阵键盘扫描的验证 完成矩阵键盘扫描的代码设计之后,需要对该设计进行验证。验证有两种方式:一种为软件仿真,另一
25、种为硬件测试。在进行测试之前准备好开发板、Altera下载缆、电源。 为了能让读者简单明了清楚实验过程,笔者在工程中加入SignalTap II Logic Analyzer文件,该功能是Quartus II开发工具自带的逻辑分析仪,它的工作原理是通过JTAG缆,把所需要观察的FPGA的引脚、信号的值传到电脑上,在“SignalTap II Logic Analyzer”窗口中显示,实现FPGA的在线调试。,6.1.3.3 矩阵键盘扫描的验证,选择“File”“New”命令或是单击工具栏中的 图标,在弹出的“New”对话框中,选择“Other File”选项卡,选择“SignalTap II
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 数字 系统 设计 实践 课件

链接地址:https://www.31ppt.com/p-1720880.html