北邮数电综合实验报告
北邮-电子电路综合设计实验(函数信号发生器)报告

电子电路综合设计实验报告实验1 函数信号发生器的设计与实现姓名:------学号:----------班内序号:--一. 实验名称:函数信号发生器的设计与调试二.实验摘要:采用运放组成的积分电路产生方波-三角波,可得到比较理想的方波和三角波。
根据所需振荡频率的高低和对方波前后沿陡度的要求以及对所需方波、三角波的幅度可以确定合适的运放以及稳压管的型号、所需电阻的大小和电容的值。
三角波-正弦波的转换是利用差分放大器来完成的,选取合适的滑动变阻器来调节三角波的幅度以及电路的对称性。
同时利用隔直电容、滤波电容来改善输出正弦波的波形。
关键词:方波三角波正弦波频率可调三、设计任务要求1.基本要求:(1)输出频率能在1-10KHz范围内连续可调,无明显失真;(2)方波输出电压Uopp=12V,上升、下降沿小于10us,占空比可调范围30%-70%;(3)三角波Uopp=8V;(4)正弦波Uopp错误!未找到引用源。
1V.(5)设计该电路的电源电路(不要求实际搭建)2.提高要求:(1)正弦波、三角波和方波输出波形的峰峰值Uopp均可在1V-10V内连续可调。
(2)三种输出波形的输出端口的输出阻抗小于100Ω。
(3)三种波形从同一端口输出,并能够显示当前输出信号的种类、大小和频率(4)用CPLD设计DDS信号源(5)其他函数信号发生器的设计方案四、设计思路以及总体结构框图本课题中函数发生器结构组成如下所示:由比较器和积分器组成方波—三角波产生电路,比较器输出的方波经积分器得到三角波,三角波到正弦波的变换电路主要由差分放大器来完成。
差分放大器具有工作点稳定,输入阻抗高,抗干扰能力较强等优点。
特别是作为直流放大器时,可以有效地抑制零点漂移,因此可将频率很低的三角波变换成正弦波。
波形变换的原理是利用差分放大器传输特性曲线的非线性。
图4-1 函数信号发生器的总体框图五.分块电路和总体电路的设计(1)方波——三角波产生电路图5-1 方波-三角波产生电路方波-三角波产生电路如图5-1所示,由于采用了运放组成的积分电路,可得到理想的方波和三角波。
北京邮电大学数电实验报告

北京邮电大学数字电路与逻辑设计实验发光二极管走马灯的电路设计与实现实验报告学院:信息与通信工程学院班级:27姓名:付莹学号:班内序号:23【实验目的】(1)进一步了解时序电路描述方法;(2)熟悉状态机的设计方法。
【实验所用仪器及元器件】(1)计算机;(2)直流稳压电源;(3)数字系统与逻辑设计实验开发板。
【实验任务要求】设计并实现一个控制8个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。
(1)单点移动模式:一个点在8个发光二极管上来回的亮(2)幕布式:从中间两个点,同时向两边依次点亮直到全亮,然后再向中间点灭,依次往复。
【实验设计思路及过程】(1)设计思路实验要求有两个,一个是单点移动模式,一个是幕布式。
通过CASE-WHEN 语句实现走马灯的变化。
分别定义一个8个变量的数据类型和一个13变量的数据类型,表示一个周期内的灯的变化,并设计一个变量在两种状态间进行切换。
此时,需要把所有状态罗列到case-when中去。
(2)VHDL代码LIBRARY IEEE;USE ABC ISPORT(A,CLK,RESET:IN STD_LOGIC;DENG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ABC;ARCHITECTURE A OF ABC ISTYPE STATE_TEMP is(s0,s1,s2,s3,s4,s5,s6,s7);TYPE STATE_TEMP1 is(s0,s1,s2,s3,s4,s5,s6,s7,s00,s01,s02,s03,s04,s05);signal STATE:STATE_TEMP;signal STATE1:STATE_TEMP1;BEGINPROCESS(CLK,RESET)BEGINIF RESET='1' THENDENG<="00000000";ELSIF(CLK'EVENT AND CLK='0')THENIF A='0'THEN --KAIMUSHICASE STATE1 ISWHEN s0 => STATE1<=s1;DENG<="";WHEN s1 => STATE1<=s2;DENG<="01000000";WHEN s2 => STATE1<=s3;DENG<="00100000";WHEN s3 => STATE1<=s4;DENG<="00010000";WHEN s4 => STATE1<=s5;DENG<="00001000";WHEN s5 => STATE1<=s6;DENG<="00000100";WHEN s6 => STATE1<=s7;DENG<="00000010";WHEN s7 =>STATE1<=s00;DENG<="00000001";WHEN s00=>STATE1<=s01;DENG<="00000010";WHEN s01=>STATE1<=s02;DENG<="00000100";WHEN s02=>STATE1<=s03;DENG<="00001000";WHEN s03=>STATE1<=s04;DENG<="00010000";WHEN s04=>STATE1<=s05;DENG<="00100000";WHEN s05=>STATE1<=s0;DENG <="01000000";END CASE;ELSECASE STATE ISWHEN s0 => STATE<=s1;DENG<="00011000";WHEN s1 => STATE<=s2;DENG<="00111100";WHEN s2 => STATE<=s3;DENG<="01111110";WHEN s3 => STATE<=s4;DENG<="";WHEN s4 => STATE<=s5;DENG<="01111110";WHEN s5 => STATE<=s6;DENG<="00111100";WHEN s6 => STATE<=s7;DENG<="00011000";WHEN s7 => STATE<=s0;DENG<="00000000";END CASE;END IF;END IF;END PROCESS;END A;【仿真波形及分析】1.仿真波形(1)单点移动式(2)幕布式(3)复位信号2.波形分析(1)单点移动式由图可以看出,当A为0时程序实现单点移动功能,如图所示DENG[7]开始亮,之后依次为DENG[6], DENG[5], DENG[4], DENG[3], DENG[2],DENG[1], DENG[0],然后DENG[1]也开始亮,依此类推,实现了功能要求(2)幕布式由图可以看出,当A为1时,如图所示,先是中间的两个灯DENG[4], DENG[5]亮,然后扩展到四个灯亮DENG[3]至DENG[6]亮,接下来是DENG[2]~DENG[7]亮,最后全亮,接着DENG[2]~DENG[7]亮,继而循环下去。
北邮大二下数电实验报告

邮电大学数字电路与逻辑设计实验学院:班级::学号:班序号:实验一一、实验名称Quartus II 原理图输出法设计(一)半加器二、实验任务要求用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
三、设计思路和过程◎设计思路半加器电路是指对两个输入数据位进行加法,输出一个结果位和进位,不产生进位输入的加法器电路,是实现两个一位二进制数的加法运算电路。
数据输入:被加数AI、加数BI数据输出:半加和SO、进位CO◎设计过程(1)列出真值表01 1 010 1 0110 1*表中两个输入是加数AI和BI,输出有一个是和SO,另一个是进位CO。
(2)根据真值表写出输出逻辑表达式该电路有两个输出端,属于多输出组合数字电路,电路的逻辑表达式如下:AI=。
所以,可以用一个两输入异或门和一个两输入与门CO⋅SO⊕BIAI=,BI实现。
◎实验原理图四、仿真波形图及分析根据仿真波形对比半加器真值表,可以确定电路实现了半加器的功能。
但我们也可以发现输出SO出现了静态功能冒险,要消除该冒险可以加入相应的选通脉冲。
(二)全加器二、实验任务要求用实验容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
三、设计思路和过程◎设计思路全加器与半加器的区别在于全加器有一个低进位CI,从外部特性来看,它是一个三输入两输出的器件。
◎设计过程(1)全加器的真值表如下*其中AI 为被加数,BI 为加数,CI 为相邻低位来的进位数。
输出本位和为SO ,向相邻高位进位数为CO 。
(2)根据真值表写出逻辑表达式:CI BI AI SO ⊕⊕=,BI AI CI BI AI CO ⋅+⋅⊕=)(根据逻辑表达式,可以知道只要在半加器的基础上再加入一个异或门、一个两输入与门和两输入或门即可实现全加器。
◎实验原理图。
北邮数电VHDL实验报告

2009级数字电路实验报告实验名称:EDA基础实验学生姓名:班级:班内序号:学号:日期:1.实验要求【实验目的】1.熟悉用QuartusII原理图输入法进行电路设计和仿真;2.掌握QuartusII图形模块单元的生成与调用;3.熟悉用VHDL语言设计组合逻辑电路和时序电路的方法;4.熟悉用QuartusII文本输入法和图形输入法进行电路设计;5.熟悉不同的编码及其之间的转换;6.掌握触发器的逻辑功能及使用方法;7.熟悉计数器、寄存器、锁存器、分频器、移位寄存器的设计方法8.掌握VHDL语言的语法规范,掌握时序电路描述方法;9.掌握多个数码管动态扫描显示的原理及设计方法。
【实验所用仪器及元器件】1.计算机2.直流稳压电源3.数字系统与逻辑设计实验开发板【实验内容】1.用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
2.用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
3.用3线-8线译码器(74LS138)和逻辑门设计实现函数F,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
4.用VHDL语言设计实现一个3位二进制数值比较器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
5.用VHDL语言设计实现一个4选1的数据选择器;一个8421码转换为格雷码的代码转换器;一个举重比赛裁判器;一个带同步置位和同步复位功能的D触发器;一个带异步复位的4位二进制减计数器;一个带异步复位的8421码十进制计数器;一个带异步复位的4位自启动环形计数器;一个带控制端的8位二进制寄存器,当控制端为‘1’时,电路正常工作,否则输出为高阻态;一个分频系数为12,分频输出信号占空比为50%的分频器。
仿真验证其功能,并下载到实验板测试。
北邮大二下数电实验报告

北京邮电大学数字电路与逻辑设计实验学院:班级:姓名:学号:班内序号:实验一一、实验名称Quartus II 原理图输出法设计(一)半加器二、实验任务要求用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
三、设计思路和过程◎设计思路半加器电路是指对两个输入数据位进行加法,输出一个结果位和进位,不产生进位输入的加法器电路,是实现两个一位二进制数的加法运算电路。
数据输入:被加数AI、加数BI数据输出:半加和SO、进位CO◎设计过程,输出有一个是和SO,另一个是进位CO。
(2)根据真值表写出输出逻辑表达式该电路有两个输出端,属于多输出组合数字电路,电路的逻辑表达式如下:AICO⋅=。
所以,可以用一个两输入异或门和一个两输入与门SO⊕=,BIBIAI实现。
◎实验原理图四、仿真波形图及分析根据仿真波形对比半加器真值表,可以确定电路实现了半加器的功能。
但我们也可以发现输出SO出现了静态功能冒险,要消除该冒险可以加入相应的选通脉冲。
(二)全加器二、实验任务要求用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
三、设计思路和过程 ◎设计思路全加器与半加器的区别在于全加器有一个低进位CI ,从外部特性来看,它是一个三输入两输出的器件。
◎设计过程SO ,向相邻高位进位数为CO 。
(2)根据真值表写出逻辑表达式:CI BI AI SO ⊕⊕=,BI AI CI BI AI CO ⋅+⋅⊕=)(根据逻辑表达式,可以知道只要在半加器的基础上再加入一个异或门、一个两输入与门和两输入或门即可实现全加器。
◎实验原理图四、仿真波形图及分析根据仿真波形对比全加器真值表,可以确定电路实现了全加器的功能。
(三)3线—8线译码器二、实验任务要求用3线—8线译码器(74LS138)和逻辑门设计实现函数CBF+A++=,仿真验证其功能,并下载到实验板测试。
北邮数电实验报告-钢琴游戏

北京邮电大学数字电路与逻辑设计实验报告实验名称:简易钢琴游戏院系:电子工程学院专业:班级:姓名:学号:班内序号:一、实验任务及要求任务:设计制作一个简易钢琴游戏机。
基本要求:1、用8*8点阵进行游戏显示。
2、BTN1~BTN7七个按键模拟钢琴演奏时的“1 2 3 4 5 6 7”七个音符。
点阵的第一列对应音符“1”,第二列对应音符“2”,依次类推,地中高音自定。
3、光点在点阵第一行随机出现,逐点下落,下落速度为0.2秒/行。
如下图:4、在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该光点消失,蜂鸣器演奏相应的音符声音,计分器加1。
如果在光点下落到最后一行依然没有进行相应的按键操作,该光点消失,计分器不加分。
计分器由数码管显示。
5、每隔1秒在点阵的不同列的第一行出现一个光点,如下图:6、游戏时间为30秒,数码管倒计时显示。
二、系统设计1、设计思路:简易钢琴游戏主要分为五个单元模块和一个连接模块:Divf:分频模块。
分出1hz,5hz,440hz,5Mhz等用于控制光点的下落、随机数的产生、30秒倒计时、点阵和数码管的扫描及产生其他频率的信号。
Buzz:蜂鸣器模块。
根据声音的不同频率,细化出对应“1 2 3 4 5 6 7”的七种频率,并与相应的按键对应。
Display:数码管模块。
将6段数码管分为两部分,分别控制倒计时和计分,加以扫描和控制。
LED:点阵模块。
控制光点的出现、随机数的产生、光点的换行,加以扫描和控制。
Main:主控制模块。
将每个主要模块之间的输入输出通过数学关系联系到一起。
比如:复位之后点阵和数码管都要重新启动;倒计时30秒结束后点阵关闭,计分器不再计分等。
Pianogame:用COMPONENT代码将每个模块联系起来的顶层程序。
2、系统结构框图3、点阵模块控制框图4、数码管模块控制框图5、模块间信息传递关系6、系统控制模块流程图7、状态转移图1、分频模块仿真:分析:在源代码中,分频系数高达50~500000,无法在仿真波形中体现出来。
北邮数电综合实验迷宫
北京邮电大学理学院2014级数字电路与数字逻辑设计实验报告简易迷宫游戏班级:2014214104学号:2014212788班内序号:17姓名:林玉立2016/6/10目录设计课题 (2)系统设计 (4)设计思路.......................................................................................................... 错误!未定义书签。
4 总体框图. (4)分块介绍 (7)仿真波形 (9)源程序 (11)功能说明 (29)资源利用情况 (29)故障及问题分析 (30)总结和结论 (30)设计课题简易迷宫设计设计并实现一个简易迷宫游戏机。
基本要求:1、用8×8 点阵进行游戏显示。
2、迷宫游戏如图1 所示,采用双色点阵显示,其中红色LED 为迷宫墙壁,绿色LED表示人物。
通过BTN0~BTN3 四个按键控制迷宫中的人物进行上下左右移动,使人物从起始点出发,走到迷宫的出口,游戏结束。
3、普通计时模式:通过按键BTN7 启动游戏,必须在30 秒内找到出口,否则游戏失败,用两个数码管进行倒计时显示。
游戏胜利或者失败均要在8×8 点阵上有相应的画面出现。
4、迷宫中的人物在行走过程中,如果碰到墙壁,保持原地不动。
提高要求:1、多种迷宫地图可以选择。
2、在计时的基础上增加计步的功能,每按一次控制按键步数加1,碰壁不计算步数,计步结果用数码管显示。
3、为游戏增加提示音乐,在不同时间段采用不同频率的信号控制蜂鸣器发声报警。
4、增加其他游戏模式。
5、自拟其它功能。
系统设计§1.设计思路程序采用分模块设计的思路,将具体任务分解成为不同的功能模块,利用component 编写,再通过主程序通过port map语句调用连接。
主程序中包括各个子元件的定义及连接语句,子程序分别为分频器模块、防抖模块、点阵显示模块、迷宫人物坐标控制模块、倒计时控制模块、数码管选择模块和数码管显示模块。
北邮大二下数电实验报告之欧阳历创编
北京邮电大学数字电路与逻辑设计实验学院:班级:姓名:学号:班内序号:实验一一、实验名称Quartus II 原理图输出法设计(一)半加器二、实验任务要求用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
三、设计思路和过程◎设计思路半加器电路是指对两个输入数据位进行加法,输出一个结果位和进位,不产生进位输入的加法器电路,是实现两个一位二进制数的加法运算电路。
数据输入:被加数AI、加数BI数据输出:半加和SO、进位CO◎设计过程(1)列出真值表*表中两个输入是加数AI和BI,输出有一个是和SO,另一个是进位CO。
(2)根据真值表写出输出逻辑表达式该电路有两个输出端,属于多输出组合数字电路,电路的逻辑表达式如下:BICO⋅AIAI=。
所以,可以=,BISO⊕用一个两输入异或门和一个两输入与门实现。
◎实验原理图四、仿真波形图及分析根据仿真波形对比半加器真值表,可以确定电路实现了半加器的功能。
但我们也可以发现输出SO出现了静态功能冒险,要消除该冒险可以加入相应的选通脉冲。
(二)全加器二、实验任务要求用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
三、设计思路和过程◎设计思路全加器与半加器的区别在于全加器有一个低进位CI,从外部特性来看,它是一个三输入两输出的器件。
◎设计过程(1)全加器的真值表如下*其中AI 为被加数,BI 为加数,CI 为相邻低位来的进位数。
输出本位和为SO ,向相邻高位进位数为CO 。
(2)根据真值表写出逻辑表达式:CI BI AI SO ⊕⊕=,BI AI CI BI AI CO ⋅+⋅⊕=)(根据逻辑表达式,可以知道只要在半加器的基础上再加入一个异或门、一个两输入与门和两输入或门即可实现全加器。
◎实验原理图四、仿真波形图及分析根据仿真波形对比全加器真值表,可以确定电路实现了全加器的功能。
北邮数电实验报告
北京邮电大学实验报告实验名称: 数电电路与逻辑设计实验学院:信息与通信工程学院班 级: 姓 名: 学 号: 班内序号:日期:一. 实验一:QuartusII 原理图输入法设计1. 实验名称和实验任务要求(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块 元。
(2)用(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号入信号。
(3)用3线-8线译码器(74LS138)和逻辑门设计实现函数F=A B C +A B C +AB C +A B C 。
2.实验原理图及波形图(1)半加器(2)全加器(3)74LS383.仿真波形图分析(1)半加器:输入为a,b,输出S,CO(进位)。
当ab都为0时,半加和s=0,进位端co=0。
当ab都为1时,半加和s=0,进位端co=1。
当a=1,b=0或a=0,b=1时,半加和s=1,进位端co=0。
(2)全加器:输入a,b,输出S,CO(进位),ci(低进位)。
当a=0,b=0,ci=0,输出s=0,co=0。
当a=0,b=1或a=1,b=0又ci=0,输出s=1,co=0。
当a=0,b=0,ci=1,输出s=1,co=0。
(3)74LS138输入A,B,C,输出为3。
四个输出对应F中的四个最小项,Y0、Y2、Y4、Y7,以实现函数功能。
二.实验二:用VHDL设计与实现组合逻辑电路1.实验名称和实验任务要求(1)用VHDL语言设计实现一个共阴极7段数码管译码器,仿真验证其功能。
要求用拨码开关设定输入信号,7段数码管显示输出信号。
(2)用VHDL语言设计实现一个8421码转换为余3码的代码转换器,仿真验证其功能。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)用VHDL语言设计实现一个4位二进制奇校验器,输入奇数个’1’时,输出为’1’,否则输出’0’,仿真验证其功能。
北邮数电实验报告(猜数字)
题目: 简易猜数字游戏机的设计与实现姓名学院专业班级学号班内序号一、设计课题的任务要求基本要求:1、游戏规则:通常由两个人玩,一方出数字,另一方猜。
出数字的人要想好一个没有重复数字的 4 位数,不能让猜的人知道。
2、数字设置:通过 4*4 键盘进行 4 位数字输入,在数码管(DISP0~DISP3)上显示当前所输入的数字。
通过设置确定键(BTN1 键)进行锁定,此时数码管上的数值消失,同时用点阵开始倒计时,即:初始状态点阵全亮,然后从右下角开始,由右到左、由下到上逐点逐排依次熄灭,间隔时间为 1s,共计 64s。
3、猜数字:可以通过 4*4 键盘进行 4 位数字输入进行猜数字,且每输入一位数字在数码管(DISP0~DISP3)上显示当前所输入的数字,按确定键(BTN2 键)进行确认,此时要根据输入的这组数字给出几 A 几 B,其中:A前面的数字表示位置正确的数的个数,用DISP5显示B前的数字表示数字正确而位置不对的数的个数,用DISP4显示如正确答案为 2134,而猜的人猜 5314,则是1A2B,其中有一个4的位置对了,记为1A,而1和3这三个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B 接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
4、若数字正确则显示猜数字成功,点阵显示“☺”笑脸;若输入数字错误系统仍然处于猜数字状态,点阵显示“X”,并用蜂鸣器或 led 闪烁报警。
5、若到点阵全灭时(64s 结束)仍未猜出正确数字,游戏失败,点阵显示“囧”。
6、设置游戏机开关。
提高要求:1、若数字正确则显示猜数字成功,用蜂鸣器播放一段乐曲。
2、随机产生数字,并不在数码管上显示,进行猜数字游戏,用点阵进行 128s 计时,即点阵轮询熄灭两次,其他要求同基本功能3、4 和 5。
3、自拟其他功能。
二、系统设计设计思路:首先是状态机的设定,设定了5个状态,分别是idle、s1、s2、s3和over。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路与逻辑设计实验题目: 简易出租车计价器学号:姓名:班级:学院:时间:2013/11/4一.设计课题的任务要求设计一台出租车计价器,不同情况具有不同的收费标准。
基本要求:1、行驶公里:用时钟2 秒钟表示出租车匀速行驶1 公里,在行车5 公里以内,按起步价13 元收费,超过5 公里部分,以每公里2 元收费。
燃油附加费为每运次1 元。
2、途中等待:用按键控制中途等待,等待少于(包括)5 秒不收费,超过5 秒后每等待3 秒钟加收1 元。
3、用数码管分时显示计费金额、行驶里程和等候时间。
字母A 表示当前处于显示计费金额状态,字母B 表示当前处于显示行驶里程状态,字母C 表示当前处于显示等候时间状态。
4、用按键控制出租车空驶、载客状态并用点阵显示空驶、载客状态。
二、系统设计(包括设计思路、总体框图、分块设计)1、设计思路:将整个计价器分为控制和计费模块,按键及防抖模块,数码管显示模块,点阵显示模块。
其中控制和计费模块作为系统核心,负责给出所有控制和对外显示信号。
按键及防抖模块提供输入按键信号,用于状态间切换。
数码管用于显示计费金额、里程和等待时间信息。
点阵模块用于显示出租车载客和空驶状态。
2、设计框图:3、分块设计①控制和计费模块:采用状态机的设计方式,根据计费计时方式的不同,分为了S0、S1、S2、S3四个状态,四个状态的含义和状态转移图如图所示:②按键防抖模块:如图:按键防抖模块的原理是利用信号延迟,每个防抖模块都有一个输入时钟,每按下一次按键后输出端将产生一个输入时钟宽度的脉冲,输入时钟频率与主控模块中的状态切换扫描时钟频率相同,使状态能够及时的切换。
③点阵显示模块:点阵模块主要用于显示出租车的空载和载客状态。
空载时显示汉字“空”,载客时显示标志“X”。
输出信号lie和com分别连接到点阵控制的行和列。
En是由计费控制模块给出的空载/载客信号。
④数码管显示模块数码管主要用于显示计费、里程、等待时间信息。
clk_shu连接1kHz 时钟扫描信号,s0~s6用于接收计费控制模块输出的各个数码管显示的数字。
Weixuan和duanxuan控制数码管的位选和段选信号。
⑤时钟分频模块将50MHz片上时钟分频为1Hz、1kHz、200Hz时钟信号,其中1Hz用于计费和计时。
200Hz用于按键防抖和状态切换。
1kHz用于数码管和点阵的扫描。
三、仿真波形及波形分析①数码管显示模块:下图是固定s0~s6为数字951413后的仿真波形,由于S1位在程序中没有用到,于是将其始终置为高电平(灭),实际输出应为9 1413。
如图所示:weixuan信号每隔6个时钟周期扫描一次,扫描频率为166Hz足以使人眼产生连续显示的感觉。
观察duanxuan信号,在圆圈处应显示数字“1”,duanxuan为0000110正是“1”的段选码。
说明数码管能将s0~s6传输的数字正确的显示。
②按键防抖模块如图,keyin输入一个持续时间约为0.1s的按键信号并用高频时钟模拟抖动,keyout输出一个时钟周期(5ms)的高电平。
③时钟分频模块:由于分频比例太高,仿真到1s需要花费大量时间,故只仿真到20ms,观察1kHz和200Hz信号如下:④点阵显示模块:将en置高电平,输出应为X,如图,显示正确。
⑤计费计时模块:等待模式:如图在2S和3S间分别按start-stop和pause进入s2模式,初始计费为14(起步费+燃油费),2s(即等待3s)后计费变为15。
而在切换至s1后outen信号置高电平使点阵显示“X”。
结束和清零:如图,再次按Start-stop后停止计费,按clear后计时计费清零行驶状态:5s内为14元,之后每2s 加2元,计费正常。
四、源程序计费和控制模块:Mytaxi.vhdlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity mytaxi isport ( signal clk1k,clk1,clk5ms:in std_logic;--频率为1kHz,1Hz,5ms的信号start_stop:in std_logic; --开始-结束信号pause:in std_logic; --等待-重新行驶信号clear:in std_logic; --清零信号t0:out integer range 0 to 13; --与数码管连接t1:out integer range 0 to 13;t2:out integer range 0 to 9;t3:out integer range 0 to 9;t4:out integer range 0 to 9;t5:out integer range 0 to 9;outen:out std_logic);--点阵控制信号end mytaxi;architecture behav of mytaxi issignal sec1:integer range 0 to 5; --秒计数十位signal sec0:integer range 0 to 9; --秒计数个位signal m1:integer range 0 to 5; --分的十位计数器signal m0:integer range 0 to 9; --分的个位计数器signal c2,c1,c0:integer range 0 to 9; --费用计数器signal k2,k1,k0:integer range 0 to 9; --公里计数器signal v:integer range 0 to 5:=1; --车速signal fei:integer range 0 to 999;--费用计数器signal bai,shi,ge:integer range 0 to 9;--费用计数百位,十位,个位type state_type is (s0, s1, s2, s3); --状态列表signal state : state_type;beginprocess(clk5ms,start_stop,pause,clear) --状态切换进程beginif clear= '1' thenstate <= s0;elsif (rising_edge(clk5ms)) thencase state iswhen s0=>if start_stop = '1' thenstate <= s1;elsestate <= s0;end if;when s1=>if start_stop='1' thenstate <= s3;elsif pause = '1' thenstate <= s2;elsestate <= s1;end if;when s2=>if start_stop = '1' thenstate <= s3;elsif pause = '1' thenstate <= s1;elsestate <= s2;end if;when s3=>if clear= '1' thenstate <= s0;elsestate <= s3;end if;end case;end if;end process;jishi:process(clk1) --计时,计费进程variable cntk:integer range 0 to 5;variable cntf1:integer range 0 to 5;variable cntf11:integer range 0 to 5;variable cntf2:integer range 0 to 5;variable cntf22:integer range 0 to 2;variable cntx:integer range 0 to 6:=0;beginif clk1'event and clk1='1' thencase state iswhen s2=> --等待模式outen<='1'; --点阵显示载客if cntf2>4 then --等待超过5s进行计费if cntf22=2 then cntf22:=0; --每3s加1元fei<=fei+1;else cntf22:=cntf22+1;end if;else cntf2 :=cntf2+1;end if;if sec0=9 then sec0<=0; --此语句完成秒计数if sec1=6 then sec1<=0;if m0=9 then m0<=0; --此语句完成分计数if m1<=6 then m1<=0;else m1<=m1+1;end if;else m0<=m0+1;end if;else sec1<=sec1+1;end if;else sec0<=sec0+1;end if;bai<=fei/100; --将费用重新计算成三位便于显示shi<=(fei/10) mod 10;ge<=fei mod 10;when s1=> --行驶模式outen<='1';--点阵显示载客if cntk=v then cntk:=0; --2s一公里if k0=9 then k0<=0;if k1=9 then k1<=0;if k2=9 then k2<=0; --公里计数else k2<=k2+1;end if;else k1<=k1+1;else k0<=k0+1;fei<=fei+2; --每公里2元end if;else cntk:=cntk+1;end if;if cntf1=v then cntf1:=0;if cntf11>4 then fei<=fei+2; --超过5公里开始计费else cntf11:=cntf11+1;end if;else cntf1:=cntf1+1;end if;bai<=fei/100;shi<=(fei/10) mod 10;ge<=fei mod 10;when s0=> --按下clear后各项数字清零outen<='0';cntf1:=0;cntf11:=0;cntf2:=0;cntf22:=0;cntk:=0;fei<=14;bai<=0;shi<=0;ge<=0;sec1<=0;sec0<=0;m1<=0;m0<=0;k1<=0;k0<=0;k2<=0;outen<='0';end case;if cntx=6 then cntx:=0;else cntx:=cntx+1;end if;case cntx is --数码管分时显示when 2=>t0<=10;t1<=0;t2<=0;t3<=bai;t4<=shi;t5<=ge;when 4=>t0<=11;t1<=0;t2<=0;t3<=k2;t4<=k1;t5<=k0;when 6=>t0<=12;t1<=0;t2<=m1;t3<=m0;t4<=sec1;t5<=sec0;when others=>t1<=0;end case;end if;end process jishi;end;数码管:shumaguan.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY shumaguan ISPORT(clk_shu:IN STD_LOGIC;--BUTTON:IN STD_LOGIC;s0:in integer range 0 to 13; --各个数码管的数字s1:in integer range 0 to 13;s2:in integer range 0 to 9;s3:in integer range 0 to 9;s4:in integer range 0 to 9;s5:in integer range 0 to 9;weixuan:OUT STD_LOGIC_VECTOR(5 downto 0);--位选duanxuan:OUT STD_LOGIC_VECTOR(6 downto 0)—段选);END shumaguan;ARCHITECTURE ACE OF shumaguan ISSIGNAL CNT6:INTEGER RANGE 0 TO 5;SIGNAL C:integer range 0 to 13;BEGINP1:process(CNT6)BEGINCASE CNT6 IS --位选扫描WHEN 0 => weixuan <= "111110" ;WHEN 1 => weixuan<= "111111" ;WHEN 2 => weixuan<= "111011" ;WHEN 3 => weixuan<= "110111" ;WHEN 4 => weixuan<= "101111" ;WHEN 5 => weixuan<= "011111" ;WHEN OTHERS => NULL;END CASE ;END PROCESS P1;P2:process(clk_shu)BEGINIF clk_shu'EVENT AND clk_shu= '1' THEN--实现模6计数器if CNT6= 5 thenCNT6<= 0;elseCNT6<=CNT6 + 1;end if;END IF;END PROCESS P2;P3:process(CNT6)begincase CNT6 iswhen 0=>C<=s0; --扫描到的数码管赋值when 1=>C<=s1;when 2=>C<=s2;when 3=>C<=s3;when 4=>C<=s4;when 5=>C<=s5;end case;end process P3;P4:process(C)BEGINCASE C IS --段选赋值WHEN 0=> duanxuan<= "1111110";WHEN 1=> duanxuan <= "0110000";WHEN 2=> duanxuan <= "1101101";WHEN 3=> duanxuan <= "1111001";WHEN 4=> duanxuan <= "0110011";WHEN 5=> duanxuan <= "1011011";WHEN 6=> duanxuan <= "1011111";WHEN 7=> duanxuan <= "1110000";WHEN 8=> duanxuan <= "1111111";WHEN 9=> duanxuan <= "1111011";WHEN 10=> duanxuan <= "1110111";WHEN 11=> duanxuan <= "0011111";WHEN 12=> duanxuan <= "0001101";WHEN OTHERS =>NULL ;END CASE ;END PROCESS P4;END ACE;分频:div50m.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div50m isport(clk_in : in std_logic;clk_out_1hz : out std_logic;clk_out_5ms : out std_logic;clk_out_1khz : out std_logic);end;architecture a of div50m issignal cnt : integer range 0 to 24999;signal cnt1: integer range 0 to 999;signal cnt2: integer range 0 to 5;signal clk_tmp1k : std_logic;signal clk_tmp1: std_logic;signal clk_tmp5ms: std_logic;beginprocess(clk_in)beginif (clk_in'event and clk_in='1') then---分频到1kHz if cnt=24999 thencnt<=0;clk_tmp1k<= not clk_tmp1k;elsecnt<=cnt+1;end if;end if;end process;process(clk_tmp1k) --分频到1Hz beginif (clk_tmp1k'event and clk_tmp1k='1') then if cnt1=499 thencnt1<=0;clk_tmp1<= not clk_tmp1;elsecnt1<=cnt1+1;end if;end if;end process;process(clk_tmp1k) --分频到5ms beginif (clk_tmp1k'event and clk_tmp1k='1') then if cnt2=4 thencnt2<=0;clk_tmp5ms<= not clk_tmp5ms;elsecnt2<=cnt2+1;end if;end if;end process;clk_out_1khz<=clk_tmp1k;clk_out_1hz<=clk_tmp1;clk_out_5ms<=clk_tmp5ms; end;防抖模块:fangdou.vhdlibrary ieee;use ieee.std_logic_1164.all; entity fangdou isport(keyin,clk_fd:in std_logic;keyout:out std_logic); end;architecture b of fangdou issignal key_tmp0,key_tmp1,key_tmp2,key_tmp3:std_logic;beginprocess(clk_fd)beginif (clk_fd'event and clk_fd='1') thenkey_tmp0 <= keyin;key_tmp1 <= key_tmp0;end if;end process;--利用信号赋值延时将前后信号相与完成防抖key_tmp2 <= key_tmp0 and key_tmp1;process( clk_fd )beginif (clk_fd'event and clk_fd='1') thenkey_tmp3 <= key_tmp2;keyout <= not( key_tmp2 ) and key_tmp3;end if;end process;end; --时钟上升沿输出一个时钟周期宽度的脉冲点阵模块:peng.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_Unsigned.all;use ieee.std_logic_ARITH.all;ENTITY peng isport(clkpeng,en:in std_logic;lie:out std_logic_vector(7 downto 0); --列com:out std_logic_vector(7 downto 0));--行End peng;Architecture a of peng issignal st1:std_logic_vector(7 downto 0);signal data:std_logic_vector(7 downto 0);signal d0,d1,d2,d3,d4,d5,d6,d7:std_logic_vector(7 downto 0);signal e0,e1,e2,e3,e4,e5,e6,e7:std_logic_vector(7 downto 0);--signal lie0,lie1,lie2,lie3,lie4,lie5,lie6,lie7:std_logic_vector(7 downto 0); Begincom<=data;lie<=st1;d0<="00110000";---汉字“空”d1<="01011001";d2<="01111001";d3<="11001111";d4<="11001111";d5<="01111001";d6<="01111001";d7<="00110000";e0<="10000001";--符号“X”e1<="01000010";e2<="00100100";e3<="00011000";e4<="00011000";e5<="00100100";e6<="01000010";e7<="10000001";second:process(clkpeng)beginif(clkpeng='1' and clkpeng'event )then—逐行扫描,下同if en='0' thenif st1(7 downto 0)="00000000"or st1(7 downto 0)="01111111"thenst1(7 downto 0)<="11111110";data<=d0;elsif st1(7 downto 0)="11111110"thenst1(7 downto 0)<="11111101";data<=d1;elsif st1(7 downto 0)="11111101"thenst1(7 downto 0)<="11111011";data<=d2;elsif st1(7 downto 0)="11111011"thenst1(7 downto 0)<="11110111";data<=d3;elsif st1(7 downto 0)="11110111"thenst1(7 downto 0)<="11101111";data<=d4;elsif st1(7 downto 0)="11101111"thenst1(7 downto 0)<="11011111";data<=d5;elsif st1(7 downto 0)="11011111"thenst1(7 downto 0)<="10111111";data<=d6;elsif st1(7 downto 0)="10111111"thenst1(7 downto 0)<="01111111";data<=d7;end if;elseif st1(7 downto 0)="00000000"or st1(7 downto 0)="01111111"thenst1(7 downto 0)<="11111110";data<=e0;elsif st1(7 downto 0)="11111110"thenst1(7 downto 0)<="11111101";data<=e1;elsif st1(7 downto 0)="11111101"thenst1(7 downto 0)<="11111011";data<=e2;elsif st1(7 downto 0)="11111011"thenst1(7 downto 0)<="11110111";data<=e3;elsif st1(7 downto 0)="11110111"thenst1(7 downto 0)<="11101111";data<=e4;elsif st1(7 downto 0)="11101111"thenst1(7 downto 0)<="11011111";data<=e5;elsif st1(7 downto 0)="11011111"thenst1(7 downto 0)<="10111111";data<=e6;elsif st1(7 downto 0)="10111111"thenst1(7 downto 0)<="01111111";data<=e7;end if;end if;end if;end process second;end a;五、功能说明及资源利用情况实际电路框图:功能说明:按下start-stop键后开始计时,随即进入s1行驶状态,行驶状态初始费用为起步价+燃油费=14元,之后超过5公里后每公里2元。