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

    基于FPGA的数字系统设计与实践课件.ppt

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

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

    基于FPGA的数字系统设计与实践课件.ppt

    第六章 综合数字系统实例,6.1 矩阵键盘扫描接口设计6.2 交通灯控制的设计6.3 6层电梯控制器的设计6.4 快速傅里叶变换FFT处理器的设计,第六章 综合数字系统实例6.1 矩阵键盘扫描接口设,本章分别以矩阵键盘扫描接口、交通灯控制、6层电梯、快速傅里叶变换FFT处理器四个实例的详细设计,帮助读者深入学习理解FPGA的设计思想、方法。,本章分别以矩阵键盘扫描接口、交通灯控制、6层电梯、快速,6.1 矩阵键盘扫描接口设计,本节介绍矩阵式键盘扫描接口设计,该实例的目的在于学习复杂数字系统的设计思想,掌握矩阵式键盘输入阵列的设计方法。,6.1 矩阵键盘扫描接口设计 本节介绍矩,6.1.1 实例内容说明,在电子、控制、信息处理等各种系统中,操作人员经常需要向系统输入数据和命令来实现人机通信。实现人机通信最常用的输入设备是键盘。在EDA技术的综合应用设计中,常用的键盘输入电路有独立式键盘输入电路、矩阵式键盘输入电路和“虚拟式”键盘输入电路。,6.1.1 实例内容说明 在电子、控制、信息处理,所谓矩阵式键盘输入电路,就是将水平键盘扫描线和垂直输出译码线的交叉处通过一个按键来连通,再通过一个键盘输入译码电路,将各种键盘扫描线和垂直输出译码线信号的不同组合编码转换成一个特定的输入信号值或输入信号编码。利用这种行列矩阵结构的键盘,只需N个行线和M个列线即可组成NM按键。矩阵式键盘输入电路的优点是当需要键数较多时,可以节省I/O口线;缺点是编程相对困难。,所谓矩阵式键盘输入电路,就是将水平键盘扫描线和垂直输,本实验使用实验设备上的键盘单元设计一个44矩阵键盘的扫描译码电路。此设计包括键盘扫描模块和扫描码锁存模块,实现每按下键盘阵列的一个按键立即在七段数码管上显示相应的数值。 本实例设计中,主要涉及到VHDL语言的case语句的应用,以及Quartus II开发工具的逻辑分析仪(SignalTap II Logic Analyzer)的使用。,本实验使用实验设备上的键盘单元设计一个44矩阵键盘,6.1.2 设计思路与原理,键盘输入接口一般有两种方式:一个按键对应一个输入引脚方式和矩阵扫描方式。前者原理比较简单,如图6.1所示,按键一端(这里称作左端)接地;另一端(这里称作右端)通过一个电阻R上拉到VCC,并且接FPGA的输入引脚。如果按键没有被按下即按键两端是断开的,由于右端通过一个电阻R上拉到VCC,此时FPGA的输入引脚的输入值为高;如果按键被按下即按键的左端和右端连通到地,此时FPGA的输入引脚的输入值为低。,6.1.2 设计思路与原理 键盘输入接口一般有两,图6.1 一个按键对应一个输入引脚的按键原理图,图6.1 一个按键对应一个输入引脚的按键原理图,一个按键对应一个输入引脚的按键方式的优点是原理简单、实现方便;缺点是每个按键都需要占用一个FPGA的I/O引脚,按键数量多,而FPGA的可用引脚又不够丰富的情况下,这个缺点是不能忽视的,甚至是不能容忍的。而键盘的矩阵扫描方式正好能很好解决这个问题。相对一个按键对应一个输入引脚的按键方式,矩阵扫描方式的优点就是在按键数量一定的情况下,占用FPGA的I/O引脚数量你那个有效减少。假设按键的数量为M*N个,则所需的FPGA的I/O引脚数量为M+N个。但是矩阵扫描方式的原理也相对一个按键对应一个输入引脚的按键方式更为复杂,矩阵键盘的原理图如图6.2所示。,一个按键对应一个输入引脚的按键方式的优点是原理简单、,图6.2 矩阵键盘的原理图,图6.2 矩阵键盘的原理图,首先对矩阵键盘的每个按键进行编码,编码如图6.2所示(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 键盘扫描输入电路顶层设计电路图,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源程序 ,分别保存设计文件并设“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.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-由于本设计中使用的矩阵式键盘是机械开关结构,因此在开关切换的瞬间会在-接触点出现信号来回弹跳的现象,从而会造成误动作影响键盘操作的正确性。-出现弹跳的原因是:虽然只是按下按键一次然后放掉,然而实际产生的按键信号-却不止跳动一次,经过取样信号的检查后,将会造成误判断,以为键盘按了两次。-如果调整抽样频率可以改善弹跳现象,因此必须加上弹跳清除电路,避免误操作信号,在代码编辑窗口输入设计代码分别如下:,-的发生。弹跳消除电路所使用的脉冲信号的频率必须比其他电路使用的脉冲信号的频率-更高;通常将扫描电路的工作频率定在24Hz左右,而将弹跳消除电路的工作频率定在128Hz-左右,其工作频率通常是前者的4倍或者更高library ieee;use ieee.std_logic_1164.all;entity jpxd is port(d_in : in std_logic;,-的发生。弹跳消除电路所使用的脉冲信号的频率必须比其他电路,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;,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; 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_logic; -系统时钟: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 behv 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; -去抖电路工作时钟: signal 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); -计数器实现分频 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=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),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 value 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 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; -锁存器复位清零 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(rst=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”“Start,图6.7 FPGA引脚分配,图6.7 FPGA引脚分配,引脚分配完成后,选择“Processing”“Start” “Start I/O Assignments Analysis”命令进行FPGA引脚分配的合法性验证。通过FPGA引脚分配的合法性验证后,选择“Processing”“Start Compilation”命令或是单击工具栏中的 图标对代码进行编译。编译无误,即完成了矩阵键盘扫描的设计阶段。,引脚分配完成后,选择“Processing”“Start,6.1.3.3 矩阵键盘扫描的验证 完成矩阵键盘扫描的代码设计之后,需要对该设计进行验证。验证有两种方式:一种为软件仿真,另一种为硬件测试。在进行测试之前准备好开发板、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 Logic Analyzer File”选项,单击“OK”按钮,如图6.9所示。,选择“File”“New”命令或是单击工具栏中的,图6.8 新建SignalTap II Logic Analyzer File,图6.8 新建SignalTap II Logic An,在“SignalTap II Logic Analyzer File”窗口中,单击“Signal Configuration”下面的 按钮进行采样时钟设置,在弹出的对话框中选择“clkreg”,单击 移到右边编辑框,单击“OK”按钮退出,如图6.9所示。,在“SignalTap II Logic Analyzer,图6.8 新建SignalTap II Logic Analyzer File,图6.8 新建SignalTap II Logic An,在“SignalTap II Logic Analyzer File”窗口中,单击“Signal Configuration”下面的 按钮进行采样时钟设置,在弹出的对话框中选择“clkreg”,单击 移到右边编辑框,单击“OK”按钮退出,如图6.9所示。,在“SignalTap II Logic Analyzer,图6.9 采样时钟时钟,图6.9 采样时钟时钟,接着进行所要观察信号的设置,单击“Signal Configuration” 下面的 按钮,在弹出的对话框中进行所要观察信号的相应设置,设置方法如同采样时钟的设置,如同6.10所示,单击“OK”按钮退出。,接着进行所要观察信号的设置,单击“Signal Config,图6.10 所需观察信号的设置,图6.10 所需观察信号的设置,所需观察信号设置之后,在“Sample depth:”下拉列表框中选择“128”。这个数字选得越大,表示存储所观察信号时间窗口越长,当然所需的片内RAM越多。读者可以根据实际情况进行相应调整。最后对信号的显示格式进行设置,总线(大于1位的信号)显示格式有二进制、八进制、十进制、十六进制等。在COL信号上单击鼠标右键,在弹出的快捷菜单中选择“Bus Display Format”“Binary”命令,如图4-11所示。另外,keyout、ROW也需要进行相应设置。,所需观察信号设置之后,在“Sample depth:,图6.11 信号显示格式设置,图6.11 信号显示格式设置,保存SignalTap II Logic Analyzer File为matrikeyscan.stp。在弹出的对话框(如图6.12所示),系统提示是否为当前工程使能matrikeyscan.stp文件,单击“是”按钮完成SignalTap II Logic Analyzer File文件的创建。选择“Processing”“Start Compilation”命令或是单击工具栏中的 图标对整个工程进行编译。,保存SignalTap II Logic Analyzer,图6.12 系统提示,图6.12 系统提示,把准备好的开发板接上JTAG缆,通上电。对JTAG进行相应设置,如图6.13所示。,图6.13 JTAG设置,把准备好的开发板接上JTAG缆,通上电。对JTAG进行相应设,单击 对FPGA进行配置,配置完成之后,按下编码为“0000”的按键,单击工具栏中的 图标,进行信号获取,如图6.14所示。图6.14说明:由于编码为“0000”的按键被按下,当行扫描信号ROW输出为“1110”时,列扫描信号输入为“1110”及表示编码为“0000”的按键被按下,按键指示信号为高。,图6.14 按下编码为“0000”的按键,单击 对FPGA进行配置,配置完成之后,按下编码为“000,按下编码为“0101”的按键,单击工具栏中的 图标,进行信号获取,如图6.15所示。图6.15说明:由于编码为“0101”的按键被按下,当行扫描信号ROW输出为“1011”时,列扫描信号输入为“1101”即表示编码为“0101”的按键被按下,按键指示信号为高。,图6.15 按下编码为“0000”的按键,按下编码为“0101”的按键,单击工具栏中的 图标,进行信号,当没有任何按键被按下时,单击工具栏中的 图标,进行信号获取,如图6.16所示。图6.16说明:由于没有任何的按键被按下,当行扫描信号ROW输出为“1110”、“1101”、“1011”、“0111”时,列扫描信号输入始终为“1111”,按键指示信号一直为低。至此,整个工程的硬件测试得到通过,矩阵键盘扫描的设计完成。,图6.16 按下编码为“0000”的按键,当没有任何按键被按下时,单击工具栏中的 图标,进行信号获取,,6.1.4 实例总结,本节首先对矩阵键盘扫描的原理进行分析,然后设计出矩阵键盘扫描的VHDL设计文件。为了能直观了解设计的正确性,在工程加入了SignalTap II Logic Analyzer File,对设计进行硬件测试。读者通过学习,可以了解Quartus II开发工具的一般过程,以及SignalTap II Logic Analyzer的使用方法。,6.1.4 实例总结本节首先对矩阵键盘扫描的原理进行分,6.2 交通灯控制的设计,交通灯的应用十分广泛,本节介绍如何利用FPGA完成对交通灯的控制设计,让读者学习综合数字系统的设计方法,掌握FPGA设计交通灯控制的原理及方法。,6.2 交通灯控制的设计交通灯的应用十分广泛,本节介绍,6.2.1 实例内容说明,依人们的交通常规,“红灯停,绿灯行,黄灯提醒”,其交通灯的燃灭规律为:初始态是两个路口的红灯全亮。之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向开始通行,同时从15秒开始倒计时。倒计时到5秒时,东西路口绿灯开始闪烁,倒计时到1秒时东西绿灯灭,黄灯开始亮。倒计时到0秒后,东西路口红灯亮,同时南北路口的绿灯亮,南北方向开始通行,同样从15秒开始倒计时,再切换到东西路口方向,以后周而复始的重复上述过程。如图6.17所示为十字路口交通灯示意图。,6.2.1 实例内容说明 依人们的交通常规,“红,图6.17 十字路口交通灯示意图,图6.17 十字路口交通灯示意图,6.2.2 设计思路与原理,本程序设计的电路主要为时序电路,其实时性容易得到保证,难点在于控制逻辑,在于如何保证主干道信号灯与支路信号灯的同步。 本例涉及时序电路的设计、逻辑控制方法运用,以及Quartus II的仿真设计。,6.2.2 设计思路与原理 本程序设计的电路主要,图6.18 交通灯控制顶层设计电路图,交通灯控制器由单片CPLD/FPGA来实现,整个系统由七个单元电路组成,顶层原理图如图6.18所示,图6.18 交通灯控制顶层设计电路图交通灯控制器由单片C,图6.18中的七个单元电路分别为: 交通灯控制器单元JTDKZH:根据主干道、支干道输入信号SM、SB及时钟信号CLK,发出主、支干道指示灯的控制信号,同时向各个定时单元CNT45S、CNT25S、CNT5S,显示控制单元XSKZH发出使能控制信号EN45、EN25、EN05M、EN05B。 定时单元CNT45S、CNT25S、CNT5S分别实现45秒、25秒、5秒钟的定时,根据SM、SB、CLK及JTDKZH单元发出的相关使能控制信号EN45、EN25、EN05M、EN05B按要求进行定时,并将其输出传送到显示控制单元XSKZH。,图6.18中的七个单元电路分别为:,显示控制单元XSKZH:根据交通灯控制器单元JTDKZH发出的有关使能控制信号EN45、EN25、EN05M、EN05B选择定时单元CNT45S、CNT25S、CNT5S的输出传送到显示单元DISPLAY。 显示单元DISPLAY:根据显示控制单元XSKZH发出的数据,把需要显示的数据传送给相应七段数码管的段选和位选信号。段选信号动态扫描相应的数码管,位选信号输出到译码单元BCD_LED。,显示控制单元XSKZH:根据交通灯控制器单元JTDK,译码单元BCD_LED:将显示单元DISPLAY发出的位选信号进行七段译码,用于在数码管上显示正确的数据。 本实验要求设计一个由一条主干道和一条支干道的汇合点形成的十字路口的交通灯控制器,具体要求如下:(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。(2)主干道处于长允许通行状态,而支干道有车来时才允许通行。当主干道允许通行亮绿灯时,支干道亮红灯。而支干道允许通行亮绿灯时,主干道亮红灯。,译码单元BCD_LED:将显示单元DISPLAY发出,(3)当主干道、支干道均有车时,两者交替允许通行,主干道每次通行45秒,支干道每次通行25秒,在每次由绿灯向红灯转换的过程中,要亮5秒的黄灯作为过渡,并进行减计时显示。,(3)当主干道、支干道均有车时,两者交替允许通行,主干道每次,6.2.3 程序设计与注释,(1)运行QuartusII 软件,分别建立新工程,选择FileNew菜单,创建VHDL描述语言设计文件,分别编写JTDKZH.VHD、CNT45S.VHD、CNT25S.VHD、CNT5S.VHD、XSKZH.VHD、DISPLAY.VHD及BCD_LED.VHD源程序。根据前述实验内容自行设计CNT45S、CNT25S、CNT5S、DISPLAY 、BCD_LED单元,完成其功能,然后按照Quartus II设计流程进行编译仿真,验证时序要求。,6.2.3 程序设计与注释(1)运行QuartusII,-JTDKZH.VHD -library ieee;use ieee.std_logic_1164.all;entity jtdkzh is port(clk,sm,sb : in std_logic; -sm、sb为主干道、支干道指示灯控制信号 mr,my,mg,br,by,bg : out std_logic); -mr:主干道红灯; -my:主干道黄灯; -mg:主干道绿灯;,-JTDKZH.VHD -,-br:从干道红灯; -by:从干道黄灯; -bg:从干道绿灯;end entity jtdkzh;architecture behv of jtdkzh is type state_type is(a,b,c,d); signal state:state_type; begin cnt: process(clk) is,-br:从干道红灯;,variable s: integer range 0 to 45; variable clr,en:bit; begin if(clkevent and clk=1) thenif clr=0 then -clr=0时s=0s:=0;elsif en=0 thens:=s; -clr=1、en=0时s=selse -clr=1、en=1时s自加1s:=s+1;end if;,variable s: integer range 0 to,case state iswhen a=mr=0;my=0;mg=1;br=1;by=0;bg=0;-a状态:主干道绿灯亮、从干道红灯亮if(sb and sm)=1 then -sb=1,sm=1说明if s=45 then -判断s是否等于45? state=b;clr:=0;en:=0; -s45则跳转到b状态else state=a;clr:=1;en:=1; -s/=45保持a状态,case state is,-clr=1、en=1时s自加1end if; elsif(sb and(not sm)=1 then -sb=1,sm=0说明statemr=0;my=1;mg=0;br=1;by=0;bg=0;-b状态:主干道黄灯亮、从干道红灯亮,if s=5 then statemr=1;my=0;mg=0;br=0;by=0;bg=1;-c状态:主干道红灯亮、从干道绿灯亮 if(sm and sb)=1 then,if s=5 then,if s=25 then -s25则跳转到d状态state=d;clr:=0;en:=0;Elsestate=c;clr:=1;en:=1; -s/=25保持c状态-clr=1、en=1时s自加1end if;elsif sb =0 thenstate=d;clr:=0;en:=0;Elsestate=c;clr:=1;en:=1;end if;,if s=25 then -s2,when d=mr=1;my=0;mg=0;br=0;by=1;bg=0;-d状态:主干道红灯亮、从干道黄灯亮if s=5 thenstate=a;clr:=0;en:=0;Elsestate=d;clr:=1;en:=1;end if;end case;end if;end process cnt;end architecture behv;,when d=mr=1;my=0;mg=0,- CNT45S.VHD -library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt45s is port(sb,clk,en45 : in std_logic; dout45m,dout45b : out std_logic_vector(7 downto 0);end entity cnt45s;architecture behv of cnt45s is signal cnt6b:std_logic_vector(5 downto 0); begin,- CNT45S.VHD -,process(sb,clk,en45) is begin if sb=0 then cnt6b=cnt6b-cnt6b-1; elsif(clkevent and clk=1) then if en45=1 then cnt6b=cnt6b+1; elsif en45=0 then cnt6b=cnt6b-cnt6b-1; end if; end if; end process; process(cnt6b) is begin,process(sb,clk,en45) is,case cnt6b iswhen “000000”=dout45mdout45mdout45mdout45m=01000010;dout45b=01000111;,case cnt6b is,when “000100”=dout45mdout45mdout45mdout45mdout45m=00110111;dout45b=01000010;,when “000100”=dout45m=“01000,when 001001=dout45mdout45mdout45mdout45mdout45m=00110010;dout45b=00110111;,when 001001=dout45m=00110,when “001110”=dout45mdout45mdout45mdout45mdout45m=00100111;dout45b=00110010;,when “001110”=dout45m=“00110,when “010011”=dout45mdout45mdout45mdout45mdout45m=00100010;dout45b=00100111;,when “010011”=dout45m=“0010,when “011000”=dout45mdout45mdout45mdout45mdout45m=00010111;dout45b=00100010;,when “011000”=dout45m=“00100,when “011101”=dout45mdout45mdout45mdout45mdout45m=00010010;dout45b=00010111;,when “011101”=dout45m=“00010,when “100010”=dout45mdout45mdout45mdout45m=00001000;dout45b=00010011;,when “100010”=dout45m=“00010,when “100110”=dout45mdout45mdout45mdout45mdout45m=00000011;dout45b=00001000;,when “100110”=dout45m=“00000,when “101011”=dout45mdout45mdout45m=00000000;dout45b=00000000;end case;end process;end architecture behv;,when “101011”=dout45m=“00000,-CNT25S.VHDlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt25s is port(sb,sm,clk,en25 : in std_logic; dout25m,dout25b: out std_logic_vector(7 downto 0);end entity cnt25s;architecture behv of cnt25s is,-CNT25S.VHD,signal cnt5b:std_logic_vector(4 downto 0); begin process(sb,sm,clk,en25) is begin if sb=0 or sm=0 then cnt5b=cnt5b-cnt5b-1; elsif(clkevent and clk=1) then if en25=1 then cnt5b=cnt5b+1;,signal cnt5b:std_logic_vector(,elsif en25=0 then cnt5bdout25b=00100101;dout25m=00110000;,elsif en25=0 then,when 00001=

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开