Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)
1.同步动态扫描
多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作。
2.数码管驱动电路实现思路

如果要求数码管显示我们想要的数字,首先需要写一个数据接收模块,这个模块接收数据之后需要做什么样的处理呢?这时候我们会想到两个数码管,其中一个显示十位数字,另一个显示各位数字,即把这个数据的十位传给其中一个数码管,各位数字传给另一个数码管来显示。这样我们就会明确了:数据接收模块需要将接收的数据进行拆分,分别输出其十位数据与个位上的数据

程序风格:
1.always块语句中,总是先写出复位信号到来时候的情况,即输出全部置零。
2.always块语句中的变量都是reg型,因此在写always块语句前需要事先定义好,定义好reg型变量的位宽与名字。
3.尽管always块语句里面是对输出量的处理,但reg型的变量名最好不用输出量的名字,应先用其它的变量名代替,最后通过assign语句传递给输出量。(以后的工作中需要弄清楚为什么是这种编码风格)。
注意:
1.给变量赋值时,应带上数据的位宽与进制,总之,在编码的过程中,时刻注意变量的位宽与进制。多敲代码,养成良好的编码习惯。
2.写条件语句时,注意里面的代码,通常是以begin开头,end结尾,很重要,即使逻辑正确,少了这些,都无法通过编译。
当我们获得输入数据的十位与个位信号后,我们并不能直接传输给数码管,让其显示。当然八段数码管的显示方式并不陌生,因此十位与个位信号需要经过一个翻译的过程,把这两个信号翻译成数码管能识别的代码,这是一个加码的过程。


以上为八段数码管的显示编码,在程序中以参数的形式给出,方便以后调用。其中,当复位信号到来时,给输出信号赋值为“8’b1111_1111”此时八段数码管处于熄灭状态。
注意:似乎有大量参数的程序,都会用到case/endcase程序段,类似一个查表的过程,当case(输入量),在以下的代码中找到相匹配的输入量后,执行对应的语句(对输出量进行操作,赋值等)。

在我们获得了数码管的显示代码后,为什么不直接传给数码管呢,直接显示应该没问题呀,但为什么需要加一个行扫描模块与列扫描模块,希望有看到这篇博客的人能告诉为原因。

先说说列扫描,扫描频率制定为50Hz,即周期为0.02s,即从左至右,把两个灯扫一遍需要20ms,分配给两个灯,一个灯亮10ms,即每隔10ms换一个数码管使能。列扫描的工作机制如下:无需额外的输入,内部需要计数器,产生10ms的时间,然后通过内部逻辑控制数码管的使能。输出的列扫描信号即为数码管的片选信号,在实际的引脚分配中要注意。
以下为计数器的典型写法。
写完计数器之后,就应该写对输出语句的操作了。结合两个always块语句来看,前一个always块语句里面的变量t用在了下一个always块语句里面的case里面。
这其中涉及到一个状态机的编码技巧(哈哈,前几天看视频才弄明白的)。
分析:
输出信号有两种状态0:rColumn_Scan <= 2’b10; 个位数码管使能
1: rColumn_Scan <= 2’b01;十位数码管使能
前一个always块语句专门用来控制状态变量t的跳变,即在什么条件下由一个状态跳变到另外一个状态中呢?绘制如下状态图:


状态机与相应的操作分开写,会让程序更加清晰。
最后是行扫描模块,数码管的十位与个位显示代码是传给行扫描模块的,最后模块输出一个行扫描信号。行扫描模块的工作机制如下:
因为行扫描与列扫描是同步进行的,因此也需要一个10ms的计数器,假设初始时间是0,过了10ms后,十位的数码管被使能,这时候,行扫描模块应该把十位上的数据传给十位数码管,再过10ms,个位的数码管被使能,这时候,行扫描模块应该把个位上的数据传给个位数码管。这其中也有一个状态的跳变过程,需要写状态机。

至此,数码管驱动电路各个模块已经完成,最后只需要通过一个顶层文件用wire将各个模块连接起来。
Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)的更多相关文章
- Verilog HDL那些事_建模篇笔记(实验一,实验二)
实验一:永远的流水灯 扫描频率配置为100Hz,即是说扫描周期为10ms.这里需要注意的是扫描周期的概念.流水灯嘛,顾名思义,扫描周期指的是流水灯扫一轮所需要的时间.听到说周期,就应该想到在建模的时候 ...
- Verilog HDL那些事_建模篇笔记(实验九:VGA驱动)
1.了解VGA协议 VGA协议有5个输入信号,列同步信号(HSYNC Signal),行同步信号(VSYNC Signal),红-绿-蓝,颜色信号(RGB Signal). 一帧屏幕的显示是由行从上至 ...
- Verilog HDL那些事_建模篇笔记(实验八:键盘解码)
1.PS2接口与协议时序图 对于PS2的接口来说,需要额外关注的是PIN5与PIN1,一个是时钟,一个是数据.PS2协议对数据的移位是“CLOCK下降沿”有效,其CLOCK的频率通常在10KHz左右. ...
- Verilog HDL那些事_建模篇笔记(实验三:按键消抖)
实验三:按键消抖 首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块.电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止 ...
- 【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记
实验七的目的是设计实现最大为99数字在2个数码管上.采用同步动态扫描.即行信号和列信号同步扫描.这里数码管是共阳极的.选择端口也是共阳极的. 模块: /************************ ...
- 基于Verilog HDL 的数字时钟设计
基于Verilog HDL的数字时钟设计 一.实验内容: 利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...
- 【黑金教程笔记之003】【建模篇】akuei2的Verilog hdl心路
Verilog hdl不是“编程”是“建模” Verilog hdl语言是一种富有“形状”的语言. 如果着手以“建模”去理解Verilog hdl语言,以“形状”去完成Verilog hdl语言的设计 ...
- 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)
Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...
- Verilog HDL实用教程笔记
Verilog HDL实用教程笔记 DRC - Design Rule Check 几何规则检查ERC - Electrical Rule Check 电学规则检查自动参数提取LVS - Logic ...
随机推荐
- javaweb学习总结 servlet开发(一)
转载:http://www.cnblogs.com/xdp-gacl/p/3760336.html 这里主要是将其加入自己的理解过一遍. 这里的代码全在eclipse java ee中执行的. 一.s ...
- BeautifulSoup-find,findAll
BeautifulSoup的主要函数使用 from bs4 import BeautifulSouphtml = """<html><head>& ...
- Bash . configure permission denied错误
当你在Linux(我这里是Ubuntu10.04LTS Desktop)下编译安装某个包的时候,你首先是进入到解压目录然后执行“$ ./configure”的,但是有时候你会发现提示错误,错误提示是这 ...
- 对字符串进行简单的字符数字统计 探索java中的List功能
题目: 统计一个字符串中数字和字符串的个数,并分别进行排列,要求 1.数字,字符串可以从键盘获取. 2.储存在list 3.统计数字个数,字符串个数 4.把数字和字符串按从小到大的顺序输出 5.不能使 ...
- jquery jqPlot API 中文使用教程
jqPlot是一个灰常强大的图表工具,曲线,柱状,饼图,应该有尽有,更要命的是,调用方便~~ 官网:http://www.jqplot.com/ 这里贡献上中文教程,基本上所有的api都很齐全,供有需 ...
- MVC 知识点学习1
1.@Scripts.Render("~/bundles/kindeditor");@Styles.Render("~/Css/") //(加载)引用bun ...
- <转>你相信外星人的存在吗
来自为知笔记(Wiz)
- stm32f10x .icf文件 可以看懂
/*###ICF### Section handled by ICF editor, don't touch! ****//*-Editor annotation file-*//* IcfEdito ...
- Android 学习第15课,Android 开发的单元测试、及输出错误信息
这一节没有做实例,单元测试,以后用到再写吧
- Python 3.5 RuntimeError: can't start new thread
/*********************************************************************** * Python 3.5 RuntimeError: ...