北邮数电实验报告_双色点阵
- 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得到赋值后不再有效,因此输出仅有一个按键时钟高电平
Clk
In_signal
Resetmp1
Resetmp2
Out_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 IS
PORT (
clk,mode,p,reset:IN STD_LOGIC; --reset用于复位到m0
red_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 is
TYPE 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; --防抖动临时信号(下同)