【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记

实验七的目的是设计实现最大为99数字在2个数码管上。采用同步动态扫描。即行信号和列信号同步扫描。这里数码管是共阳极的。选择端口也是共阳极的。

模块:

 1 /*************************************
 2 module name: number_mod_module.v
 3 function: generate ten-bit and one-bit
 4           number.
 5
 6 by yf.x
 7 2014-11-11
 8
 9 *************************************/
10
11 module number_mod_module(
12 CLK,
13 RST_n,
14 Number_data,
15 Ten_data,
16 One_data
17 );
18
19 input CLK;
20 input RST_n;
21 input [7:0] Number_data;
22 output [3:0] Ten_data;
23 output [3:0] One_data;
24
25 /********************************/
26
27 reg [31:0]rTen;
28 reg [31:0]rOne;
29
30 always @(posedge CLK or negedge RST_n)
31 if(!RST_n)
32   begin
33     rTen<=32‘d0;
34      rOne<=32‘d0;
35   end
36 else
37   begin
38     rTen<=Number_data/10;
39     rOne<=Number_data%10;
40   end
41
42 /***********************************/
43
44 assign Ten_data=rTen[3:0];
45 assign One_data=rOne[3:0];
46
47 /***********************************/
48
49 endmodule
50   
 1 /**********************************************
 2 module name:digital_tube_encode_module.v
 3 function: encode
 4
 5 by yf.x
 6 2014-11-11
 7
 8 **********************************************/
 9
10 module digital_tube_encode_module(
11 CLK,
12 RST_n,
13 Ten_data,
14 One_data,
15 Ten_dig_tube_data,
16 One_dig_tube_data
17 );
18
19 input CLK;
20 input RST_n;
21 input [3:0]Ten_data;
22 input [3:0]One_data;
23 output [7:0]Ten_dig_tube_data;
24 output [7:0]One_dig_tube_data;
25
26 /****************************************/
27 //common anode digital tube
28 parameter _0=8‘b1100_0000,
29           _1=8‘b1111_1001,
30              _2=8‘b1010_0100,
31              _3=8‘b1011_0000,
32              _4=8‘b1001_1001,
33              _5=8‘b1001_0010,
34              _6=8‘b1000_0010,
35              _7=8‘b1111_1000,
36              _8=8‘b1000_0000,
37              _9=8‘b1001_0000;
38
39 /*******************************************/
40
41 reg [7:0]rTen_dig_tube_data;
42
43 always @(posedge CLK or negedge RST_n)
44 if(!RST_n)
45 begin
46   rTen_dig_tube_data<=8‘b1111_1111;
47 end
48 else
49   case(Ten_data)
50     4‘d0:rTen_dig_tube_data<=_0;
51      4‘d1:rTen_dig_tube_data<=_1;
52      4‘d2:rTen_dig_tube_data<=_2;
53     4‘d3:rTen_dig_tube_data<=_3;
54      4‘d4:rTen_dig_tube_data<=_4;
55      4‘d5:rTen_dig_tube_data<=_5;
56     4‘d6:rTen_dig_tube_data<=_6;
57      4‘d7:rTen_dig_tube_data<=_7;
58      4‘d8:rTen_dig_tube_data<=_8;
59      4‘d9:rTen_dig_tube_data<=_9;
60   endcase
61
62 /**************************************/
63
64 reg [7:0]rOne_dig_tube_data;
65
66 always @(posedge CLK or negedge RST_n)
67 if(!RST_n)
68 begin
69   rOne_dig_tube_data<=8‘b1111_1111;
70 end
71 else
72   case(One_data)
73     4‘d0:rOne_dig_tube_data<=_0;
74      4‘d1:rOne_dig_tube_data<=_1;
75      4‘d2:rOne_dig_tube_data<=_2;
76     4‘d3:rOne_dig_tube_data<=_3;
77      4‘d4:rOne_dig_tube_data<=_4;
78      4‘d5:rOne_dig_tube_data<=_5;
79     4‘d6:rOne_dig_tube_data<=_6;
80      4‘d7:rOne_dig_tube_data<=_7;
81      4‘d8:rOne_dig_tube_data<=_8;
82      4‘d9:rOne_dig_tube_data<=_9;
83   endcase
84
85 /********************************************/
86
87 assign Ten_dig_tube_data=rTen_dig_tube_data;
88 assign One_dig_tube_data=rOne_dig_tube_data;
89
90 /********************************************/
91
92 endmodule
93
94
95
96   
 1 /*****************************************
 2 module name: column_scan_module.v
 3 function: choose which digital tube enable.
 4
 5 by yf.x
 6 2014-11-11
 7
 8 *****************************************/
 9
10 module column_scan_module(
11 CLK,
12 RST_n,
13 Column_scan_sig
14 );
15
16 input CLK;
17 input RST_n;
18 output [1:0]Column_scan_sig;
19
20 /****************************************/
21 //50M*0.01-1=499_999
22 parameter T10ms=19‘d499_999;
23
24 /****************************************/
25
26 reg [18:0]count1;
27
28 always @(posedge CLK or negedge RST_n)
29 if(!RST_n)
30   count1<=19‘d0;
31 else if(count1==T10ms)
32   count1<=19‘d0;
33 else
34   count1<=count1+1‘b1;
35
36 /****************************************/
37
38 reg [1:0] t;
39
40 always @(posedge CLK or negedge RST_n)
41 if(!RST_n)
42   t<=2‘d0;
43 else if(t==2‘d2)
44   t<=2‘d0;
45 else if(count1==T10ms)
46   t<=t+1‘b1;
47
48 /******************************************/
49
50 reg [1:0] rColumn_scan;
51
52 always @(posedge CLK or negedge RST_n)
53 if(!RST_n)
54   rColumn_scan<=2‘b10;
55 else if(count1==T10ms)
56   case(t)
57     2‘d0:rColumn_scan<=2‘b10;
58     2‘d1:rColumn_scan<=2‘b01;
59   endcase
60
61 /*******************************************/
62
63 assign Column_scan_sig=rColumn_scan;
64
65 /*******************************************/
66
67 endmodule
68   
 1 /*****************************************
 2 module name: row_scan_module.v
 3 function: choose which number enable.
 4
 5 by yf.x
 6 2014-11-11
 7
 8 *****************************************/
 9
10 module row_scan_module(
11 CLK,
12 RST_n,
13 Ten_dig_tube_data,
14 One_dig_tube_data,
15 Row_scan_sig
16 );
17
18 input CLK;
19 input RST_n;
20 input [7:0]Ten_dig_tube_data;
21 input [7:0]One_dig_tube_data;
22 output [7:0]Row_scan_sig;
23
24 /****************************************/
25 //50M*0.01-1=499_999
26 parameter T10ms=19‘d499_999;
27
28 /****************************************/
29
30 reg [18:0]count1;
31
32 always @(posedge CLK or negedge RST_n)
33 if(!RST_n)
34   count1<=19‘d0;
35 else if(count1==T10ms)
36   count1<=19‘d0;
37 else
38   count1<=count1+1‘b1;
39
40 /****************************************/
41
42 reg [1:0] t;
43
44 always @(posedge CLK or negedge RST_n)
45 if(!RST_n)
46   t<=2‘d0;
47 else if(t==2‘d2)
48   t<=2‘d0;
49 else if(count1==T10ms)
50   t<=t+1‘b1;
51
52 /******************************************/
53
54 reg [7:0] rRow_scan;
55
56 always @(posedge CLK or negedge RST_n)
57 if(!RST_n)
58   rRow_scan<=8‘d0;
59 else if(count1==T10ms)
60   case(t)
61     2‘d0:rRow_scan<=Ten_dig_tube_data;
62     2‘d1:rRow_scan<=One_dig_tube_data;
63   endcase
64
65 /*******************************************/
66
67 assign Row_scan_sig=rRow_scan;
68
69 /*******************************************/
70
71 endmodule
72   
 1 /*************************************************
 2 module name:dig_tube_scan_module.v
 3 function: choose tube and number
 4
 5 by yf.x
 6 2014-11-11
 7
 8 *************************************************/
 9
10 module dig_tube_scan_module(
11 CLK,
12 RST_n,
13 Ten_dig_tube_data,
14 One_dig_tube_data,
15 Column_scan_sig,
16 Row_scan_sig
17 );
18
19 input CLK;
20 input RST_n;
21 input [7:0]Ten_dig_tube_data;
22 input [7:0]One_dig_tube_data;
23 output [1:0]Column_scan_sig;
24 output [7:0]Row_scan_sig;
25
26 /*****************************************/
27
28 column_scan_module u0(
29 .CLK(CLK),
30 .RST_n(RST_n),
31 .Column_scan_sig(Column_scan_sig)
32 );
33
34 row_scan_module u1(
35 .CLK(CLK),
36 .RST_n(RST_n),
37 .Ten_dig_tube_data(Ten_dig_tube_data),
38 .One_dig_tube_data(One_dig_tube_data),
39 .Row_scan_sig(Row_scan_sig)
40 );
41
42 /*******************************************/
43
44 endmodule
  1 /***************************************
  2 module name: lab07_top.v
  3 function: dirver digital tube show number
  4 pin assignments(for DE2-115):
  5 ----------------------------------
  6 CLK-----------------------CLOCK_50
  7 RST_n---------------------KEY[0]
  8 HEX1-0-----------HEX1-0
  9 ----------------------------------
 10
 11 by yf.x
 12 2014-11-11
 13
 14 ***************************************/
 15 module lab07_top(
 16 CLK,
 17 RST_n,
 18 HEX1,
 19 HEX0
 20 );
 21
 22 input CLK;
 23 input RST_n;
 24 output [6:0]HEX1;
 25 output [6:0]HEX0;
 26
 27 wire [7:0]Number_data;
 28 wire [7:0]Row_scan_sig;
 29 wire [1:0]Column_scan_sig;
 30 reg [6:0] rHEX1;
 31 reg [6:0] rHEX0;
 32
 33 /**************************************/
 34
 35 wire [3:0]Ten_data;
 36 wire [3:0]One_data;
 37
 38 number_mod_module u0(
 39 .CLK(CLK),
 40 .RST_n(RST_n),
 41 .Number_data(Number_data),
 42 .Ten_data(Ten_data),
 43 .One_data(One_data)
 44 );
 45
 46 /***************************************/
 47
 48 wire [7:0]Ten_dig_tube_data;
 49 wire [7:0]One_dig_tube_data;
 50
 51 digital_tube_encode_module u1(
 52 .CLK(CLK),
 53 .RST_n(RST_n),
 54 .Ten_data(Ten_data),
 55 .One_data(One_data),
 56 .Ten_dig_tube_data(Ten_dig_tube_data),
 57 .One_dig_tube_data(One_dig_tube_data)
 58 );
 59
 60 /***************************************/
 61
 62 dig_tube_scan_module u2(
 63 .CLK(CLK),
 64 .RST_n(RST_n),
 65 .Ten_dig_tube_data(Ten_dig_tube_data),
 66 .One_dig_tube_data(One_dig_tube_data),
 67 .Column_scan_sig(Column_scan_sig),
 68 .Row_scan_sig(Row_scan_sig)
 69 );
 70
 71 /*******************************************/
 72
 73 count100 u3(
 74 .CLK(CLK),
 75 .RST_n(RST_n),
 76 .Count_out(Number_data)
 77 );
 78
 79 /*******************************************/
 80
 81 always @(posedge CLK or negedge RST_n)
 82 if(!RST_n)
 83   begin
 84     rHEX1<=7‘b111_1111;
 85      rHEX0<=7‘b111_1111;
 86   end
 87 else
 88   case(Column_scan_sig)
 89     2‘b10:rHEX1<=Row_scan_sig;
 90      2‘b01:rHEX0<=Row_scan_sig;
 91   endcase
 92
 93 /*******************************************/
 94
 95 assign HEX1=rHEX1;
 96 assign HEX0=rHEX0;
 97
 98 /*******************************************/
 99
100
101
102 endmodule
 1 /**********************************************************************
 2 module name: count100.v
 3 function:count from 0 to 99, add 1 at each 100ms.
 4
 5 by yf.x
 6 2014-11-12
 7
 8 **********************************************************************/
 9
10 module count100(
11 CLK,
12 RST_n,
13 Count_out
14 );
15
16 input CLK;
17 input RST_n;
18 output [8:0]Count_out;
19
20 /****************************************/
21 //50M*0.1-1=4_999_999
22 parameter T100ms=26‘d4_999_999;
23
24 /****************************************/
25
26 reg [25:0]count1;
27
28 always @(posedge CLK or negedge RST_n)
29 if(!RST_n)
30   count1<=26‘d0;
31 else if(count1==T100ms)
32   count1<=26‘d0;
33 else
34   count1<=count1+1‘b1;
35
36 /****************************************/
37
38 reg [7:0] Number_data;
39
40 always @(posedge CLK or negedge RST_n)
41 if(!RST_n)
42   Number_data<=8‘d0;
43 else if(Number_data==8‘d100)
44   Number_data<=8‘d0;
45 else if(count1==T100ms)
46   Number_data<=Number_data+1‘b1;
47
48 /****************************************/
49
50 assign Count_out=Number_data;
51
52 /****************************************/
53
54 endmodule
55   

模块说明:

(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,不用那么较真)。

时间: 2024-10-25 08:45:28

【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记的相关文章

Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)

1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路      如果要求数码管显示我们想要的数字,首先需要写一个数据接收模块,这个模块接收数据之后需要做什么样的处理呢?这时候我们会想到两个数码管,其中一个显示十位数字,另一个显示各位数字,即把这个数据的十位传给其中一个数码管,各位数字传给另一个数码管来显示.这样我们就会明确了:数据接收模块需要将接收的数据进行拆分,分别输出其十位数据与个位上的数据 程序

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

树莓派玩耍笔记3 -- LCD1602显示篇

LCD1602是一块成本低廉的输出设备,它有着体积小.操作简单.功耗低等优点,所以在一些DIY 产品上会用它来输出一些信息.昨天在使用时,虽然借鉴网上的资源,但是仍然有遇到一些问题,在这里写出来以便大家遇到时能够正确处理. 一.LCD1602 相关[1] 工业字符型液晶,能够同时显示16x02即32个字符.(16列2行) 1.1 管脚 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线. 引脚 符号 功能说明 1 VSS 一般接地 2 VDD 接电源(+5V

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

第十七篇:实例分析(3)--初探WDDM驱动学习笔记(十)

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

【LaTeX】E喵的LaTeX新手入门教程(1)准备篇

昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er.其实\LaTeX er也可以的.2.\LaTeX{} er或\LaTeX\ er数学模式现在我们打算在文档中插入一些数学公式什么的了:按照正常的情况来说,数学公式里面的字符一般都是斜体,而我们要用\textit来一点点把需要变的文字变成斜体这显然是一件极其坑爹的事情.TeX的创造者高爷爷表示他搞T

[Aaronyang] 写给自己的WPF4.5 笔记11[自定义控件-AyImageButton篇 1/4]

我的文章一定要对读者负责-否则不是好文章  ----       www.ayjs.net  aaronyang技术分享 文章导航: 介绍vs2013 WPF开发,属性代码相关技巧 实战AyImageButton 1.0细用慢讲,学会用户控件,依赖属性,属性回调事件 诞生AyImageButton 1.1 支持 控件简单写法,支持自定义AyImageButton写法,提供详细的API 效果图: AyImageButton记录 源码下载:http://pan.baidu.com/s/1eQlHly

第十七篇:曲径通幽处,禅房花木深--初探WDDM驱动学习笔记(一)

正好需要对WINDOWS的WDDM有所了解, 于是就翻了下MSDN. 微软对设备驱动的框架设计非常周全. 无论WDDM, AVSTREAM, 还是USB STACK, STORAGE, 以及其它技术类型的设备驱动, 都是以port/miniport, class/miniclass的形式展开, 微软将经过严密设计,开发,测试的port/class驱动提供给IHV,而IHV只需要把工作重心放到mini驱动的开发上去, 大大降低了项目风险, 人力成本,以及时间成本. AVSTREAM是PCTV的框架