【黑金教程笔记之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的重点还是在于最后那个循环创建函数的问题,也就是多个子函数公用一个闭 ...
 
随机推荐
- POJ 2391 多源多汇拆点最大流 +flody+二分答案
			
题意:在一图中,每个点有俩个属性:现在牛的数量和雨棚大小(下雨时能容纳牛的数量),每个点之间有距离, 给出牛(速度一样)在顶点之间移动所需时间,问最少时间内所有牛都能避雨. 模型分析:多源点去多汇点( ...
 - 学习日常笔记<day14>自定义标签
			
1自定义标签 1.1第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类 /** * 标签处理器类 * @author APPle * 1)继 ...
 - Swift初体验之HelloWord+苹果Swift编程语言新手教程【中文版】
			
AppDelegate.swift : <span style="font-size:24px;"><strong>// // AppDelegate.sw ...
 - 【APUE】进程间通信之消息队列
			
三种IPC的共同特征 1.标识符和键 每个内核中的IPC结构都用一个非负整数的标识符加以引用.当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大值,然后又 ...
 - JAVA数组去除重复数据
			
一.用List集合实现 , , , , , , ,}; List<Integer> list = new ArrayList<Integer>(); ; i<str. ...
 - Java第二次作业參考代码
			
Java第二次作业參考代码 [程序11] 题目:有1.2.3.4四个数字,能组成多少个互不同样且无反复数字的三位数?都是多少? public class lianxi11 { public stati ...
 - angular  react  vue  浏览器兼容情况汇总
			
一.逻辑层 框架 (1)angular Angular早在1.3版本就抛弃了对ie8的支持. (2)react React 早在0.14.x 版本就抛弃了对ie8的支持. (3)vue Vue就没打算 ...
 - java notify notifyAll
			
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法. void notify(): 唤醒一个正在等待该对象的线程.void notifyAll(): 唤醒所 ...
 - libevent多线程使用事项
			
转 http://www.cnblogs.com/Seapeak/archive/2010/04/08/1707807.html 在linux平台上使用c开发网络程序的同志们一般情况下都对鼎鼎大名的l ...
 - MYSQL 增加字段不报错,插入数据不报错处理
			
') ON DUPLICATE KEY UPDATE sort_name = "vipset"; 重点在 ON DUPLICATE KEY UPDATE sort_name = & ...