【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记
实验七的目的是设计实现最大为99数字在2个数码管上。采用同步动态扫描。即行信号和列信号同步扫描。这里数码管是共阳极的。选择端口也是共阳极的。
模块:
- /*************************************
- module name: number_mod_module.v
- function: generate ten-bit and one-bit
- number.
- by yf.x
- 2014-11-11
- *************************************/
- module number_mod_module(
- CLK,
- RST_n,
- Number_data,
- Ten_data,
- One_data
- );
- input CLK;
- input RST_n;
- input [:] Number_data;
- output [:] Ten_data;
- output [:] One_data;
- /********************************/
- reg [:]rTen;
- reg [:]rOne;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- begin
- rTen<='d0;
- rOne<='d0;
- end
- else
- begin
- rTen<=Number_data/;
- rOne<=Number_data%;
- end
- /***********************************/
- assign Ten_data=rTen[:];
- assign One_data=rOne[:];
- /***********************************/
- endmodule
- /**********************************************
- module name:digital_tube_encode_module.v
- function: encode
- by yf.x
- 2014-11-11
- **********************************************/
- module digital_tube_encode_module(
- CLK,
- RST_n,
- Ten_data,
- One_data,
- Ten_dig_tube_data,
- One_dig_tube_data
- );
- input CLK;
- input RST_n;
- input [:]Ten_data;
- input [:]One_data;
- output [:]Ten_dig_tube_data;
- output [:]One_dig_tube_data;
- /****************************************/
- //common anode digital tube
- parameter _0='b1100_0000,
- _1='b1111_1001,
- _2='b1010_0100,
- _3='b1011_0000,
- _4='b1001_1001,
- _5='b1001_0010,
- _6='b1000_0010,
- _7='b1111_1000,
- _8='b1000_0000,
- _9='b1001_0000;
- /*******************************************/
- reg [:]rTen_dig_tube_data;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- begin
- rTen_dig_tube_data<='b1111_1111;
- end
- else
- case(Ten_data)
- 'd0:rTen_dig_tube_data<=_0;
- 'd1:rTen_dig_tube_data<=_1;
- 'd2:rTen_dig_tube_data<=_2;
- 'd3:rTen_dig_tube_data<=_3;
- 'd4:rTen_dig_tube_data<=_4;
- 'd5:rTen_dig_tube_data<=_5;
- 'd6:rTen_dig_tube_data<=_6;
- 'd7:rTen_dig_tube_data<=_7;
- 'd8:rTen_dig_tube_data<=_8;
- 'd9:rTen_dig_tube_data<=_9;
- endcase
- /**************************************/
- reg [:]rOne_dig_tube_data;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- begin
- rOne_dig_tube_data<='b1111_1111;
- end
- else
- case(One_data)
- 'd0:rOne_dig_tube_data<=_0;
- 'd1:rOne_dig_tube_data<=_1;
- 'd2:rOne_dig_tube_data<=_2;
- 'd3:rOne_dig_tube_data<=_3;
- 'd4:rOne_dig_tube_data<=_4;
- 'd5:rOne_dig_tube_data<=_5;
- 'd6:rOne_dig_tube_data<=_6;
- 'd7:rOne_dig_tube_data<=_7;
- 'd8:rOne_dig_tube_data<=_8;
- 'd9:rOne_dig_tube_data<=_9;
- endcase
- /********************************************/
- assign Ten_dig_tube_data=rTen_dig_tube_data;
- assign One_dig_tube_data=rOne_dig_tube_data;
- /********************************************/
- endmodule
- /*****************************************
- module name: column_scan_module.v
- function: choose which digital tube enable.
- by yf.x
- 2014-11-11
- *****************************************/
- module column_scan_module(
- CLK,
- RST_n,
- Column_scan_sig
- );
- input CLK;
- input RST_n;
- output [:]Column_scan_sig;
- /****************************************/
- //50M*0.01-1=499_999
- parameter T10ms='d499_999;
- /****************************************/
- reg [:]count1;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- count1<='d0;
- else if(count1==T10ms)
- count1<='d0;
- else
- count1<=count1+'b1;
- /****************************************/
- reg [:] t;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- t<='d0;
- else if(t=='d2)
- t<='d0;
- else if(count1==T10ms)
- t<=t+'b1;
- /******************************************/
- reg [:] rColumn_scan;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- rColumn_scan<='b10;
- else if(count1==T10ms)
- case(t)
- 'd0:rColumn_scan<=2'b10;
- 'd1:rColumn_scan<=2'b01;
- endcase
- /*******************************************/
- assign Column_scan_sig=rColumn_scan;
- /*******************************************/
- endmodule
- /*****************************************
- module name: row_scan_module.v
- function: choose which number enable.
- by yf.x
- 2014-11-11
- *****************************************/
- module row_scan_module(
- CLK,
- RST_n,
- Ten_dig_tube_data,
- One_dig_tube_data,
- Row_scan_sig
- );
- input CLK;
- input RST_n;
- input [:]Ten_dig_tube_data;
- input [:]One_dig_tube_data;
- output [:]Row_scan_sig;
- /****************************************/
- //50M*0.01-1=499_999
- parameter T10ms='d499_999;
- /****************************************/
- reg [:]count1;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- count1<='d0;
- else if(count1==T10ms)
- count1<='d0;
- else
- count1<=count1+'b1;
- /****************************************/
- reg [:] t;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- t<='d0;
- else if(t=='d2)
- t<='d0;
- else if(count1==T10ms)
- t<=t+'b1;
- /******************************************/
- reg [:] rRow_scan;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- rRow_scan<='d0;
- else if(count1==T10ms)
- case(t)
- 'd0:rRow_scan<=Ten_dig_tube_data;
- 'd1:rRow_scan<=One_dig_tube_data;
- endcase
- /*******************************************/
- assign Row_scan_sig=rRow_scan;
- /*******************************************/
- endmodule
- /*************************************************
- module name:dig_tube_scan_module.v
- function: choose tube and number
- by yf.x
- 2014-11-11
- *************************************************/
- module dig_tube_scan_module(
- CLK,
- RST_n,
- Ten_dig_tube_data,
- One_dig_tube_data,
- Column_scan_sig,
- Row_scan_sig
- );
- input CLK;
- input RST_n;
- input [:]Ten_dig_tube_data;
- input [:]One_dig_tube_data;
- output [:]Column_scan_sig;
- output [:]Row_scan_sig;
- /*****************************************/
- column_scan_module u0(
- .CLK(CLK),
- .RST_n(RST_n),
- .Column_scan_sig(Column_scan_sig)
- );
- row_scan_module u1(
- .CLK(CLK),
- .RST_n(RST_n),
- .Ten_dig_tube_data(Ten_dig_tube_data),
- .One_dig_tube_data(One_dig_tube_data),
- .Row_scan_sig(Row_scan_sig)
- );
- /*******************************************/
- endmodule
- /***************************************
- module name: lab07_top.v
- function: dirver digital tube show number
- pin assignments(for DE2-115):
- ----------------------------------
- CLK-----------------------CLOCK_50
- RST_n---------------------KEY[0]
- HEX1-0-----------HEX1-0
- ----------------------------------
- by yf.x
- 2014-11-11
- ***************************************/
- module lab07_top(
- CLK,
- RST_n,
- HEX1,
- HEX0
- );
- input CLK;
- input RST_n;
- output [:]HEX1;
- output [:]HEX0;
- wire [:]Number_data;
- wire [:]Row_scan_sig;
- wire [:]Column_scan_sig;
- reg [:] rHEX1;
- reg [:] rHEX0;
- /**************************************/
- wire [:]Ten_data;
- wire [:]One_data;
- number_mod_module u0(
- .CLK(CLK),
- .RST_n(RST_n),
- .Number_data(Number_data),
- .Ten_data(Ten_data),
- .One_data(One_data)
- );
- /***************************************/
- wire [:]Ten_dig_tube_data;
- wire [:]One_dig_tube_data;
- digital_tube_encode_module u1(
- .CLK(CLK),
- .RST_n(RST_n),
- .Ten_data(Ten_data),
- .One_data(One_data),
- .Ten_dig_tube_data(Ten_dig_tube_data),
- .One_dig_tube_data(One_dig_tube_data)
- );
- /***************************************/
- dig_tube_scan_module u2(
- .CLK(CLK),
- .RST_n(RST_n),
- .Ten_dig_tube_data(Ten_dig_tube_data),
- .One_dig_tube_data(One_dig_tube_data),
- .Column_scan_sig(Column_scan_sig),
- .Row_scan_sig(Row_scan_sig)
- );
- /*******************************************/
- count100 u3(
- .CLK(CLK),
- .RST_n(RST_n),
- .Count_out(Number_data)
- );
- /*******************************************/
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- begin
- rHEX1<='b111_1111;
- rHEX0<='b111_1111;
- end
- else
- case(Column_scan_sig)
- 'b10:rHEX1<=Row_scan_sig;
- 'b01:rHEX0<=Row_scan_sig;
- endcase
- /*******************************************/
- assign HEX1=rHEX1;
- assign HEX0=rHEX0;
- /*******************************************/
- endmodule
- /**********************************************************************
- module name: count100.v
- function:count from 0 to 99, add 1 at each 100ms.
- by yf.x
- 2014-11-12
- **********************************************************************/
- module count100(
- CLK,
- RST_n,
- Count_out
- );
- input CLK;
- input RST_n;
- output [:]Count_out;
- /****************************************/
- //50M*0.1-1=4_999_999
- parameter T100ms='d4_999_999;
- /****************************************/
- reg [:]count1;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- count1<='d0;
- else if(count1==T100ms)
- count1<='d0;
- else
- count1<=count1+'b1;
- /****************************************/
- reg [:] Number_data;
- always @(posedge CLK or negedge RST_n)
- if(!RST_n)
- Number_data<='d0;
- else if(Number_data=='d100)
- Number_data<='d0;
- else if(count1==T100ms)
- Number_data<=Number_data+'b1;
- /****************************************/
- assign Count_out=Number_data;
- /****************************************/
- endmodule
模块说明:
(1) 取位模块,RTL视图如下
(2) 加码模块,简单的译码,没啥好说的。参数的应用,更直观些。
(3) 扫描模块,整个设计较难之处,数码管在那里,数字也在那里,在某一时刻准确的选择数码管和数字这两种不同的东东就需要扫描2次,所谓行扫描,列扫描,不过是文字上的名称罢了,设计的思想就是同一时刻,不同东东要匹配起来,有几种东东,就扫描几次。所以名称完全可以自己随便创造。
Qestion:
(1) 行扫描信号和列扫描信号的作用?
列扫描信号用来选择当前用哪个数码管来显示,每个数码管保持10ms;行扫描信号用来决定显示什么(十位上的数字还是个位上的数字),也是10ms的间隔。这样,两个数码管就可以准确对应,交替显示。
(2) 三个模块的功能:十位取码模块是把一个数的个位和十位上的数字分别取出来;SMG加码模块是把4-bit的数字译码成数码管上要显示的数字码;扫描模块决定哪个数码管显示和显示什么。
(3) 数字取位模块里声明32位的寄存器是因为在9.0之后的版本Quartus II里除法器和求余器默认是32位输出。经过编译后,会自动优化最适合的位宽。
(4) 部分代码说明:核心模块如上述框图显示,取位,译码,扫描。但要使整个设计落地到DE2-115上,这块神板的数码管好像是没有使用扫描的引脚,即不能直接像大多数数码管设计里扫描显示。它那样设计的原因可能是要更直接更傻瓜化吧:),所以在代码的顶层模块里,“画蛇添足”的用一个case选择哪个数码管显示,有点破坏低级建模,模块功能单一,搭积木的感觉。先这样凑合吧。另外,要显示的数字本身,用DE2-115上的拨动开关组合可以,更简单的就是用计数器直接生成,所以,干脆写了一个每隔100ms增1的100进制的计数器(其实是模101,不用那么较真)。
【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记的更多相关文章
- Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)
1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路 如果要求数码管显示我们想要的数字,首先需 ...
- 《Kafka权威指南》读书笔记-操作系统调优篇
<Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...
- 【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er ...
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...
- 【转】寻找最好的笔记软件:海选篇 (v1.0)
原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html 序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...
- Matlab 多个版本的安装包下载、安装和激活教程 + 多套数学建模视频教程
目录 1. 关键词 1.1. 说明 2. 下载地址 2.1. OneDrive高速云盘 2.1.1. 多版本的安装包 2.1.2. 多套数学建模的视频教程 2.2. 百度云 3. 安装教程 1. 关键 ...
- Redis 笔记 01:入门篇
Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
- 第十七篇:实例分析(1)--初探WDDM驱动学习笔记(八)
第四篇(VidPN)中提到过MIRROR驱动. 在进入本篇的实际内容前, 带着好奇心, 想请教CSDN中的显卡驱动方面的大虾, 怎样才干把这个驱动玩起来, 这个驱动的作用是什么,等等, 敬请不吝赐教. ...
- js便签笔记(12)——浏览TOM大叔博客的学习笔记 part2
1. 前言 昨天写了<js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1>,简单记录了几个问题.part1的重点还是在于最后那个循环创建函数的问题,也就是多个子函数公用一个闭 ...
随机推荐
- BZOJ2501: [usaco2010 Oct]Soda Machine
n<=50000个区间,求哪个点被覆盖区间数量最多,输出这个数量. 差分模板..然而数组忘开两倍.. #include<stdio.h> #include<string.h&g ...
- 怎么配置ODBC microsoft Access 安装(win10)
笔者看着书配置Access连接方法但就是找不到书中的"Access.mdb". 后来才知道.mdb需要自己创建....对于刚入门的我很无语啊!!!!! 下面带你走出小坑 1.从控制 ...
- 【.Net Core 学习系列】-- 自定义错误页面在IE浏览器中不能正常显示
测试场景: 1. 新建.Net Core Web项目 2. 选择模板: 3. 修改Error页面代码:(去掉母版页并修改页面显示信息) 4. 修改[ASPNETCORE_ENVIRONMENT],并抛 ...
- 【转载】Unix设计哲学 & 回车换行八卦 & EOF八卦 & UNIX目录结构八卦
昨天看了这篇文章 <关于Unix哲学> 首先用了两个例子,用风扇吹出空肥皂盒 和 太空铅笔,来说明简单设计也能派上作用吧. Unix哲学,Wikipedia上列出了好几个版本,不同的人有不 ...
- Linux 将一般的用户加入sudo组is_not_in_the_sudoers_file._This_incident_will_be_reported解决方法
在一般用户下执行sudo命令提示xxx is not in the sudoers file. This incident will be reported.解决方法: $where ...
- VC++ VS2010 error LNK1123 转换到 COFF 期间失败 怎么办
1 无法输出Hello world 2 点击项目-属性,打开属性页 3 配置属性-清单工具-输入和输出-嵌入清单改成否 4 找出计算机中的所有cvtres.exe,删掉早期的,只留最新版的 ...
- 杭电1232畅通project
畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- M公司入职记
非常遗憾,我又跳槽了,到传说中的M公司,第一天就体会到了,神马叫差距. 要求9点30到,提前10分钟到了前台.前台MM懵懂的跟我说入职找人事,好吧. 电话联系相关人等,等到10点左右,被引导到一位不知 ...
- 在Oracle数据库中使用NFS,怎样调优?
MOS上有好多文章,基本上都跑不了以下三点: Setup can make a big difference 1. Network topology and load 2. NFS mount opt ...
- STL源代码剖析——STL算法之set集合算法
前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...