两位数码管显示

目标:

共阳极数码管实现动态显示

实现过程规划(功能分解,分步实现):

取得两位数0~99,
第一步,分成个位十位,
第二步,将个位十位转换为数码管编码,
第三步,数码管显示模块:
1.选通列高位,输出十位数码管编码;
2.选通列地位,输出个位数码管编码;

第一步:number_mod_module

将0~99数Number_Data分解为Ten_Data, One_Data

module number_mod_module
(CLK, RSTn,Number_Data,Ten_Data, One_Data
);input CLK;input RSTn;input [7:0]Number_Data;//0-99output [3:0]Ten_Data;output [3:0]One_Data;/*********************************/reg [31:0]rTen;//除法操作必须32reg [31:0]rOne;always @ ( posedge CLK or negedge RSTn )if( !RSTn )beginrTen <= 32'd0;rOne <= 32'd0;endelse beginrTen <= Number_Data / 10;rOne <= Number_Data % 10;end/***********************************/assign Ten_Data = rTen[3:0];assign One_Data = rOne[3:0];/***********************************/endmodule

第二步:smg_encoder_module

将十位个位数Ten_Data, One_Data转换为数码管编码Ten_SMG_Data, One_SMG_Data

module smg_encoder_module
(CLK, RSTn, Ten_Data, One_Data,Ten_SMG_Data, One_SMG_Data
);input CLK;input RSTn;input [3:0]Ten_Data;input [3:0]One_Data;output [7:0]Ten_SMG_Data;output [7:0]One_SMG_Data;/**********************共阳极低电平有效*****************/parameter _0 = 8'b1100_0000, _1 = 8'b1111_1001, _2 = 8'b1010_0100, _3 = 8'b1011_0000, _4 = 8'b1001_1001, _5 = 8'b1001_0010, _6 = 8'b1000_0010, _7 = 8'b1111_1000, _8 = 8'b1000_0000,_9 = 8'b1001_0000;/***************************************/reg [7:0]rTen_SMG_Data;always @ ( posedge CLK or negedge RSTn )if( !RSTn )beginrTen_SMG_Data <= 8'b1111_1111;//不显示endelse case( Ten_Data )4'd0 : rTen_SMG_Data <= _0;4'd1 : rTen_SMG_Data <= _1;4'd2 : rTen_SMG_Data <= _2;4'd3 : rTen_SMG_Data <= _3;4'd4 : rTen_SMG_Data <= _4;4'd5 : rTen_SMG_Data <= _5;4'd6 : rTen_SMG_Data <= _6;4'd7 : rTen_SMG_Data <= _7;4'd8 : rTen_SMG_Data <= _8;4'd9 : rTen_SMG_Data <= _9;endcase/***************************************/reg [7:0]rOne_SMG_Data;always @ ( posedge CLK or negedge RSTn )if( !RSTn )beginrOne_SMG_Data <= 8'b1111_1111;endelse case( One_Data )4'd0 : rOne_SMG_Data <= _0;4'd1 : rOne_SMG_Data <= _1;4'd2 : rOne_SMG_Data <= _2;4'd3 : rOne_SMG_Data <= _3;4'd4 : rOne_SMG_Data <= _4;4'd5 : rOne_SMG_Data <= _5;4'd6 : rOne_SMG_Data <= _6;4'd7 : rOne_SMG_Data <= _7;4'd8 : rOne_SMG_Data <= _8;4'd9 : rOne_SMG_Data <= _9;endcase/***************************************/assign Ten_SMG_Data = rTen_SMG_Data;assign One_SMG_Data = rOne_SMG_Data;/***************************************/endmodule

第三步:smg_scan_module

1.column_scan_module列扫描

前10ms选通高位,后10ms选通低位
Column_Scan_Sig选通数码管0,1

module column_scan_module
(CLK, RSTn, Column_Scan_Sig
);input CLK;input RSTn;output [1:0]Column_Scan_Sig;//选通数码管0,1/*****************************/parameter T10MS = 19'd499_999;//50M*0.01-1=499_999/************10ms计时*****************/reg [18:0]Count1;always @ ( posedge CLK or negedge RSTn )if( !RSTn )Count1 <= 19'd0;else if( Count1 == T10MS )Count1 <= 19'd0;elseCount1 <= Count1 + 19'b1;/*******************************/reg [1:0]t;always @ ( posedge CLK or negedge RSTn )if( !RSTn )t <= 2'd0;else if( t == 2'd2 )t <= 2'd0;else if( Count1 == T10MS )t <= t + 1'b1;/****************01、、10************/reg [1:0]rColumn_Scan;always @ ( posedge CLK or negedge RSTn )if( !RSTn )rColumn_Scan <= 2'b01;else if( Count1 == T10MS )case( t )2'd0 : rColumn_Scan <= 2'b01;//低电平有效,前10ms写左边数码管十位2'd1 : rColumn_Scan <= 2'b10;//低电平有效,后10ms写右边数码管个位endcase  /******************************/assign Column_Scan_Sig = rColumn_Scan;/******************************/endmodule

2.row_scan_module行扫描,

前10ms输出十位数码管编码
后10ms输出个位数码管编码

module row_scan_module
(CLK, RSTn, Ten_SMG_Data, One_SMG_Data,Row_Scan_Sig
);input CLK;input RSTn;input [7:0]Ten_SMG_Data;input [7:0]One_SMG_Data;output [7:0]Row_Scan_Sig;/*******************************/parameter T10MS = 19'd499_999;//50M*0.01-1=499_999/*******************************/reg [18:0]Count1;always @ ( posedge CLK or negedge RSTn )if( !RSTn )Count1 <= 19'd0;else if( Count1 == T10MS )Count1 <= 19'd0;elseCount1 <= Count1 + 19'b1;/*******************************/reg [1:0]t;always @ ( posedge CLK or negedge RSTn )if( !RSTn )t <= 2'd0;else if( t == 2'd2 )t <= 2'd0;else if( Count1 == T10MS )t <= t + 1'b1;/**********************************/reg [7:0]rData;always @ ( posedge CLK or negedge RSTn )if( !RSTn )rData <= 8'd0;else if( Count1 == T10MS )case( t )2'd0 : rData <= Ten_SMG_Data;//前10ms写十位2'd1 : rData <= One_SMG_Data; //后10ms写个位endcase/***********************************/assign Row_Scan_Sig = rData;/***********************************/endmodule

3.数码管组合显示模块smg_scan_module

输入十位个位数码管编码Ten_SMG_Data, One_SMG_Data输出行列控制字Row_Scan_Sig, Column_Scan_Sig

module smg_scan_module
(CLK, RSTn, Ten_SMG_Data, One_SMG_Data,Row_Scan_Sig, Column_Scan_Sig
);input CLK;input RSTn;input [7:0]Ten_SMG_Data;input [7:0]One_SMG_Data;output [7:0]Row_Scan_Sig;output [1:0]Column_Scan_Sig;/*****************************/row_scan_module U1(.CLK( CLK ),.RSTn( RSTn ),.Ten_SMG_Data( Ten_SMG_Data ), // input - from top.One_SMG_Data( One_SMG_Data ), // input - from top.Row_Scan_Sig( Row_Scan_Sig )  // output - to top);column_scan_module U2(.CLK( CLK ),.RSTn( RSTn ),.Column_Scan_Sig( Column_Scan_Sig ) // output - to top);/********************************/endmodule

第三步:组合模块,输入数字,显示数字

module exp07_top
(CLK, RSTn, Number_Data,Row_Scan_Sig, Column_Scan_Sig
);input CLK;input RSTn;input [7:0]Number_Data;output [7:0]Row_Scan_Sig;output [1:0]Column_Scan_Sig;/**************************************/wire [3:0]Ten_Data;wire [3:0]One_Data;number_mod_module U1//取模分成十位个位(.CLK( CLK ),.RSTn( RSTn ),.Number_Data( Number_Data ), // input - form top.Ten_Data( Ten_Data ), // output - to U2.One_Data( One_Data )  // output - to u2\\U2);/****************************************/wire [7:0]Ten_SMG_Data;wire [7:0]One_SMG_Data;smg_encoder_module U2//转码,将个位十位转成数码管对应的值(.CLK( CLK ),.RSTn( RSTn ),.Ten_Data( Ten_Data ), // input - from U1.One_Data( One_Data ), // input - from U1.Ten_SMG_Data( Ten_SMG_Data ), // output - to U3.One_SMG_Data( One_SMG_Data )  // output - to U3);/*****************************************/smg_scan_module U3(.CLK( CLK ),.RSTn( RSTn ),.Ten_SMG_Data( Ten_SMG_Data ), // input - from U2.One_SMG_Data( One_SMG_Data ), // input - from U2.Row_Scan_Sig( Row_Scan_Sig ), // output - to top.Column_Scan_Sig( Column_Scan_Sig ) // output - to top);/******************************************/endmodule

显示demo

module exp07_demo
(CLK, RSTn,Row_Scan_Sig, Column_Scan_Sig
);input CLK;input RSTn;output [7:0]Row_Scan_Sig;output [1:0]Column_Scan_Sig;/************************************/parameter T1S = 26'd49_999_999;//50M*1-1=49_999_999/************************************/reg [25:0]Count1;always @ ( posedge CLK or negedge RSTn )if( !RSTn )Count1 <= 26'd0;else if( Count1 == T1S )Count1 <= 26'd0;elseCount1 <= Count1 + 1'b1;/***************************************/reg [7:0]Counter_Sec;always @ ( posedge CLK or negedge RSTn )if( !RSTn )begin Counter_Sec <= 8'd0;endelse if( Count1 == T1S )beginif( Counter_Sec < 8'd15 ) Counter_Sec <= Counter_Sec + 1'b1;else Counter_Sec <= 8'd0;end/****************************************/exp07_top U1(.CLK( CLK ),.RSTn( RSTn ),.Number_Data( Counter_Sec ),.Row_Scan_Sig( Row_Scan_Sig ),.Column_Scan_Sig( Column_Scan_Sig ));/******************************************/endmodule

致谢VerilogHDL 那些事儿_建模篇

FPGA初探(五)之两位数码管显示相关推荐

  1. 两位数码管秒表c语言,两位数码管显示计时器.doc

    两位数码管显示计时器 一.题目 用定时0的方式1实现数码管两位59S循环计时(计时器) 二.思路方案 本实验利用单片机的定时器/计数器定时和计数的原理,通过proteus 仿真软件来实现模拟实现.模拟 ...

  2. 两位数码管30秒倒计时c语言,基于51单片机共阴两位数码管显示倒计时

    <基于51单片机共阴两位数码管显示倒计时>由会员分享,可在线阅读,更多相关<基于51单片机共阴两位数码管显示倒计时(2页珍藏版)>请在人人文库网上搜索. 1.基于51单片机共阴 ...

  3. 使用定时器的中断方式。具体功能描述如下:使用定时器控制三位数码管显示时间,也可以轻易改为两位数码管显示时间

    #include <REGX52.H> unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0 ...

  4. 51单片机矩阵按键详解,两位数码管显示(普中HC6800ESV2.0)

    一.简述 本人是一名在校生,这个学期刚好在学单片机,自己也挺有兴趣,前面在写数码管.时钟啥的程序时都没什么大问题,但是做到矩阵按键时碰到了一些问题,不过已经解决,下面我会把碰到的问题和解决方法都写出来 ...

  5. 两位数码管显示学号练习程序和图_数码管的原理与作用

    今天来说一下数码管,数码管在电路中应用的也是比较多的,在生活中随处可见,比如电饭煲,电子钟,洗衣机,等各种家用电器都会用到数码管,既然知道了它的用处,那么就来说说他的原理 数码管的原理其实非常简单,它 ...

  6. c语言两位数码管程序,单片机制作—两位数码管显示 c语言 汇编程序+电路图

    程序清单(汇编): ;2011 04 05 D:\DPJ\数码管段显\数码管段显2.asm S0 BIT P3.7 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 3 ...

  7. Verilog HDL**两位数码管计数器,关于reg位数的问题

    顶层原理图 / count.v module count(input sys_clk,input sys_rst_n,output reg [7:0] data); //累加数parameter MA ...

  8. Arduino实验之两位数码管实验报告

    第一种方案 从1-12引脚分别如图所示这样接 下面五个脚从左到右分别是1 2 3 4 5,上面六个脚从右到左分别是7 8 9 10 11 12,13是LED灯 实现方案一:将数码管从1变成99 两位数 ...

  9. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

    编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00.01.02--98.99每间隔500ms加1显示. 程序: #include <reg51.h> ...

最新文章

  1. [ZJOI2010]网络扩容
  2. android Camera照相机技术(二)定制拍照
  3. SQL 流程控制语句 之四 WAITFOR语句介绍
  4. (10) nginx 统计模块安装使用和优化
  5. 简单的01背包和完全背包
  6. Gulp模块报错:Did you forget to signal async completion? 处理
  7. 公司终于把我变成了一颗忠诚的螺丝钉,我再也不能离开它
  8. 吴恩达机器学习cs229一二节总结
  9. GitBash和GitGui右键失效解决方法
  10. 分位数回归(quantile regression)R实现
  11. 计算机毕业设计springboot+vue+elementUI地方废物回收机构管理系统
  12. FairGuard游戏加固兼容摸摸鱼和TAPTAP云玩
  13. 【codevs4355】王的对决(简单数论) 莫比乌斯反演
  14. springboot2
  15. Speedoffice(excel)如何快捷隐藏表格内所有空行
  16. android九宫格隐藏,android九宫格锁屏控件
  17. java字符串转成utf-8_将字符串的编码格式转换为utf-8
  18. 兰道定理 HDU-5873
  19. 谷歌开源的跨平台UI开发框架Flutter
  20. videojs进度条始终为零

热门文章

  1. ONLYOFFICE与O2OA参加西部教育博览会圆满成功
  2. SAP 各大常用模块汇总介绍(三) | 易拓科技
  3. 电子罗盘详解之与GPS导航区别
  4. win10注册dll
  5. MSBuild的入门完整教程(包学包会)
  6. 区块链不是神医,却能治疗医疗痼疾
  7. 分享一个高清大图的网站
  8. 从猎头角度推测,搜狗的买卖对于互联网格局和薪水的影响
  9. Docker——容器内部执行宿主机的docker命令
  10. 亚马逊,速卖通,国际站卖家在做测评时如何将风险降到最低呢?