北邮数电实验报告_双色点阵
北邮数字电路综合实验报告

数字电路综合实验报告简易智能密码锁一、实验课题及任务要求设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。
基本要求:1、密码设置:通过键盘进行4 位数字密码设定输入,在数码管上显示所输入数字。
通过密码设置确定键(BTN 键)进行锁定。
2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。
输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led 闪烁报警。
3、在开锁状态下,可以通过密码复位键(BTN 键)来清除密码,恢复初始密码“0000”。
闭锁状态下不能清除密码。
4、用点阵显示开锁和闭锁状态。
提高要求:1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。
2、密码锁的密码位数(4~6 位)可调。
3、自拟其它功能。
二、系统设计2.1系统总体框图2.2逻辑流程图2.3MDS图2.4分块说明程序主要分为6个模块:键盘模块,数码管模块,点阵模块,报警模块,防抖模块,控制模块。
以下进行详细介绍。
1.键盘模块本模块主要完成是4×4键盘扫描,然后获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。
键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出高电平,在读入输出的行值时,通常高电平会被低电平拉低,当当前位置为高电平“1”时,没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
北邮数字电路综合实验报告

数字电路综合实验报告简易智能密码锁一、实验课题及任务要求设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。
基本要求:1、密码设置:通过键盘进行 4 位数字密码设定输入,在数码管上显示所输入数字。
通过密码设置确定键(BTN 键)进行锁定。
2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。
输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led 闪烁报警。
3、在开锁状态下,可以通过密码复位键(BTN 键)来清除密码,恢复初始密码“0000”。
闭锁状态下不能清除密码。
4、用点阵显示开锁和闭锁状态。
提高要求:1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。
2、密码锁的密码位数(4~6 位)可调。
3、自拟其它功能。
二、系统设计2.1系统总体框图2.2逻辑流程图2.3MDS图2.4分块说明程序主要分为6个模块:键盘模块,数码管模块,点阵模块,报警模块,防抖模块,控制模块。
以下进行详细介绍。
1.键盘模块本模块主要完成是4×4键盘扫描,然后获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。
键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出高电平,在读入输出的行值时,通常高电平会被低电平拉低,当当前位置为高电平“1”时,没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
北邮数字电路与逻辑设计实验-实验报告(下)

北京邮电大学电路实验中心<数字电路与逻辑设计实验(下)>实验报告班级: xxx 学院: xxx实验室: xxx 审阅教师:姓名(班内序号): xxx 学号: xxx实验时间: xxx评定成绩:目录一、任务要求 (2)1.基本要求 (2)2.提高要求 (2)二、系统设计 (2)1.设计思路 (2)2.总体框图 (4)3.分块设计 (5)(1)分频器模块 (5)(2)4×4键盘输入模块 (5)(3)数码管显示模块 (6)(4)8×8 LED点阵显示模块 (6)(5)LCD液晶屏显示模块 (6)(6)中心模块 (6)三、仿真波形及波形分析 (6)1.分频器模块 (6)2.4×4键盘输入模块 (7)3.数码管显示模块 (7)4.8×8 LED点阵显示模块 (8)5.LCD液晶屏显示模块 (8)6.中心模块 (8)四、源程序 (9)1.分频器模块 (9)2.4×4键盘输入模块 (9)3.数码管显示模块 (11)4.8×8 LED点阵显示模块 (12)5.LCD液晶屏显示模块 (19)6.中心模块 (23)五、功能说明及资源利用情况 (26)六、故障及问题分析 (27)七、总结和结论 (27)一、任务要求本电路可供甲乙二人进行猜拳游戏。
通过不同的按键控制,选择多种出拳方式,显示猜拳的结果,实现猜拳游戏,防止了作弊的可能。
1.基本要求1、甲乙双方各用4×4 键盘中的三个按键模拟“石头”、“剪刀”、“布”,一个按键为“确认”。
4×4 键盘第一行为甲,第二行为乙;2、裁判用4×4 键盘第三行的一个按键模拟“开”,一个按键为“准备”,一个按键为“复位”;3、裁判宣布“准备”后,甲乙双方分别选择出拳方式并确认;4、裁判“开”以后,用点阵的左右三列同时显示甲乙双方的猜拳选择(如下图所示),并用两个数码管显示甲乙的猜拳比分;图1甲“布”,乙“剪刀”;甲“剪刀”,乙“石头”5、猜拳游戏为五局三胜制。
北邮数电实验点阵赛车

数字电路综合实验报告点阵赛车游戏学院:信息与通信工程学院班级:2010211117班姓名:学号:班内序号:辅导老师:袁东明时间:2012年11月目录一、设计任务要求二、系统设计三、仿真波形及分析四、源程序五、功能说明六、元器件清单及资源利用情况七、故障及问题分析八、总结和结论一、设计任务要求1、基本要求:1.用8×8点阵进行5秒倒计时显示,如下图所示。
2.当5秒倒计时结束后,点阵显示下图所示的赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。
图中的红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。
3.用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程(即图2中的绿色位置),游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。
4.当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案。
5.通过按键BTN0进行复位,控制点阵返回到初始状态。
2、提高要求:1.有多种游戏赛道可选,5秒倒计时显示后赛道随机出现。
2.赛车的初始位置随机出现。
3.在赛车行进过程中,赛道中随机出现障碍物(用8×8点阵中的一个LED 表示),通过BTN1~BTN3三个按键的控制躲避障碍物,走完全程。
若赛车碰到障碍物和赛道,则游戏失败。
二、系统设计1、设计框图1、系统结构框图本系统主要由四个模块组成,其中控制器用于控制程序运行、储存当前状态并控制输出显示,点阵用于显示游戏界面,数码管用于显示当前分数。
按钮输入用于输入控制信息。
2、逻辑划分方框图3、系统流程图4、MDS图Te =to end 到达终点Cr =crash 撞车Ot =over time CD =count down KI =keyboard input游戏运行状态的具体状态转移图三、仿真波形及波形分析说明:为了得到仿真结果,仿真实验先将分频比降低再进行。
双色点阵发光二极管显示实验

计算机学院综合性、设计性实验报告课程名称微机原理与接口指导教师学号姓名实验地点实验时间 12月19号项目名称双色点阵发光二极管显示实验实验类型设计性一、实验目的1、了解双色点阵LED显示器的基本原理。
2、掌握PC机控制双色点阵LED显示程序的设计方法。
二、实验仪器或设备微机原理与接口技术实验板、PC机三、总体设计(设计原理、设计方案及流程等)(1)设计原理点阵LED显示器是将许多LED类似矩阵一样排列在一起组成的显示器件,双色点阵LED是在每一个点阵的位置上有红绿或红黄或红白两种不同颜色的发光二极管。
当微机输出的控制信号使得点阵中有些LED发光,有些不发光,即可显示出特定的信息,包括汉字、图形等。
车站广场由微机控制的点阵LED大屏幕广告宣传牌随处可见。
图一实验原理图实验仪上设有一个共阳极8×8点阵的红黄两色LED显示器。
该点阵对外引出24条线,其中8条行线,8条红色列线,8条黄色列线。
若使某一种颜色、某一个LED发光,只要将与其相连的行线加高电平,列线加低电平即可。
(2)设计方案及流程1、实验仪上的点阵LED及驱动电路如下图所示,行代码、红色列代码、黄色列代码各用一片74LS273锁存。
行代码输出的数据通过行驱动器7407加至点阵的8条行线上,红和黄列代码的输出数据通过驱动器DS75452反相后分别加至红和黄的列线上。
行锁存器片选信号为CS1,红色列锁存器片选信号为CS2,黄色列锁存器片选信号为CS3。
2、接线方法:行片选信号 CS1 接 280H;红列片选信号 CS2 接 288H;黄列片选信号 CS3 接 290H。
3、编程在LED上重复显示红色“忆”和黄色“九”。
图二实验流程图四、实验步骤(包括主要步骤、代码分析等)实验代码如下:;********************双色点阵发光二极管显示实验********************proth equ 280hprotlr equ 288hprotly equ 290hDATA SEGMENTMESS DB 'Strike any key,return to DOS!',0AH,0DH,'$'min1 DB 00h,01h,02h,03h,04h,05h,06h,07hcount db 0BUFF1 DB 50ch,7fh,0d0h,50h,20h,02h,5fh,10hBUFF2 DB 00h,00h,0e6h,0a2h,0e2h,0a2h,0feh,00hDATA ENDS;----------------------------------------------------------- CODE SEGMENTASSUME CS:CODE,DS:DATA;------------------------------------------------------------ START: MOV AX,DATAMOV DS,AXMOV DX,OFFSET MESSMOV AH,09INT 21H ;显示提示信息;------------------------------------------------------------ agn: mov cx,80hd2: mov ah,01hpush cxmov cx,0008hmov si,offset min1next: mov al,[si]mov bx,offset buff1xlat ;得到第一行码mov dx,prothout dx,almov al,ahmov dx,protlrout dx,al ;显示第一行红mov al,0out dx,alshl ah,01inc sipush cxmov cx,0ffh;ffhdelay2: loop delay2 ;延时pop cxloop nextpop cxcall delayloop d2mov al,00mov dx,protlrout dx,almov ah,01 ;有无键按下int 16hjnz a2agn1: mov cx,80h ;agn1为显示黄色d1: mov si,offset min1mov ah,01push cxmov cx,0008hnext1: mov al,[si]mov bx,offset buff2xlatmov dx,prothout dx,almov al,ahmov dx,protlyout dx,almov al,0out dx,alshl ah,01inc sipush cxmov cx,0ffh;ffhdelay1: loop delay1mov cx,0ffh;ffhdelay3: loop delay3pop cxloop next1pop cxcall delayloop d1mov al,00mov dx,protlyout dx,almov ah,01int 16hjnz a2jmp agn ;黄色红色交替显示;---------------------------------------------------------------- DELAY PROC NEAR ;延迟子程序push cxmov cx,0ffh;ffhccc: loop cccpop cxretDELAY ENDP;--------------------------------------------------------------------- a2: MOV AH,4CH ;返回INT 21HCODE ENDSEND START;----------------------------------------------------------五、结果分析与总结1.实验结果:(以下两个字重复交替显示)2.实验总结:通过实验了解了双色点阵LED 显示器的基本原理,掌握了PC 机控制双色点阵LED 显示程序的设计方法,通过修改程序,在试验仪上做出重复显示红色的“许”和黄色的“巴”两个字的实验效果。
【含源代码】北邮数电实验洗衣机控制器点阵动态显示VHDL报告

2015~2016 学年第一学期《数字电路与逻辑设计实验(下)》实验报告题目:基于 CPLD 的简易洗衣机控制器的设计与实现班级:学号:班内序号:学生姓名:一、设计课题的任务要求任务要求:基本要求:1、基于 CPLD 的简易洗衣机控制器的工作步骤为洗涤、漂洗和脱水三个过程,工作时间分别为:洗涤30 秒(进水5秒,洗衣15秒,排水5秒,甩干5秒),漂洗25秒(进水5秒,漂洗10秒,排水5秒,甩干5秒),脱水15秒(排水5秒,甩干10秒);2、用一个按键实现洗衣程序的手动选择:A、单洗涤;B、单漂洗;C、单脱水;D、漂洗和脱水;E、洗涤、漂洗和脱水全过程;3、用发光二极管显示洗衣机的工作状态(洗衣、漂洗和脱水),并倒计时显示每个状态的工作时间,全部过程结束后,应有声音提示使用者,并保持在停止状态,直至再次开始;4、用点阵动画显示洗衣机工作过程中进水、波轮或滚筒转动、排水和甩干等的工作情况,四种工作情况的动画显示要有区别且尽可能的形象。
5、用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前保留的状态;提高要求:1、三个过程的时间有多个选项供使用者选择。
2、可以预约洗衣时间。
3、自拟其它功能。
二、系统设计(包括设计思路、总体框图、分块设计)A.设计思路:本程序采用自顶向下的设计方法。
先从所需要实现的功能入手,把整个洗衣机的程序分为分频(cp)模块,模式设置(fset)模块,控制(foption)模块和点阵模块(dianzhen)等分别实现,最后再合成一个整的程序。
B.设计过程::1.计算机编程:按照上述设计,用VHDL语言进行编程实现,并通过编译,观察资源使用情况。
2.系统仿真:通过仿真软件仿真,观察波形图,如果不对,对程序进行反复推敲修改.3.下载调试:将程序下载到实验板上,调试各功能看是否满足设计要求。
4.修改程序:通过计算机仿真和下载调试,发现问题,返回原程序进行修改,再次进行下载调试,直到成功为止。
LED双色点阵显示实验

LED双⾊点阵显⽰实验LED 双⾊点阵显⽰实验⼀、实验⽬的1.了解8×8矩阵LED 显⽰的基本原理和功能2.掌握8×8矩阵LED 和单⽚机的硬件接⼝和软件设计⽅法⼆、实验说明使⽤双⾊共阴极LED 点阵,其结构如图1所⽰。
系统使⽤74HC595芯⽚,使串⾏输出转换成并⾏输出,驱动矩阵LED 。
图1 LED 点阵结构三、实验内容及步骤根据系统提供的电路,掌握8×8矩阵LED 的⼯作原理,编程实现显⽰⼀个‘箭头’从左向右滚动的效果。
本实验需要⽤到单⽚机最⼩应⽤系统(F1区)和双⾊点阵显⽰(I1区)。
1、单⽚机最⼩应⽤系统的P1.0⼝接LED 点阵显⽰的DIN ,P1.1⼝接LED 点阵的SCLK ,P1.2⼝接LED 点阵显⽰的RCLK 。
2、⽤串⾏数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的⽅向:缺⼝朝上。
3、打开Keil uVision2仿真软件,⾸先建⽴本实验的项⽬⽂件,接着添加“TH30_LED 点阵.ASM ”源程序,进⾏编译,直到编译⽆误。
4、进⾏软件设置,选择硬件仿真,选择串⾏⼝,设置波特率为38400。
5、打开模块电源和总电源,点击开始调试按钮,点击RUN 按钮运⾏程序。
观察点阵显⽰(显⽰向左移动的彩⾊箭头)。
6、也可以把源程序编译成可执⾏⽂件,⽤ISP 烧录器烧录到89S52/89S51芯⽚中。
(ISP 烧录器的使⽤查看附录⼆)四、实验参考程序(见光盘中的程序⽂件夹)五、思考题根据实验内容编写⼀个程序,并在实验仪上调试和验证。
六、电路原理图H_ATB124H_ATB223H_ATB322H_ATB421H_ATB54H_ATB63H_ATB72H_ATB81G_LTR15G_LTR26G_LTR37G_LTR48G_LTR59G_LTR610G_LTR711G_LTR812 R_LTR813R_LTR714R_LTR615R_LTR516R_LTR417R_LTR318R_LTR219R_LTR120H _A T B 124H _A T B 223H _A T B 322H _A T B 421H _A T B 54H _A T B 63H _A T B 72H _A T B 81G _L T R 15G _L T R 26G _L T R 37G _L T R 48G _L T R 59G _L T R610G _L T R 711G _L T R 812R _L T R 813R _L T R 714R _L T R 615R _L T R 516R _L T R 417R _L T R 318R _L T R 219R _L T R 120D I S 1ISER 14SRCLK 11SRCLR 10RCLK 12E13O015O11O22O33O44O55O66O77Q79VCC 16GND874HC595VCCVCC VCCVCC R 1_L 1R 1_L 2R 1_L 3R 1_L 4R 1_L 5R 1_L 6R 1_L 7R 1_L 8H _A 1H _A 2H _A 3H _A 4H _A T B 124H _A T B 223H _A T B 322H _A T B 421H _A T B 54H _A T B 63H _A T B 72H _A T B 81G _L T R 15G _L T R 26G _L T R 37G _L T R 48G _L T R 59G _L T R 610G _L T R 711G _L T R 812R _L T R 813R _L T R 714R _L T R 615R _L T R 516R _L T R 417R _L T R 318R _L T R 219R _L T R 120D I S 2IVCC VCC VCCVCCVCCVCCSERSCLK RCLK 123Q1I 9013123Q2I 9013123Q3I 9013123Q4I 9013123Q5I 9013123Q6I 9013123Q7I 9013123Q8I 9013H_A5H_A6H_A7H_A8H_A1H_A2H_A3H_A4HA1I HA2I HA3I HA4I HA5I HA6I HA7I HA8I HA1IHA2IHA3IHA4IHA5IHA6IHA7IHA8ISER14SRCLK 11SRCLR10RCLK12E13O015O11O22O33O44O55O66O77Q79VCC16GND874HC595SER 14SRCLK 11SRCLR 10RCLK 12E 13O015O11O22O33O44O55O66O77Q79VCC 16GND 8U5I 74HC595SER 14SRCLK11SRCLR 10RCLK 12E13O015O11O22O33O44O55O66O77Q79VCC16GND874HC595SER 14SRCLK 11SRCLR 10RCLK 12E 13O015O11O22O33O44O55O66O77Q79VCC 16GND 874HC595DIN SCLK RCLK VCCG 1_L 1G 1_L 2G 1_L 3G 1_L 4G 1_L 5G 1_L 6G 1_L 7G 1_L 8H _A 5H _A 6H _A 7H _A 8G 2_L 1G 2_L 2G 2_L 3G 2_L 4G 2_L 5G 2_L 6G 2_L 7G 2_L 8H _A 5H _A 6H _A 7H _A 8R 2_L 1R 2_L 2R 2_L 3R 2_L 4R 2_L 5R 2_L 6R 2_L 7R 2_L 8H _A 1H _A 2H _A 3H _A 4R1_L1R1_L2R1_L3R1_L4R1_L5R1_L6R1_L7R1_L8G1_L1G1_L2G1_L3G1_L4G1_L5G1_L6G1_L7G1_L8R2_L1R2_L2R2_L3R2_L4R2_L5R2_L6R2_L7R2_L8G2_L1G2_L2G2_L3G2_L4G2_L5G2_L6G2_L7G2_L8。
北邮数电实验报告

北邮数电实验报告1. 实验目的本实验的目的是通过实际操作和实验验证,加深对数字电路的理解和掌握。
具体实验内容包括: 1. 实现各种基本逻辑电路(与门、或门、非门、异或门等)的电路设计。
2. 学习使用开关和LED灯进行数字信号输入和输出。
3. 掌握数字电路实验中常用的仪器设备的使用方法。
2. 实验器材和环境本实验所使用的器材和环境如下: - FPGA实验箱 - 数字逻辑集成电路(与门、或门、非门、异或门等) - 电源 - 接线板 - 数字电路实验仪器3. 实验步骤3.1 实验准备首先,我们需要将实验所需的器材连接好,包括将数字逻辑集成电路插入到FPGA实验箱上的插槽中,并将电源正确连接。
3.2 电路设计与布线根据实验要求,我们需要设计不同的基本逻辑电路。
比如,要设计一个与门电路,可以通过将两个输入端分别与两个开关连接,将输出端连接到一个LED灯上。
其他的逻辑电路同样可以设计类似的方式。
在设计和布线的过程中,需要注意保持电路的连通性,并避免出现短路等问题。
3.3 输入和输出信号设置根据实验要求,我们需要设置输入和输出信号。
可以通过控制开关的开合状态来设置输入信号,然后观察LED灯的亮灭情况来判断输出信号的状态是否符合预期。
3.4 实验数据记录和分析在实验过程中,我们需要记录每个逻辑电路的输入和输出信号状态,并进行分析。
可以通过绘制真值表或者逻辑门表来记录并分析数据。
4. 实验结果与分析根据实验步骤中记录的数据,我们可以得出实验结果,并进行进一步的分析。
比如,可以通过比对设计的逻辑电路输出和预期输出的差异,来判断实验是否成功完成。
5. 总结与反思通过本次实验,我深入了解和掌握了数字电路的基本原理和实验方法。
通过设计和实验验证,加深了对基本逻辑电路的理解,并熟悉了数字电路实验所使用的仪器设备。
在实验过程中,我遇到了一些问题,比如电路连接错误导致的信号不稳定等,但通过仔细调试和排查,最终解决了这些问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京邮电大学数电综合实验报告实验名称:双色点阵显示控制器学院:姓名:班级:学号:班内序号:一.设计课题的任务要求用8×8点阵设计双色点阵显示控制器 基本要求: 1、固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn 按钮实现亮度调节,亮度变化视觉效果要尽量明显。
2、用从红到绿8级渐变色显示一个固定汉字或图形。
3、分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn 按键进行切换。
4、显示的图形或汉字要尽量饱满美观。
提高要求:滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。
自拟其它功能。
二.系统设计1. 设计思路考虑本程序设计要求模块明确单一但需要变化多种状态,因此采用单模块多状态多进程方式实现。
其中防抖进程用于检测输入,本程序使用BTN 按键进行输入控制,而按键的键入可能由于抖动产生多个上升沿,对程序的控制产生影响。
防抖动采用了延时原理来对冒险或长时间按键电平进行处理。
分频使用了多个进程产生程序所需要的多个时钟频率。
包括:clk1(扫描时钟 大于480Hz 但不过高)clk2(占空比调节1 clk1周期的整数倍,但不过高) clk3(占空比调节2 同clk2,但占空比不同) clk4(占空比调节3 同clk2,但占空比不同) clk5(按键时钟 约100Hz) clk6(滚动变化计时 约1Hz)状态机变化进程用于管理状态变化,当遇到按键电平信号时根据规则改变对应状态。
显示进程包括主要显示进程和一些辅助进程,辅助进程完成了时钟对应计数器计数,主进程则根据状态变化显示不同显示模式下不同的图案。
2. 总体框图(1) 总体结构框图:(2) 逻辑划分框图Mode(3)MDS图3.各进程介绍⑴分频进程们分频进程含一个从50M(也可能是25M)分出的扫描频率clk1,这个频率要大于60*8=480Hz(因为人眼分辨频率为60Hz左右,要保证每排扫描时达到60Hz 则需480Hz)。
然后以clk1为基准频率,将clk2、clk3、clk4以clk1的8倍数作占空比调整。
具体是,clk2、clk3、clk4均记为clk1的48分频,然后占空比调为32:16,24:24,16:32做8倍数的原因是为了保证至少每扫完一屏才有一次占空比调整,否则在主频率不足情况下可能有些排暗有些排亮(详见问题分析)最后再将周期约为100ms的按键时钟clk5和周期为1s的滚动时钟clk6分出就可以了。
⑵状态机进程没什么可说的,我写的是单进程状态机,防止了多进程状态机可能带来的冒险。
敏感量直接写的是防抖动输出的信号,本以为没必要加同步时序,但事实证明这是有问题的。
(详见代码分析)⑶防抖动进程防抖动我用的是老师给的代码。
先阐述一下原理:按键输入电平做敏感量,将输入赋值给resetmp1。
resetmp1被赋值后,将这段值有时延的赋值给resetmp2,并利用这段时间去判断是否按键仍为1。
则面对下面两种情况下防抖程序可以做出调整A.突然翘起的冒险:此种情况下若r1得到赋值,则r2在下一个时钟沿得到赋值,但由于此时r1电平为低,不能判断成功B. 长时间按下:此种情况下r1得到赋值,在赋值给r2的间歇判断正确,而后r2得到赋值后不再有效,因此输出仅有一个按键时钟高电平ClkIn_signalResetmp1Resetmp2Out_signal但在使用该进程的过程中遇到了问题,具体见问题分析。
(4)显示进程首先说一下点阵显示的原理:如下图所示,列高电平有效,行低电平有效,当对应高电平和低电平时中间的灯就亮了。
而不同颜色则是由不同亮度的红色灯和绿色灯光混合而成。
由于都是整排显示,为了达到整屏显示效果,需要每排进行扫描,当扫描频率较高时人眼无法分辨则可达到整屏显示。
数码管原理类似,这里不再赘述。
接着说一下亮度调节:前面已经说过时钟分频的问题,在显示每排前对占空比时钟进行判断,则有些情况会亮,有些情况会灭,这样就能很好的形成明暗效果。
最后说一下滚动:滚动我是用最笨的方法实现的,即一屏一屏的画出每屏图案。
当时我是觉得可能循环之类的不太好实现,不过有同学使用了循环减少了代码量,我觉得以后很值得借鉴。
三.仿真波形及分析1、防抖动波形的测试这两张张图中,mode为输入,并设置了很多毛刺作为干扰电平,可以从图中看出多个干扰电平出现时仅输出一个周期的高电平。
那为什么仅有毛刺时也会有输出呢?因为毛刺刚好位于clk5的下降沿,这样的话也会造成程序误判一次输出(这也是这个防抖动程序的不足之处)。
而连续多次下降沿毛刺造成的结果却是r1连续两个周期(其实是一个半)的高电平,同步电路就是这样一个特点。
当仅有冒险且冒险未在clk5边沿时,则不会触发电平。
如下图所示关于同步电路问题的下一步讨论(包含同步时钟选用的问题)放在问题分析部分。
2、显示波形测试从图中可以看出当Mode改变后red_out开始有波形出现,这说明模式已经从m0转变为m1_p1改变p后,则有:Clk2为0时则red输出为0,这时就有了亮度的变化。
其它亮度变化以此类推,这里不再赘述。
以上波形显示了最重要的状态变化过程,状态变化后按该状态显示内容显示,只要状态机能正常工作,仿真的任务就基本完成。
四、源代码解析(由于源程序后半部分属于机械重复,因此省略)(这里按50M时钟输入写)Library IEEE;USE IEEE.STD_LOGIC_1164.All;ENTITY sc ISPORT (clk,mode,p,reset:IN STD_LOGIC; --reset用于复位到m0red_out,green_out:OUT std_logic_vector(7 downto 0):= "00000000";row_out:OUT std_logic_vector(7 downto 0):="11111111";num_out:OUT std_logic_vector(7 downto 0):="00000000"; --用于数码管输出num_choose:Out std_logic_vector(5 downto 0):="111110"); --用于选择数码管END sc;architecture a of sc isTYPE state_type IS (m0,m1_p1,m1_p2,m1_p3,m1_p4,m2,m3_p1,m3_p2,m3_p3);signal mode_mp1,mode_mp2,mode_out:STD_logic; --防抖动临时信号(下同)signal p_mp1,p_mp2,p_out:STD_logic;signal clk1,clk2,clk3,clk4,clk5,clk6:STD_logic;signal tmp1:Integer Range 0 To 1000000:=0;signal tmp2:Integer Range 0 To 200000:=0;signal tmp3:Integer Range 0 To 50000000:=0;signal tmp4:Integer Range 0 To 30:=0;signal tmp5:Integer Range 0 To 30:=0;signal count:Integer Range 0 To 8:=0;signal count_2:Integer Range 0 To 4:=0;signal count_3:Integer Range 0 To 32:=0;signal clk_tmp:STD_logic;signal state:state_type;signal red,green:std_logic_vector(7 downto 0):="00000000";signal row:std_logic_vector(7 downto 0):="11111110"; Beginp1_1:Process(clk)Beginif (clk'event AND clk = '1') thenif tmp1=50000 thentmp1 <= 0;elsetmp1 <= tmp1 + 1;end if;if tmp1 < 25000 thenclk1 <= '1';elseclk1 <= '0';end if;end if;end process p1_1;p1_2:Process(clk)Beginif (clk'event AND clk = '1') thenif tmp2 = 500000 thentmp2 <= 0;elsetmp2 <= tmp2 + 1;end if;if tmp2 < 250000 thenclk5 <= '1';clk5 <= '0';end if;end if;end process p1_2;p1_3:Process(clk)Beginif (clk'event AND clk = '1') then if tmp3 = 50000000 thentmp3 <= 0;elsetmp3 <= tmp3 + 1;end if;if tmp3 < 25000000 thenclk6 <= '1';elseclk6 <= '0';end if;end if;end process p1_3;p1_4:Process(clk1)Beginif (clk1'event AND clk1 = '1') then if tmp4 = 31 thentmp4 <= 0;elsetmp4 <= tmp4 + 1;end if;if tmp4 < 24 thenclk2 <= '1';elseclk2 <= '0';end if;if tmp4 < 8 thenclk4 <= '1';elseclk4 <= '0';end if;end process p1_4;p1_5:Process(clk1)Beginif (clk1'event AND clk1 = '1') thenif tmp5 = 15 thentmp5 <= 0;elsetmp5 <= tmp5 + 1;end if;if tmp5 < 8 thenclk3 <= '1';elseclk3 <= '0';end if;end if;end process p1_5;小结:上面几个分频进程分出了程序所需的6个频率p2:Process(clk5)Beginif (clk5'event AND clk5 = '0') thenmode_mp2 <= mode_mp1; --延迟一个周期赋值mode_mp1 <= mode;p_mp2 <= p_mp1;p_mp1 <= p;end if;end Process p2;p2_out:Process(clk1) --这里单独拿出一个进程用于赋值Beginif (clk1'event and clk1 = '1') thenmode_out <= clk5 and mode_mp1 and (not mode_mp2);p_out <= clk5 and p_mp1 and (not p_mp2);end if;end Process p2_out;小结:上述两个进程完成了防抖动功能,和老师给的代码不同的地方在于单独拿出了一个进程用于与操作,原因在于这里的输出值依旧是signal变量,必须在进程内赋值才能在仿真时显示出来。