实验七的目的是设计实现最大为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 [:] Number_data;
  22. output [:] Ten_data;
  23. output [:] One_data;
  24.  
  25. /********************************/
  26.  
  27. reg [:]rTen;
  28. reg [:]rOne;
  29.  
  30. always @(posedge CLK or negedge RST_n)
  31. if(!RST_n)
  32. begin
  33. rTen<='d0;
  34. rOne<='d0;
  35. end
  36. else
  37. begin
  38. rTen<=Number_data/;
  39. rOne<=Number_data%;
  40. end
  41.  
  42. /***********************************/
  43.  
  44. assign Ten_data=rTen[:];
  45. assign One_data=rOne[:];
  46.  
  47. /***********************************/
  48.  
  49. endmodule
  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 [:]Ten_data;
  22. input [:]One_data;
  23. output [:]Ten_dig_tube_data;
  24. output [:]One_dig_tube_data;
  25.  
  26. /****************************************/
  27. //common anode digital tube
  28. parameter _0='b1100_0000,
  29. _1='b1111_1001,
  30. _2='b1010_0100,
  31. _3='b1011_0000,
  32. _4='b1001_1001,
  33. _5='b1001_0010,
  34. _6='b1000_0010,
  35. _7='b1111_1000,
  36. _8='b1000_0000,
  37. _9='b1001_0000;
  38.  
  39. /*******************************************/
  40.  
  41. reg [:]rTen_dig_tube_data;
  42.  
  43. always @(posedge CLK or negedge RST_n)
  44. if(!RST_n)
  45. begin
  46. rTen_dig_tube_data<='b1111_1111;
  47. end
  48. else
  49. case(Ten_data)
  50. 'd0:rTen_dig_tube_data<=_0;
  51. 'd1:rTen_dig_tube_data<=_1;
  52. 'd2:rTen_dig_tube_data<=_2;
  53. 'd3:rTen_dig_tube_data<=_3;
  54. 'd4:rTen_dig_tube_data<=_4;
  55. 'd5:rTen_dig_tube_data<=_5;
  56. 'd6:rTen_dig_tube_data<=_6;
  57. 'd7:rTen_dig_tube_data<=_7;
  58. 'd8:rTen_dig_tube_data<=_8;
  59. 'd9:rTen_dig_tube_data<=_9;
  60. endcase
  61.  
  62. /**************************************/
  63.  
  64. reg [:]rOne_dig_tube_data;
  65.  
  66. always @(posedge CLK or negedge RST_n)
  67. if(!RST_n)
  68. begin
  69. rOne_dig_tube_data<='b1111_1111;
  70. end
  71. else
  72. case(One_data)
  73. 'd0:rOne_dig_tube_data<=_0;
  74. 'd1:rOne_dig_tube_data<=_1;
  75. 'd2:rOne_dig_tube_data<=_2;
  76. 'd3:rOne_dig_tube_data<=_3;
  77. 'd4:rOne_dig_tube_data<=_4;
  78. 'd5:rOne_dig_tube_data<=_5;
  79. 'd6:rOne_dig_tube_data<=_6;
  80. 'd7:rOne_dig_tube_data<=_7;
  81. 'd8:rOne_dig_tube_data<=_8;
  82. '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
  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 [:]Column_scan_sig;
  19.  
  20. /****************************************/
  21. //50M*0.01-1=499_999
  22. parameter T10ms='d499_999;
  23.  
  24. /****************************************/
  25.  
  26. reg [:]count1;
  27.  
  28. always @(posedge CLK or negedge RST_n)
  29. if(!RST_n)
  30. count1<='d0;
  31. else if(count1==T10ms)
  32. count1<='d0;
  33. else
  34. count1<=count1+'b1;
  35.  
  36. /****************************************/
  37.  
  38. reg [:] t;
  39.  
  40. always @(posedge CLK or negedge RST_n)
  41. if(!RST_n)
  42. t<='d0;
  43. else if(t=='d2)
  44. t<='d0;
  45. else if(count1==T10ms)
  46. t<=t+'b1;
  47.  
  48. /******************************************/
  49.  
  50. reg [:] rColumn_scan;
  51.  
  52. always @(posedge CLK or negedge RST_n)
  53. if(!RST_n)
  54. rColumn_scan<='b10;
  55. else if(count1==T10ms)
  56. case(t)
  57. 'd0:rColumn_scan<=2'b10;
  58. 'd1:rColumn_scan<=2'b01;
  59. endcase
  60.  
  61. /*******************************************/
  62.  
  63. assign Column_scan_sig=rColumn_scan;
  64.  
  65. /*******************************************/
  66.  
  67. endmodule
  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 [:]Ten_dig_tube_data;
  21. input [:]One_dig_tube_data;
  22. output [:]Row_scan_sig;
  23.  
  24. /****************************************/
  25. //50M*0.01-1=499_999
  26. parameter T10ms='d499_999;
  27.  
  28. /****************************************/
  29.  
  30. reg [:]count1;
  31.  
  32. always @(posedge CLK or negedge RST_n)
  33. if(!RST_n)
  34. count1<='d0;
  35. else if(count1==T10ms)
  36. count1<='d0;
  37. else
  38. count1<=count1+'b1;
  39.  
  40. /****************************************/
  41.  
  42. reg [:] t;
  43.  
  44. always @(posedge CLK or negedge RST_n)
  45. if(!RST_n)
  46. t<='d0;
  47. else if(t=='d2)
  48. t<='d0;
  49. else if(count1==T10ms)
  50. t<=t+'b1;
  51.  
  52. /******************************************/
  53.  
  54. reg [:] rRow_scan;
  55.  
  56. always @(posedge CLK or negedge RST_n)
  57. if(!RST_n)
  58. rRow_scan<='d0;
  59. else if(count1==T10ms)
  60. case(t)
  61. 'd0:rRow_scan<=Ten_dig_tube_data;
  62. 'd1:rRow_scan<=One_dig_tube_data;
  63. endcase
  64.  
  65. /*******************************************/
  66.  
  67. assign Row_scan_sig=rRow_scan;
  68.  
  69. /*******************************************/
  70.  
  71. endmodule
  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 [:]Ten_dig_tube_data;
  22. input [:]One_dig_tube_data;
  23. output [:]Column_scan_sig;
  24. output [:]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 [:]HEX1;
  25. output [:]HEX0;
  26.  
  27. wire [:]Number_data;
  28. wire [:]Row_scan_sig;
  29. wire [:]Column_scan_sig;
  30. reg [:] rHEX1;
  31. reg [:] rHEX0;
  32.  
  33. /**************************************/
  34.  
  35. wire [:]Ten_data;
  36. wire [:]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 [:]Ten_dig_tube_data;
  49. wire [:]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<='b111_1111;
  85. rHEX0<='b111_1111;
  86. end
  87. else
  88. case(Column_scan_sig)
  89. 'b10:rHEX1<=Row_scan_sig;
  90. 'b01:rHEX0<=Row_scan_sig;
  91. endcase
  92.  
  93. /*******************************************/
  94.  
  95. assign HEX1=rHEX1;
  96. assign HEX0=rHEX0;
  97.  
  98. /*******************************************/
  99.  
  100. 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 [:]Count_out;
  19.  
  20. /****************************************/
  21. //50M*0.1-1=4_999_999
  22. parameter T100ms='d4_999_999;
  23.  
  24. /****************************************/
  25.  
  26. reg [:]count1;
  27.  
  28. always @(posedge CLK or negedge RST_n)
  29. if(!RST_n)
  30. count1<='d0;
  31. else if(count1==T100ms)
  32. count1<='d0;
  33. else
  34. count1<=count1+'b1;
  35.  
  36. /****************************************/
  37.  
  38. reg [:] Number_data;
  39.  
  40. always @(posedge CLK or negedge RST_n)
  41. if(!RST_n)
  42. Number_data<='d0;
  43. else if(Number_data=='d100)
  44. Number_data<='d0;
  45. else if(count1==T100ms)
  46. Number_data<=Number_data+'b1;
  47.  
  48. /****************************************/
  49.  
  50. assign Count_out=Number_data;
  51.  
  52. /****************************************/
  53.  
  54. 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 数码管电路驱动】—笔记的更多相关文章

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

    1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路      如果要求数码管显示我们想要的数字,首先需 ...

  2. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

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

    昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er ...

  4. Pycharm新手教程,只需要看这篇就够了

    pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...

  5. 【转】寻找最好的笔记软件:海选篇 (v1.0)

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html   序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...

  6. Matlab 多个版本的安装包下载、安装和激活教程 + 多套数学建模视频教程

    目录 1. 关键词 1.1. 说明 2. 下载地址 2.1. OneDrive高速云盘 2.1.1. 多版本的安装包 2.1.2. 多套数学建模的视频教程 2.2. 百度云 3. 安装教程 1. 关键 ...

  7. Redis 笔记 01:入门篇

    Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

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

    第四篇(VidPN)中提到过MIRROR驱动. 在进入本篇的实际内容前, 带着好奇心, 想请教CSDN中的显卡驱动方面的大虾, 怎样才干把这个驱动玩起来, 这个驱动的作用是什么,等等, 敬请不吝赐教. ...

  9. js便签笔记(12)——浏览TOM大叔博客的学习笔记 part2

    1. 前言 昨天写了<js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1>,简单记录了几个问题.part1的重点还是在于最后那个循环创建函数的问题,也就是多个子函数公用一个闭 ...

随机推荐

  1. BZOJ2501: [usaco2010 Oct]Soda Machine

    n<=50000个区间,求哪个点被覆盖区间数量最多,输出这个数量. 差分模板..然而数组忘开两倍.. #include<stdio.h> #include<string.h&g ...

  2. 怎么配置ODBC microsoft Access 安装(win10)

    笔者看着书配置Access连接方法但就是找不到书中的"Access.mdb". 后来才知道.mdb需要自己创建....对于刚入门的我很无语啊!!!!! 下面带你走出小坑 1.从控制 ...

  3. 【.Net Core 学习系列】-- 自定义错误页面在IE浏览器中不能正常显示

    测试场景: 1. 新建.Net Core Web项目 2. 选择模板: 3. 修改Error页面代码:(去掉母版页并修改页面显示信息) 4. 修改[ASPNETCORE_ENVIRONMENT],并抛 ...

  4. 【转载】Unix设计哲学 & 回车换行八卦 & EOF八卦 & UNIX目录结构八卦

    昨天看了这篇文章 <关于Unix哲学> 首先用了两个例子,用风扇吹出空肥皂盒 和 太空铅笔,来说明简单设计也能派上作用吧. Unix哲学,Wikipedia上列出了好几个版本,不同的人有不 ...

  5. 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 ...

  6. VC++ VS2010 error LNK1123 转换到 COFF 期间失败 怎么办

    1 无法输出Hello world   2 点击项目-属性,打开属性页   3 配置属性-清单工具-输入和输出-嵌入清单改成否   4 找出计算机中的所有cvtres.exe,删掉早期的,只留最新版的 ...

  7. 杭电1232畅通project

    畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. M公司入职记

    非常遗憾,我又跳槽了,到传说中的M公司,第一天就体会到了,神马叫差距. 要求9点30到,提前10分钟到了前台.前台MM懵懂的跟我说入职找人事,好吧. 电话联系相关人等,等到10点左右,被引导到一位不知 ...

  9. 在Oracle数据库中使用NFS,怎样调优?

    MOS上有好多文章,基本上都跑不了以下三点: Setup can make a big difference 1. Network topology and load 2. NFS mount opt ...

  10. STL源代码剖析——STL算法之set集合算法

    前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...