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

【黑金教程笔记之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_data17 );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   begin33     rTen<=32d0;34      rOne<=32d0;35   end36 else37   begin38     rTen<=Number_data/10;39     rOne<=Number_data%10;40   end41 42 /***********************************/43 44 assign Ten_data=http://www.mamicode.com/rTen[3:0];45 assign One_data=http://www.mamicode.com/rOne[3:0];46 47 /***********************************/48 49 endmodule50   
 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_data17 );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=8b1100_0000,29           _1=8b1111_1001,30              _2=8b1010_0100,31              _3=8b1011_0000,32              _4=8b1001_1001,33              _5=8b1001_0010,34              _6=8b1000_0010,35              _7=8b1111_1000,36              _8=8b1000_0000,37              _9=8b1001_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 begin46   rTen_dig_tube_data<=8b1111_1111;47 end48 else49   case(Ten_data)50     4d0:rTen_dig_tube_data<=_0; 51      4d1:rTen_dig_tube_data<=_1; 52      4d2:rTen_dig_tube_data<=_2;53     4d3:rTen_dig_tube_data<=_3; 54      4d4:rTen_dig_tube_data<=_4; 55      4d5:rTen_dig_tube_data<=_5;56     4d6:rTen_dig_tube_data<=_6; 57      4d7:rTen_dig_tube_data<=_7; 58      4d8:rTen_dig_tube_data<=_8;     59      4d9:rTen_dig_tube_data<=_9;60   endcase61 62 /**************************************/63 64 reg [7:0]rOne_dig_tube_data;65 66 always @(posedge CLK or negedge RST_n)67 if(!RST_n)68 begin69   rOne_dig_tube_data<=8b1111_1111;70 end71 else72   case(One_data)73     4d0:rOne_dig_tube_data<=_0; 74      4d1:rOne_dig_tube_data<=_1; 75      4d2:rOne_dig_tube_data<=_2;76     4d3:rOne_dig_tube_data<=_3; 77      4d4:rOne_dig_tube_data<=_4; 78      4d5:rOne_dig_tube_data<=_5;79     4d6:rOne_dig_tube_data<=_6; 80      4d7:rOne_dig_tube_data<=_7; 81      4d8:rOne_dig_tube_data<=_8;     82      4d9:rOne_dig_tube_data<=_9;83   endcase84   85 /********************************************/86 87 assign Ten_dig_tube_data=http://www.mamicode.com/rTen_dig_tube_data;88 assign One_dig_tube_data=http://www.mamicode.com/rOne_dig_tube_data;89 90 /********************************************/91 92 endmodule93 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_sig14 );15 16 input CLK;17 input RST_n;18 output [1:0]Column_scan_sig;19 20 /****************************************/21 //50M*0.01-1=499_99922 parameter T10ms=19d499_999;23 24 /****************************************/25 26 reg [18:0]count1;27 28 always @(posedge CLK or negedge RST_n)29 if(!RST_n)30   count1<=19d0;31 else if(count1==T10ms)32   count1<=19d0;33 else 34   count1<=count1+1b1;35 36 /****************************************/37 38 reg [1:0] t;39 40 always @(posedge CLK or negedge RST_n)41 if(!RST_n)42   t<=2d0;43 else if(t==2d2)44   t<=2d0;45 else if(count1==T10ms)46   t<=t+1b1;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<=2b10;55 else if(count1==T10ms)56   case(t)57     2d0:rColumn_scan<=2b10;58     2d1:rColumn_scan<=2b01;59   endcase60 61 /*******************************************/62 63 assign Column_scan_sig=rColumn_scan;64 65 /*******************************************/66 67 endmodule68   
 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_sig16 );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_99926 parameter T10ms=19d499_999;27 28 /****************************************/29 30 reg [18:0]count1;31 32 always @(posedge CLK or negedge RST_n)33 if(!RST_n)34   count1<=19d0;35 else if(count1==T10ms)36   count1<=19d0;37 else 38   count1<=count1+1b1;39 40 /****************************************/41 42 reg [1:0] t;43 44 always @(posedge CLK or negedge RST_n)45 if(!RST_n)46   t<=2d0;47 else if(t==2d2)48   t<=2d0;49 else if(count1==T10ms)50   t<=t+1b1;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<=8d0;59 else if(count1==T10ms)60   case(t)61     2d0:rRow_scan<=Ten_dig_tube_data;62     2d1:rRow_scan<=One_dig_tube_data;63   endcase64 65 /*******************************************/66 67 assign Row_scan_sig=rRow_scan;68 69 /*******************************************/70 71 endmodule72   
 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_sig17 );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<=7b111_1111; 85      rHEX0<=7b111_1111; 86   end 87 else 88   case(Column_scan_sig)   89     2b10:rHEX1<=Row_scan_sig; 90      2b01: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_out14 );15 16 input CLK;17 input RST_n;18 output [8:0]Count_out;19 20 /****************************************/21 //50M*0.1-1=4_999_99922 parameter T100ms=26d4_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<=26d0;31 else if(count1==T100ms)32   count1<=26d0;33 else 34   count1<=count1+1b1;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<=8d0;43 else if(Number_data=http://www.mamicode.com/=8d100)44   Number_data<=8d0;45 else if(count1==T100ms)46   Number_data<=Number_data+1b1; 47  48 /****************************************/49 50 assign Count_out=Number_data;51 52 /****************************************/ 53   54 endmodule55   

 

模块说明:

(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 数码管电路驱动】—笔记