eda设计4位数码管显示
- 格式:doc
- 大小:26.00 KB
- 文档页数:1
EDA原理图输入法设计4位全加器实验课程名称:EDA实验_实验项目名称用原理图输入法设计4位全加器实验成绩实验者专业班级组别同组者实验日期一、实验目的熟悉利用Quartus II 的原理图输入方法设计简单组合电路,掌握层次化设计的方法,并通过一个4位全加器的设计把握利用EDA软件进行原理图输入方式的电子线路设计的详细流程。
二、实验内容和步骤1:完成半加器和全加器的设计,包括原理图输入、编译、综合、适配、仿真、实验板上的硬件测试,并将此全加器电路设计成一个硬件符号入库。
键1、键2、键3(PIO0/1/2)分别接ain、bin、cin;发光管D2、D1(PIO9/8)分别接sum 和cout。
2:建立一个更高层次的原理图设计,利用以上获得的1位全加器构成4位全加器,并完成编译、综合、适配、仿真、和硬件测试。
建议选择电路模式1(附图F-2):键2、键1输入4位加数:键4、键3输入4位被加数:数码6和数码5显示加和:D8显示进位cout。
三、实验仪器Quartus II软件四、实验原理一个4位全加器可以由4个一位全加器构成,加法器间的进位可以串行方式实现,即将低一位全加器仿真波形如下图所示:3.四位全加器原理图如下所示:四位全加器波形图如下所示:五、实验小结通过此次实验,对Quartus II软件有了更加深入的认识,能较为熟练的使用。
在开始仿真的时候,要先弄清原理,接下来的线路连接就较为简单了。
设计顶层文件也是一个重要的知识点,掌握好之后对后面的设计有很大的帮助。
同时对时序仿真部分也要了解相关的步骤设置才能得到最终的仿真结果。
经过反复的联系,全加器的仿真图能很好的掌握并得出正确的仿真结果,对EDA的相应知识点也能很好的掌握,而且能熟练的使用Quartus II,这些对我都有很重要的意义。
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
实验七4*4键盘数据读取及数据显示设计一、实验目的:1、了解数码管的工作原理;2、掌握4*4矩阵键盘和数码管显示的编程方法。
3、学会用于Verilog语言进行程序设计。
二、实验仪器设备1、PC机一台2、FPGA实验开发系统一套。
三、实验原理:本实验通过扫描4*4矩阵键盘的值,在数码管上显示对应按钮的编号数据。
矩阵键盘及数码管电路如下所示。
四、实验要求1、预习教材中的相关内容。
2、阅读并熟悉本次实验的内容。
3、完成实验内容。
五、实验步骤(1)启动 Quartus II 建立一个空白工程,选择的器件为 Altera 公司的 Cyclone 系列的 EP2C8Q240C8芯片,命名为 keyarray.qpf;(2)新建一个 Schematic File 文件,命名为 keyarray.bdf;(3)分别新建 3 个 Verilog HDL File 文件,分别命名为 seg_show.v、 divclk.v、keyarraycontrol.v。
输入程序代码并保存(对应源程序 8),然后进行综合编译。
若在编译过程中发现错误,则找出错误并更正错误,直至编译成功为止。
(4)从设计文件创建模块(File→Creat Update→Creat Symbol Files for Current File),seg_show.v 生成名为seg_show.bsf;divclk.v 生成名为divclk.bsf;keyarraycontrol.v 生成名为keyarraycontrol.bsf;(5)在 keyarray.bdf 文件中,在空白处双击鼠标左键,在 Symbol 对话框左上角的libraries 中,分别将 Project 下的 seg_show, divclk, keyarraycontrol 模块放在图形文件 keyarray.bdf 中,加入输入、输出引脚,双击每个引脚,进行引脚命名,并锁定管脚,将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片);完整的顶层模块原理图如图所示(6)将keyarray.bdf 设置为顶层实体。
EDA设计课程实验报告实验题目:数码管动态显示实验学院名称:专业:电子信息工程班级:姓名:高胜学号小组成员:指导教师:一、实验目的学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
二、设计任务及要求1、在SmartSOPC实验箱上完成数码管动态显示自己学号的后八个数字。
2、放慢扫描速度演示动态显示的原理过程。
三、系统设计1、整体设计方案数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。
虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。
2、功能模块电路设(1)输入输出模块框图(见图1)图1(2)模块逻辑表达(见表1)表1(数码管显示真值表)clk_1k dig seg↑01111111 C0↑10111111 F9注:数码管显示为01180121(3)算法流程图(见图2)(4)Verilog源代码module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0]count; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule四、系统调试(1)仿真代码`timescale 1ns/1nsmodule scan_ledfz;reg clk_1k;reg[31:0] d;wire[7:0] dig;wire[7:0] seg;parameter dely=100;scan_led u1(clk_1k,d,dig,seg);always #(dely/2)clk_1k=~clk_1k;initial beginclk_1k=0;d=32'h01180134;#dely ;#dely ;#dely ;#dely ;#dely ;#(dely*20);#dely $finish;endinitial $monitor($time,,,"%b,%d,%h,%h",clk_1k,d,dig,seg); endmodulemodule scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0] count=3'b000; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule位码代码仿真代码`timescale 1ns/1nsmodule smg_tp; //测试模块的名字reg [2:0] c; //测试输入信号定义为reg型wire[7:0] dig; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒wei u1(c,dig); //调用测试对象initial begin //激励波形设定c=3'b0;#DEL Y c=3'b001 ;#DEL Y c=3'b010 ;#DEL Y c=3'b100 ;#DEL Y c=3'b101 ;#DEL Y c=3'b110 ;#DEL Y c=3'b111 ;#DEL Y $finish;endinitial $monitor($time,,,"dig=%d,c=%b ",dig,c); //输出格式i定义endmodulemodule wei(c,dig); //命名模块名字input[2:0] c;output[7:0] dig; //定义输入与输出reg[7:0] dig_r;reg[2:0] c_r; // 定义dig_r与c_r2个reg型数据assign dig=dig_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin c_r=c;case (c_r)3'b000:dig_r=8'b11111110; //c_r的数据变化而dig_r对于的数据变化3'b001:dig_r=8'b11111101;3'b010:dig_r=8'b11111011;3'b011:dig_r=8'b11110111;3'b100:dig_r=8'b11101111;3'b101:dig_r=8'b11011111;3'b110:dig_r=8'b10111111;3'b111:dig_r=8'b01111111;default: dig_r=8'b11111111;endcase //结束case语句end //结束always语句endmodule //结束程序译码器代码仿真代码`timescale 1ns/1nsmodule duan_tp; //测试模块的名字reg[3:0] a; //测试输入信号定义为reg型wire[7:0] seg; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒duan u1(a,seg); //调用测试对象initial begin //激励波形设定a=4'b0;#DELY a=4'b0001;#DELY a=4'b0010;#DELY a=4'b0011;#DELY a=4'b0100;#DELY a=4'b0101;#DELY a=4'b0110;#DELY a=4'b0111;#DELY a=4'b1000;#DELY a=4'b1001;#DELY a=4'b1010;#DELY a=4'b1011;#DELY a=4'b1100;#DELY a=4'b1101;#DELY a=4'b1110;#DELY a=4'b1111;#DELY $finish;endinitial $monitor($time,,,"seg=%d,a=%b",seg,a); //输出格式i定义endmodulemodule duan(a,seg); //命名模块名字input[3:0] a;output[7:0] seg; //定义输入与输出reg[7:0] seg_r;reg[3:0] a_r; // 定义seg_r与a_r2个reg型数据assign seg=seg_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin a_r=a;case(a_r) //七段译码4'b0000:seg_r = 8'hc0; //显示04'b0001:seg_r = 8'hf9; //显示14'b0010:seg_r = 8'ha4; //显示24'b0011:seg_r = 8'hb0; //显示34'b0100:seg_r = 8'h99; //显示44'b0101:seg_r = 8'h92; //显示54'b0110:seg_r = 8'h82; //显示64'b0111:seg_r = 8'hf8; //显示74'b1000:seg_r = 8'h80; ///显示84'b1001:seg_r = 8'h90; //显示94'b1010:seg_r = 8'h88; //显示a4'b1011:seg_r = 8'h83; //显示b4'b1100:seg_r = 8'hc6; //显示c4'b1101:seg_r = 8'ha1; //显示d4'b1110:seg_r = 8'h86; //显示e4'b1111:seg_r = 8'h8e; ///显示f endcase //结束case语句end //结束always语句endmodule //结束程序(2)仿真波形图(3)引脚图五、实验感想通过这次实验,让我学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
在掌握常用数字电路功能和原理的基础上,根据EDA技术课程所学知识,利用硬件描述语言Verilog HDL、EDA软件Quartus II和硬件平台Cyclone/Cyclone II FPGA进行电路系统的设计。
本次实验我完成的内容是简单计算器的设计,下面我简单的进行一下原理的阐述。
设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
为了完成要求的效果显示,我先设计了一个简单的四则运算器,为了使其结果能清楚的看到,所以计算器模块和一个7段数码管模块连接。
实验要求,输入分别用两位数码管显示,输出用四位数码管显示,所以用一个3—8译码器和数码管连接,通过开关控制,形成动态显示。
从左向右,依次是第一位数码管显示a的高四位,第二位数码管显示a的低四位;第三位数码管显示b的高四位,第四位数码管显示b的低四位;第五位数码管到第八位数码管显示输出的结果。
通过改变时钟,使其看起来像同时显示在数码管上。
设计流程如下图,分别用两个数码管表示八位二进制数,用一个case 语句表示输入数值采用哪种运算方式,分别用00,01,10,11表示加,减,乘,除。
用3—8译码器选择从哪个数码管输出。
硬件流程图输出结果 A. B 的显示软件流程图LED 灯接线部分显示:中心控制 复位编码 数码管输出输入A 输入B 运算选择C 输出out L E D 8 L E D 7 L E D 6 L E D 5 L E D 4 L E D 3 L E D 2 L E D 1第三章程序简单计算器的程序如下:module jsq9(a,b,c,Dout,count,clk,rst);input[7:0]a,b;input clk,rst;input[1:0]c;output[6:0]Dout;output [2:0]count;reg[6:0]Dout;reg[2:0]count;reg[15:0]out;reg[6:0] LED7S1,LED7S2,LED7S3,LED7S4, LED7S5,LED7S6,LED7S7,LED7S8; DECL7S u1(.A(a[7:4]) , .LED7S(LED7S1));DECL7S u2(.A(a[3:0]) , .LED7S(LED7S2));DECL7S u3(.A(b[7:4]) , .LED7S(LED7S3));DECL7S u4(.A(b[3:0]) , .LED7S(LED7S4));DECL7S u5(.A(out[15:12]) , .LED7S(LED7S5));DECL7S u6(.A(out[11:8]) , .LED7S(LED7S6));DECL7S u7(.A(out[7:4]) , .LED7S(LED7S7));DECL7S u8(.A(out[3:0]) , .LED7S(LED7S8));reg[7:0]out1,out2;always@(a,b,c,Dout,count,clk,rst)case(c)2'b00:out=a+b;2'b01:out=a-b;2'b10:out=a*b;2'b11:beginout1=a/b;out2=a%b;out={out1,out2};enddefault:;endcasealways@(posedge clk or negedge rst)beginif(!rst)count<=3'b000;else if(count==3'b111)count<=3'b000;elsecount<=count+3'b001;endalways@(posedge clk)begincase(count)3'b000: Dout<=LED7S1;3'b001:Dout<=LED7S2;3'b010:Dout<=LED7S3;3'b011:Dout<=LED7S4;3'b100: Dout<=LED7S5;3'b101:Dout<=LED7S6;3'b110:Dout<=LED7S7;3'b111:Dout<=LED7S8;endcaseendendmodulemodule DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111; 4'b0001: LED7S <= 7'b0000110 ; 4'b0010: LED7S <= 7'b1011011; 4'b0011: LED7S <= 7'b1001111; 4'b0100: LED7S <= 7'b1100110 ; 4'b0101: LED7S <= 7'b1101101; 4'b0110: LED7S <= 7'b1111101 ; 4'b0111: LED7S <= 7'b0000111 ; 4'b1000: LED7S <= 7'b1111111 ; 4'b1001: LED7S <= 7'b1101111 ; 4'b1010: LED7S <= 7'b1110111 ; 4'b1011: LED7S <= 7'b1111100 ; 4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ; 4'b1110: LED7S <= 7'b1111001 ; 4'b1111: LED7S <= 7'b1110001 ; endcaseendendmodule第四章模块连接在本程序中,共由三个模块组成,第一个模块是一个四选一多路器其仿真图为:第二个模块是7段数码管显示程序如下module DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111;4'b0001: LED7S <= 7'b0000110 ;4'b0010: LED7S <= 7'b1011011;4'b0011: LED7S <= 7'b1001111;4'b0100: LED7S <= 7'b1100110 ;4'b0101: LED7S <= 7'b1101101;4'b0110: LED7S <= 7'b1111101 ;4'b0111: LED7S <= 7'b0000111 ;4'b1000: LED7S <= 7'b1111111 ;4'b1001: LED7S <= 7'b1101111 ;4'b1010: LED7S <= 7'b1110111 ;4'b1011: LED7S <= 7'b1111100 ;4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ;4'b1110: LED7S <= 7'b1111001 ;4'b1111: LED7S <= 7'b1110001 ;endcaseendendmodule仿真图如下:把这个两个模块用一个3—8译码器进行连接,使其达到实验的要求。
时代农机TIMES AGRICULTURAL MACHINERY第46卷第2期Vol.46No.22019年2月Feb.20192019年第2期摘要:应用仿真软件,设计“2018”动态显示程序并进行计算机仿真。
关键词:程序;动态显示;单片机控制作者简介:谭明良(1998-),男,辽宁大连人,大学本科,主要研究方向:机电一体化技术。
通讯作者:王伟(1957-),男,山东菜州人,硕士,副教授,主要研究方向:机电一体化技术、机床电气与PLC 技术。
单片机控制的四位数码管动态显示编程谭明良,王伟(沈阳工学院,辽宁抚顺113122)1软件介绍与动态说明PROTEUS 软件是英国Lab Center Electronics公司出版的EDA (电子设计自动化)工具软件。
KeilC51是美国Keil Software 公司出品的51系列兼容单片机C 语言软件开发系统。
两软件的联合调试是单片机仿真的基础。
静态显示就是用单片机I/O 口输出固定的数值,每个数码管的驱动电平不会改变,一般用来显示固定的数值。
动态显示,也称扫描显示,是将所有数码管的8段即a~dp 段都连接在一起,分时使各个数码管的位选端有效,也就是在某一个时刻只能有1个数码管在显示。
由于人眼具有“视觉暂留”作用(通常在20ms 左右),因此只要使多个数码管显示的时间间隔较短,人眼一般是感绝不到数码管熄灭的,因此可以形成多个数码管在“静态显示”的假象。
动态显示优点是占用的I/O 接口较少,但需要消耗一定的时间。
2动态显示编程由四位数码管用动态显示“2018”,原理是由单片机的一个I/O 口输出显示段码,另一个I/O 口输出位码。
程序如下:#include<reg52.h>delay ();#define uchar unsigned char P2=0x00;#define uint unsigned intP2=a [2];uchar code a [4]={0x7f ,0x06,0x3f ,0x5b};P1=b [2];uchar code b [4]={0xfe ,0xfd ,0xfb ,0xf7};delay ();uint time ;P2=0x00;void delay ();P2=a [3];void main ()P1=b [3];{P0=0x00;delay ();while (1)P2=0x00;{P2=a [0];}P1=b [0];}delay ();void delay ()P2=0x00;{time=1300;P2=a [1];while (time--);}P1=b [1];3仿真效果4结语动态显示可以同时显示多位数码管,通过不停的刷新I/O 口的数据来实现多位的持续显示。
4位动态数码管工作原理
动态数码管是由四个7段LED数字显示器组成的,每个显示
器数字段由8个LED灯组成,加上小数点共9个LED灯组成。
工作原理如下:
1. 数码管由一个控制电路和驱动电路组成。
控制电路负责控制每个数码管的显示数字以及小数点,驱动电路负责提供合适的电流和电压来驱动LED灯。
2. 控制电路通过一个计数器或者微控制器来控制显示的数字。
计数器或微控制器输出的二进制数码信号被解码成对应的数字和小数点激活信号。
3. 驱动电路通过驱动IC来驱动LED灯。
驱动IC提供合适的
电流和电压,控制LED灯的亮度和显示效果。
4. 控制电路和驱动电路之间通过共阳极或共阴极连接。
共阳极连接意味着LED灯的阳极(正极)是连接在一起的,而共阴
极连接则是将LED灯的阴极(负极)连接在一起。
5. 控制电路循环地将数字和小数点信号从第一个数码管传递到第四个数码管,每一个数码管显示对应的数字,从而形成连续的数字显示效果。
总结:动态数码管通过控制电路和驱动电路的协作工作,在时序上依次激活每个数码管,并且根据对应的数字信号来点亮相应的LED灯,从而实现数字的动态显示。
练习1.两位的循环彩灯,自定义的循环彩灯2.用另外的方式实现按键控制数码管加减3.设计一个在四个数码管上,显示拨码开关给定的值。
1、设计一个流水灯。
原理图设计:(8位流水灯)程序设计:(16位流水灯)module led_s(rst,clk,leds);input rst,clk;output [15:0] leds;reg [15:0] leds;reg [3:0]count;always @(posedge clk)beginif (rst)count <=16 'h00_00;elsebeginif(count==4'hf)count <=16 'h00_00;elsecount <=count+1;endendalways @(count)begincase(count)0: leds<= 16 'b0000_0000_0000_0001;1: leds<= 16 'b0000_0000_0000_0010;2: leds<= 16 'b0000_0000_0000_0100;3: leds<= 16 'b0000_0000_0000_1000;4: leds<= 16 'b0000_0000_0001_0000;5: leds<= 16 'b0000_0000_0010_0000;6: leds<= 16 'b0000_0000_0100_0000;7: leds<= 16 'b0000_0000_1000_0000;8: leds<= 16 'b0000_0001_0000_0000;9: leds<= 16 'b0000_0010_0000_0000;10: leds<=16 'b0000_0100_0000_0000;11: leds<=16 'b0000_1000_0000_0000;12: leds<=16 'b0001_0000_0000_0000;13: leds<=16 'b0010_0000_0000_0000;14: leds<=16 'b0100_0000_0000_0000;15: leds<=16 'b1000_0000_0000_0000;default: leds<=16 'hxxxx;endcaseendendmodule2、设计一个加减计数器,计数器的值在一位数码管上显示出来。
基于EDA的四位数码显示频率计————————————————————————————————作者:————————————————————————————————日期:基于EDA的数字频率计的设计【摘要】在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。
本文阐述了用VHDL语言设计了一个简单的数字频率计的过程.【关键词】EDA;VHDL;数字频率计;波形仿真;1.1 设计要求借助于FPGA/CPLD的开发技术,设计一个4位十进制数字显示的数字式频率计,具体要求如下:(1)4位十进制数字显示的数字式频率计的测量范围为1k~9999KHZ,测量单位为KHZ;(2)要求量程能够自动转换,即几十KHZ显示小数点后两位,而几百KHZ 则显示小数点后一位;(3)当输入信号小于1KHZ时,输出全0,当输入大于9999KHZ时,输出显示全H。
1.2方案论证采用FPGA/CPLD芯片作为控制核心单元,完成各功能模块。
首先将被测信号与控制信号加在FPGA/CPLD芯片上,通过在芯片内部进行各逻辑操作,完成分频、计数及扫描显示等功能操作,最后通过数码管显示结果.其原理框架图如下图1-2所示。
FPGA/C被测图1—2 以FPGA/CPLD 为核心的数字频率计第二章 频率计的原理及测量方法数字频率计是直接用十进制数字显示被测信号频率的一种测量装置。
它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
EDA 课程设计报告书课题名称 四位数字密码锁的设计 姓 名学 号 院 系 专 业 指导教师年 月 日※※※※※※※※※ ※※※※ ※※※※※※※※※※※级学生EDA 课程设计设计任务及要求:(1)设计任务:本课程设计要求设计的数字密码锁密码为4位,由密码锁输入电路、码锁控制电路、密码锁处理电路、显示电路四大部分组成,将各电路组合起来,构成了一个完整的电子密码锁。
(2)设计要求:①、密码输入:每按一个数字键,就输入一个数值,且将在显示器上的最右上方显示出该数字,并将先前已经输入的数据依序左移一位。
②、数码清除:按下此键可以清除前面所有的输入值,清除成为“0000”。
③、密码修改:按下此键时将目前的数字设定成新的密码。
④、激活电锁:按下此键可将密码锁上锁,红色LED灯将闪烁一次。
⑤、解除电锁:按下此键会检查输入的密码是否正确,若绿色LED亮则表示密码正确,密码锁将解锁。
指导教师签名:年月日二、指导教师评语:指导教师签名:年月日三、成绩验收盖章年月日四位数字密码锁的设计1 设计目的随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的喜爱,电子密码锁的使用也体现了人们消费水平、保安意识和科技水平的提高,而且避免了携带甚至丢失钥匙的麻烦。
2 设计的主要内容和要求设计一个简单的数字电子密码锁,密码为 4 位。
要求具备如下功能:(1)如果输入数字键,第一个数字会从数码管的最右端开始显示,此后每按下一个数字键,数码管上的数字必须往左移动一格,以便将新的数字显示出来。
(2)本密码锁为四位密码锁,当输入的数字超过四个时,不会显示第四个以后的数字。
(3)按下密码清零键,清除所有输入的数字,清除成为“0000”,即做归零动作。
(4)按下解锁键,检查输入的密码是否正确,若解锁指示灯(绿色LED灯)闪烁一次,即表示密码正确(开锁)。
第一章作业要求1、四位数字频率计(结果用四位数码管显示)注:1以上题目仅供参考,可自行选题,若选择以上题目,每班只能同时两人选择相同题目,但内容不能相同。
2 报告中应包含以下内容:(1)总体设计说明(2)各模块的设计实现(3)各模块的仿真结果(4)整个设计的仿真或实际结果。
3 设计若包含FPGA以外的电路,应在报告中体现。
4 严禁班与班之间抄袭,所有雷同者均不及格。
5 大作业封面每班要统一格式。
(姓名学号班级不能缺少)。
6 仿真用quartus,不接受maxplus。
1.1根据要求制定设计方案:(1)4位十进制数字显示的数字式频率计的测量范围为1k~9999KHZ,测量单位为KHZ;(2)要求量程能够自动转换,即几十KHZ显示小数点后两位,而几百KHZ则显示小数点后一位;(3)当输入信号小于1KHZ时,输出全0,当输入大于9999KHZ 时,输出显示全H。
1.2方案总体思路采用FPGA/CPLD芯片作为控制核心单元,完成各功能模块。
首先将被测信号与控制信号加在FPGA/CPLD芯片上,通过在芯片内部进行各逻辑操作,完成分频、计数及扫描显示等功能操作,最后通过数码管显示结果。
其原理框架图如下图。
第二章频率计原理及测量方法数字频率计是直接用十进制数字显示被测信号频率的一种测量装置。
它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
若在一定时间间隔T内测得的这个周期性信号的重复变化次数N,则其频率可表示为f=N/T;只要知道了N和T就可以求得频率。
若设置闸门信号的时间为1S,则被测频率就是NHz。
M法是在给定的闸门时间内测量被测信号的脉冲个数,进行换算得出被测信号的频率。
当频率计正常工作时,频率为0.5Hz的闸门信号作为计数器的时钟信号,而被测信号则作为计数器的时钟输入。
当闸门信号为高电平是允许计数;而为低电平时,计数器停止计数,则所计的数值即为被测信号的频率。
课程设计任务书专业电子信息工程班级姓名设计起止日期2012-12-31~2013-1-6 设计题目:动态输出4位十进制频率计的设计设计任务:1. 学习掌握频率计的设计方法。
2. 掌握动态扫描输出电路的实现方法。
3. 学习较复杂的数字系统设计方法指导教师评语:成绩:签字:年月日动态输出4位十进制频率计的设计一、课程设计的目的与要求1)课程设计的目的:《EDA技术及应用》是电子信息科学与技术专业学生在电子技术实验技能方面综合性质的实验训练课程,其目的和任务是通过一周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件(VHDL),并能利用EDA软件设计一个电子技术综合问题,为以后进行工程实际问题的研究打下设计基础。
2)课程设计的要求:通过课程设计,能熟练掌握一种EDA软件(VHDL)的使用方法,能利用EDA软件(V HDL)进行至少一个电子技术综合问题的设计。
初步具有分析、寻找和排除电子电路中常见故障的能力。
二、设计步骤1.设计所需模块4位十进制频率计外部接口如图1所示,顶层文件如图2所示,包含4中模块;Tctl、reg16、scan_led和4个cnt10。
图1 四位十进制频率计的外部接口其中各个端口说明如下:F1Hz:给Tctl模块提供1Hz的频率输入。
Fin:被测频率输入。
scan_led:给scan_led模块提供扫描输入频率输入。
bt[1..0]:片选信号输出。
sg[6..0]:译码信号输出。
cout:进位输出。
2.模块说明1)cnt10模块说明cnt10为含异步清零和同步时钟使能的十进制计数器,采用级联的方法进行计数,计数范围与所用cnt10级联个数有关,本次设计采用的是四个cnt10的级联,所以测频范围为0~9999Hz。
计数模块cnt10的源代码如下所示:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt10 ISPORT(rst,en,clk:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);cout:OUT STD_LOGIC);END cnt10;ARCHITECTURE BEHAV OF cnt10 ISSIGNAL cnt:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(rst,en,clk)BEGINIF rst='1'THEN cnt<="0000";ELSIF(clk'EVENT AND clk='1')AND en='1'THENIF cnt="1001"THENcnt<="0000";cout<='1';ELSEcnt<=cnt+1;cout<='0';END IF;END IF;END PROCESS;Q<=cnt;END BEHAV;2)Tctl模块说明根据频率的定义和测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期做准备的计数器清0信号。
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
--深圳市21EDA电子--开发板型号:A-C8V4--学习4个数码管动态显示原理;--利用计数器自加,并且在数码管上显示--在4个数码管上面分别显示0000到9999的自加--递增方式在4位数码管上向上计数显示从0000-0001->0002……..9999….0000….0001…. --设计了一个4位十进制计数器,并用数码管显示当前计数值--视频教程适合我们21EDA电子的所有学习板library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LED_0000_9999 ISPORT (clk : IN std_logic; --系统时钟50Mrst : IN std_logic; --系统REST键,KEY1led_out : OUT std_logic_vector(7 DOWNTO 0); --各段数据输出led_bit : OUT std_logic_vector(3 DOWNTO 0)); --数码管的位选择口。
一共8位END LED_0000_9999 ;ARCHITECTURE arch OF LED_0000_9999 ISsignal div_cnt : std_logic_vector(24 downto 0 );signal data4 : std_logic_vector(3 downto 0);signal dataout_xhdl1 : std_logic_vector(7 downto 0);signal en_xhdl : std_logic_vector(3 downto 0);signal cntfirst :std_logic_vector(3 downto 0);signal cntsecond : std_logic_vector(3 downto 0);signal cntthird : std_logic_vector(3 downto 0);signal cntlast : std_logic_vector(3 downto 0);signal first_over: std_logic;signal second_over: std_logic;signal third_over : std_Logic;signal last_over : std_logic;beginled_out<=dataout_xhdl1;led_bit<=en_xhdl;process(clk,rst)beginif(rst='0')thendiv_cnt<="0000000000000000000000000";elsif(clk'event and clk='1')thendiv_cnt<=div_cnt+1;end if;end process;process(div_cnt(24),rst,last_over) ---first 10 counter beginif(rst='0')thencntfirst<="0000";first_over<='0';elsif(div_cnt(24)'event and div_cnt(24)='1')thenif(cntfirst="1001" or last_over='1')thencntfirst<="0000";first_over<='1';elsefirst_over<='0';cntfirst<=cntfirst+1;end if;end if;end process;process(first_over,rst) --second 10 counterbeginif(rst='0')thencntsecond<="0000";second_over<='0';elsif(first_over'event and first_over='1')thenif(cntsecond="1001")thencntsecond<="0000";second_over<='1';elsesecond_over<='0';cntsecond<=cntsecond+1;end if;end if;end process;process(second_over,rst) --second 10 counterbeginif(rst='0')thencntthird<="0000";third_over<='0';elsif(second_over'event and second_over='1')thenif( cntthird="1001")thencntthird<="0000";third_over<='1';elsethird_over<='0';cntthird<= cntthird+1;end if;end if;end process;process(third_over,rst) --second 10 counter beginif(rst='0')thencntlast<="0000";last_over<='0';elsif(third_over'event and third_over='1')thenif( cntlast="1001")thencntlast<="0000";last_over<='1';elselast_over<='0';cntlast<= cntlast+1;end if;end if;end process;---****************显示部分***************--process(rst,clk,div_cnt(19 downto 18))beginif(rst='0')thenen_xhdl<="1110";elsif(clk'event and clk='1')thencase div_cnt(19 downto 18) iswhen"00"=> en_xhdl<="1110";when"01"=> en_xhdl<="1101";when"10"=> en_xhdl<="1011";when"11"=> en_xhdl<="0111";end case;end if;end process;process(en_xhdl,cntfirst,cntsecond,cntthird,cntlast) begincase en_xhdl iswhen "1110"=> data4<=cntfirst;when "1101"=> data4<=cntsecond;when "1011"=> data4<=cntthird;when "0111"=> data4<=cntlast;when others => data4<="1010";end case;end process;process(data4)begincase data4 isWHEN "0000" =>dataout_xhdl1 <= "11000000"; WHEN "0001" =>dataout_xhdl1 <= "11111001"; WHEN "0010" =>dataout_xhdl1 <= "10100100"; WHEN "0011" =>dataout_xhdl1 <= "10110000"; WHEN "0100" =>dataout_xhdl1 <= "10011001"; WHEN "0101" =>dataout_xhdl1 <= "10010010"; WHEN "0110" =>dataout_xhdl1 <= "10000010"; WHEN "0111" =>dataout_xhdl1 <= "11111000"; WHEN "1000" =>dataout_xhdl1 <= "10000000"; WHEN "1001" =>dataout_xhdl1 <= "10010000"; WHEN "1010" =>dataout_xhdl1 <= "10000000"; WHEN "1011" =>dataout_xhdl1 <= "10010000"; WHEN "1100" =>dataout_xhdl1 <= "01100011"; WHEN "1101" =>dataout_xhdl1 <= "10000101"; WHEN "1110" =>dataout_xhdl1 <= "01100001"; WHEN "1111" =>dataout_xhdl1 <= "01110001"; WHEN OTHERS =>dataout_xhdl1 <= "00000011";END CASE;END PROCESS;end arch;。