Verilog程序3、数码管显示

合集下载

数码管动态显示实训报告

数码管动态显示实训报告

一、实训目的本次实训旨在通过实际操作,让学生掌握数码管动态显示的原理,了解数码管动态扫描显示电路的设计方法,提高学生使用Verilog HDL进行层次化设计电路的能力。

通过实训,学生能够理解并应用动态扫描显示数码管、数据选择器及其信号分配方法,同时熟悉使用可编程芯片(如FPGA/CPLD)控制多位动态扫描数码管的显示。

二、实训环境1. 实训设备:FPGA开发板、数码管、信号源、示波器等。

2. 软件工具:Quartus II、ModelSim等。

3. 实训教材:相关电子设计教材、Verilog HDL编程指南。

三、实训原理数码管动态显示技术是利用人眼的视觉暂留效应,通过快速切换显示不同的数码管,使观察者感觉多个数码管同时显示。

具体原理如下:1. 数码管结构:数码管由若干个LED段组成,通过点亮不同的段来显示数字或字符。

2. 共阳/共阴数码管:数码管分为共阳和共阴两种类型。

共阳数码管的阳极连接在一起,共阴数码管的阴极连接在一起。

3. 动态扫描:通过控制每个数码管的点亮和熄灭,实现多位数码管的动态显示。

4. 数据选择器:用于选择要显示的数字或字符对应的段编码。

四、实训过程1. 设计3位数码管动态扫描显示电路:- 使用Verilog HDL设计数码管显示模块,包括段编码生成、位选控制、时钟分频等。

- 设计数据选择器,用于选择要显示的数字或字符对应的段编码。

- 设计主控制器,用于控制动态扫描的时序。

2. 实现显示功能:- 将学号的后3位数字输入到数码管显示电路中。

- 使用可编程芯片(如FPGA/CPLD)实现电路的编译和下载。

3. 提高性实验:- 增加一个功能切换控制开关,实现数码管显示数字的自动循环移位。

- 设计其他显示功能,如显示不同的字符或图案。

4. 实验测试:- 使用示波器观察数码管显示电路的时序信号,确保电路正常工作。

- 使用Quartus II进行仿真测试,验证电路的功能。

五、实验结果与分析1. 3位数码管动态扫描显示电路:- 成功实现了学号后3位数字的动态显示。

基于verilog键盘数码管设计ppt课件

基于verilog键盘数码管设计ppt课件
第三届“梦想启航”科技培训活动
基于verilog语言键盘与数码管制作
2010年11月13日
主要内容:
1.基于verilog语言数码管扫描 程序
2.基于verilog语言矩阵键盘扫描 程序
共阴:1点亮 共阳:0点亮
外形结构
共阴极
共阳极
共阴:1点亮 共阳:0点亮
f
a gb
e d
c
dp
4
动态显示:是指无论在任何时刻只有一个数码管处于显 示状态,每个数码管轮流显示。
STATE_C
col[3:0]=4'b1101
STATE_D
col[3:0]=4'b1011
STATE_E
col[3:0]=4'b0111
STATE_F
实现功能 跳转条件
判读当前是 否有键按下 row[3:0] !=4'b1111
判断按键是 row[3:0] ==4'b1111 否在第一行
row[3:0] !=4'b1111
.
矩阵扫描式键盘硬件电路结构
Vcc
01 23 P1.0 4 5 6 7 P1.1 8 9 A B P1.2 C D E F P1.3
P1.4P1.5P1.6 P1.7
.
读读
读读读
读读读读读 N Y
读 读 10ms
读读读
读读读读读 N Y
读读读读
读读
矩阵式键盘识别按键的步骤: 1.读端口,将端口状态与设 定状态对比,判断状态是否 有变化 2.如有变化,软件延时 消按 键的抖动! 无则返回 3.再次执行第一步的操作 4.如有键按下 则读取数据进 行数据分析!若无则返回! 5.返回分析行列扫描线的信 息的结果!

(VHDL实验报告)数码管显示(一位数码管显示0-9,八位数码管显示学号后八位)

(VHDL实验报告)数码管显示(一位数码管显示0-9,八位数码管显示学号后八位)
信号源模块的时钟选择为 1KHZ,第一个实验则有一位数码管重重复显示 0-9 的数,第二个实验则八位数码管显示了学号后8 位。其部分结果如下所示:
(1)一位数码管显示0-9:
(2)八位数码管显示学号后八位: 七、心得体会
七段码管位选输入信号 七段码管位选输入信号 七段码管位选输入信号
五、 实验步骤
1、打开 QUARTUSII 软件,新建一个工程。 2、建完工程之后,再新建一个VHDL File,打开VHDL 编辑器对话框。 3、按照实验原理和自己的想法,在VHDL 编辑窗口编写VHDL 程序。其 程序如下所示:
(1)一位数码管显示0-9:
电子科技大学成都学院学院
标准实验报告
(实验)课程名称 数字电路 EDA 设计与应用
姓名 乱弹的枇杷 学号 专业 指导教师
一、 实验名称 数码管显示(一位数码管显示 0-9,八位数码管显示学号
后八位)
二、 实验目的 1、了解数码管的工作原理。 2、学习七段数码管显示译码器的设计。 3、掌握 VHDL 的 CASE 语句及多层次设计方法。
信号名称对应fpga管脚名说明7segaf13七段码管段输入信号7segbf14七段码管段输入信号7segcf15七段码管段输入信号7segde15七段码管段输入信号7segef16七段码管段输入信号7segff17七段码管段输入信号7segge18七段码管段输入信号7segdpf18七段码管dp段输入信号7segsel0g18七段码管位选输入信号7segsel1g17七段码管位选输入信号7segsel2g16七段码管位选输入信号实验步骤1打开quartusii软件新建一个工程
信号名称 7SEG-A 7SEG-B 7SEG-C 7SEG-D 7SEG-E 7SEG-F 7SEG-G 7SEG-DP 7SEG-SEL0 7SEG-SEL1 7SEG-SEL2

数码管显示电路的原理

数码管显示电路的原理

数码管显示电路的原理
数码管显示电路通过控制电压信号的高低来驱动数码管的不同段进行显示。

数码管是由多个发光二极管组成的,每个发光二极管对应显示一个数字或符号。

数码管显示电路主要由以下几个部分组成:
1. 数字信号发生器:用来产生需要显示的数字或符号的电信号。

该信号可以通过逻辑门、计数器、微控制器等方式产生。

2. 译码器:将数字信号转换为控制数码管显示的信号。

译码器一般采用BCD码(二进制编码十进制)或者7段码来表示数字。

3. 驱动电路:将译码器输出的信号转换为适合驱动数码管的电压和电流。

驱动电路一般使用三极管、开关电路等来完成。

4. 数码管:由多个发光二极管(LED)组成,每个发光二极管对应一个数字或符号的显示段。

数码管的引脚连接到驱动电路上。

5. 电源电路:为整个数码管显示电路提供工作电压。

一般使用稳压电源或者适配器来提供稳定的直流电压。

工作原理如下:
当数字信号发生器产生需要显示的数字或符号的电信号时,该
信号经过译码器转换为对应的亮灭控制信号,然后通过驱动电路产生适合数码管的控制电压和电流。

驱动电路按照控制信号的要求,通过对应的引脚将控制信号传递给数码管。

这样,数码管的不同段就会根据控制信号的高低来亮灭,从而显示出对应的数字或符号。

整个数码管显示电路在工作时,可以通过改变数字信号的输入来实现不同数字或符号的动态显示。

经过适当的控制和调节,数码管显示电路可以显示出各种数字、字母、符号等。

利用verilog语言实现一位数码管动态显示0到F

利用verilog语言实现一位数码管动态显示0到F

利用verilog语言实现一位数码管动态显示0到F//深圳市21EDA电子.//开发板型号:A-C8V4///doc/cc14931631.html,//一位数码管试验//利用分频计数器得到数码管显示效果,显示0到F。

//视频教程适合我们21EDA电子的所有学习板module SMG_LED(clk_50M,led_bit,dataout);input clk_50M;//系统时钟50M输入从23脚输入。

output[7:0]dataout;//定义数码管的7段码输出,output led_bit;//一位数码管的位选择使能输出。

reg[7:0]dataout;reg led_bit;reg[27:0]count;//分频计数器always led_bit<='b0;//是数码管的位选择处于导通状态//分频计数器always@(posedge clk_50M)begincount<=count+1;//计数器自加endalways@(posedge clk_50M)begincase(count[27:24])//case(count[27:24])这一句希望初学者看明白,//修改count[27:24]他们的值,就可以看到数码管变法的速度。

//也是分频的关键//在数码管上面显示0到F0:dataout<=8'b11000000;//共阳数码管显示0的段码1:dataout<=8'b11111001;2:dataout<=8'b10100100;//共阳数码管显示2的段码3:dataout<=8'b10110000;4:dataout<=8'b10011001;5:dataout<=8'b10010010;6:dataout<=8'b10000010;7:dataout<=8'b11111000;8:dataout<=8'b10000000;9:dataout<=8'b10010000;10:dataout<=8'b10001000;11:dataout<=8'b10000011;12:dataout<=8'b11000110;13:dataout<=8'b10100001;14:dataout<=8'b10000110;15:dataout<=8'b10001110;//共阳数码管显示F的段码endcase endendmodule。

verilog共阴极数码管扫描显示现象描述

verilog共阴极数码管扫描显示现象描述

共阴极数码管是一种常见的显示器件,用于显示数字、字母和符号等信息。

在共阴极数码管中,所有的阴极(即数码管的段)都连接在一起,而阳极则分别连接到控制芯片的输出引脚上。

共阴极数码管的扫描显示原理如下:
1.首先,通过控制芯片的输出引脚,将对应数字或字符的阳极(即数码管的位)置为
低电平,其他位置为高电平。

2.当某一位的阳极被置为低电平时,该位对应的阴极段需要显示的内容也会被激活。

例如,如果要显示数字"0",则会激活数码管的a、b、c、d、e、f段。

3.接下来,控制芯片会快速切换到下一位,依次将每一位的阳极置为低电平,并相应
地激活阴极段。

4.循环上述步骤,不断切换每一位的阳极,以实现连续的扫描显示效果。

由于共阴极数码管的阴极段都是连接在一起的,显示时只能同时激活一位的阳极,因此需要快速地切换扫描每一位,以使人眼产生连续的视觉效果。

通过高速的扫描和刷新频率,可以让人眼感觉到所有的位都在同时显示,从而呈现出完整的数字、字母或符号。

需要注意的是,共阴极数码管的显示亮度较低,因为每个段都是短暂地被激活并切换显示,所以显示亮度要比共阳极数码管略低。

另外,使用共阴极数码管时,控制芯片需要按照特定的顺序和时间间隔进行扫描,确保每一位都能得到正确的激活和显示。

基于verilog语言编程的数字秒表设计

基于verilog语言编程的数字秒表设计

数字秒表设计系别:电子通信工程系专业:电子信息工程班级:学号:姓名:数字秒表(基于verilong语言编程)课程设计一、设计要求用verilong语言编写程序,结合实际电路,设计一个4位LED数码显示“秒表”,显示时间为99.9~00.0秒,每秒自动减一,精度为0.1。

另设计一个“开始”按键和一个“复位”按键。

再增加一个“暂停”按键。

按键说明:按“开始”按键,开始计数,数码管显示从99.9开始每秒自动减一;按“复位”按键,系统复位,数码管显示99.9;按“暂停”按键,系统暂停计数,数码管显示当时的计数。

二、设计目的1、通过本次课程设计加深对verilong语言课程的全面认识、复习和掌握,对EPM7064芯片的应用达到进一步的了解。

2、掌握定时器、外部中断的设置和编程原理。

3、通过此次课程设计能够将软硬件结合起来,对程序进行编辑,调试。

使其能够通过电脑下载到芯片,正常工作。

4、实际操作Quartus II软件,复习巩固以前所学知识。

三、总体设计本秒表系统具有复位、暂停、秒表计时等功能。

clk为系统工作时钟,采用Altera DE2上的50M时钟信号,经过分频器产生秒表计时周期为0.01s的时钟,再经过计数器,分别对秒表的百分位、十分位、秒、秒十位、分、分十位进行计数。

onoff为启动/暂停控制信号,当它为0时,启动计时,当它为1时,计时暂停。

clr为复位信号,当该信号有效时,计数器和译码清零,此时数码管显示输出为00:00:00。

在总体电路图中,根据设计要求,需要两个输入控制信号onoff和clr。

由于开发板上除了拨动开关就是瞬时的按键开关,且按键开关平时都呈高电平,按一下为低电平。

故在实际测试时采用了拨动开关SW0来控制秒表的启动/暂停,通过KEY0来控制秒表的清零。

四、设计思路描述该实验要求进行计时并在数码管上显示时间,通过相关软件Quartus II编译,利用JTAG 下载电路到核心芯片,驱动硬件工作。

verilog实验报告流水灯数码管秒表交通灯

verilog实验报告流水灯数码管秒表交通灯

流水灯实验目的:在basys2开发板上实现LED灯的花样流水的显示,如隔位显示,依次向左移位显示,依次向右移位显示,两边同时靠中间显示。

实验仪器:FPGA开发板一块,计算机一台。

实验原理:当一个正向的电流通过LED时,LED就会发光。

当阳极的电压高于阴极的电压时,LED就会有电流通过。

当在LED上增添一个典型值为1.5V—2.0V之间的电压时,LED就会有电流通过并发光。

实验内容:顶层模块:输入信号:clk_50MHz(主时钟信号),rst(重置信号),输出信号:[7:0] led(LED灯控制信号)。

module led_top(clkin,rst,led_out);input clkin, rst;output [7:0] led_out;wire clk_1hz;divider_1hz d0(clkin, rst, clk_1hz);led l0(clk_1hz, rst, led_out);endmodule分频模块:module divider_1hz(clkin,rst,clkout);input clkin,rst;output reg clkout;reg [24:0] cnt;always@(posedge clkin, posedge rst)beginif(rst) begincnt<=0;clkout<=0; endelse if(cnt==24999999) begincnt<=0;clkout=!clkout; endelse cnt<=cnt+1;endendmodule亮灯信号模块:module led(clkin,rst,led_out);input clkin,rst;output [7:0] led_out;reg [2:0] state;always@(posedge clkin, posedge rst)if(rst) state<=0;else state<=state+1;always@(state)case(state)3'b000:ledout<=8'b0000_0001;3'b001:ledout<=8'b0000_0010;3'b010:ledout<=8'b0000_0100;3'b011:ledout<=8'b0000_1000;3'b100:ledout<=8'b0001_0000;3'b101:ledout<=8'b0010_0000;3'b110:ledout<=8'b0100_0000;3'b111:ledout<=8'b1000_0000;endcaseendmodule实验中存在的问题:1 芯片选择问题automotive spartan3EXA3S100E XA3S250E CPG132spartan3EXC3S100E XC3S250E CP1322 时序逻辑部分,阻塞赋值和非阻塞赋值混用always@(posedge clk)begina=b+c;d<=e+f;end3 UCF文件格式错误NET “CLK” LOC = “B8”;NET “a” LOC = “N11”;NET “b” LOC = “G13”;NET “c[0]”LOC =“K11;数码管实验目的:设计一个数码管动态扫描程序,实现在四位数码管上动态循环显示“1”、“2”“3”“4”;实验仪器:FPGA开发板一块,计算机一台。

verilog-课程设计-数码管亮暗控制-演示文稿4

verilog-课程设计-数码管亮暗控制-演示文稿4

静态显示电路
图10-6 四位静态显示电路
动态显示电路
图10-7 四位动态显示的电路
在第一位上显示5
位驱动P2.7输出0 段驱动P0口输出“5”的段 码“10010010B”
+5V
0
1
1
1
1
1
P2.7 P2.6 P2.5 P2.4 P2.3 P2.2
com1 com2 com3 com4 com5 com6
并通过下载验证了程序的正确性,这种电路在 频率合成及各类数字逻辑电路中有广泛的应用。
收获与心得
首先通过本次课程设计,使我进一步熟悉 Quartus软件的使用流程,在编译时,也有遇 到比较多的错误,需要仔细的检查才能找到错 误的地方,因为有时候仅仅是一个符号的错误 也会使仿真不能继续进行,在不断的改进后, 将程序的功能一点点的完善,达到预想的结果, 编译无措后,即可以通过相应的波形仿真和下 载来验证程序实现的功能。
4'h9: HEX0[6:0] = seg9; 4'ha: HEX0[6:0] = sega; 4'hb: HEX0[6:0] = segb; 4'hc: HEX0[6:0] = segc; 4'hd: HEX0[6:0] = segd; 4'he: HEX0[6:0] = sege; 4'hf: HEX0[6:0] = segf; default:HEX0[6:0] = seg0; endcase end else HEX0[6:0]=segg;
占空比为30%时的亮度
占空比为60%时的亮度
占空比为90%时的亮度
调节拨码开关可以调节数码管显 示不同的数字
设计总结
刚开始拿到数码管亮度控制器设计这个题目时,我认 为是通过向数码管送不同的电压就会产生不同亮度, 但是后来仔细想想发现我们verilog是数字电路设计, 只有两种电平:即高电平和低电平,而要实现我的想 法显然是不现实的,所以不得不更换思路,在上网查 询一番后,网上提供了一种思路:通过送不同的频率 给数码管就会产生不同的亮暗程度,但经过实际编写 程序发现,这样产生的亮暗是动态显示的,而题目要 求是静态显示的,而且是由于频率很大,即周期很小, 所以视觉上基本看不出来亮暗程度的变化,所以这个 方案也是无疾而终。

Verilog?HDL数码管显示

Verilog?HDL数码管显示

Verilog HDL数码管显示这个没什么说的,2个数码管显示数字一样0~F;特权的程序如下:module led_seg7(clk,rst_n,sm_cs1_n,sm_cs2_n,sm_db);input clk; // 50MHzinput rst_n; // 复位信号,低有效output sm_cs1_n,sm_cs2_n; //数码管片选信号,低有效output[6:0] sm_db; //7段数码管(不包括小数点)reg[24:0] cnt; //计数器,最大可以计数到2的25次方*20ns=640msalways @ (posedge clk or negedge rst_n)if(!rst_n) cnt <= 25'd0;else cnt <= cnt+1'b1; //循环计数reg[3:0] num; //显示数值0000~1111(即:0~F)always @ (posedge clk or negedge rst_n)if(!rst_n) num <= 4'd0; //TZ无论几进制的0都是全0;呵呵else if(cnt == 24'hffffff) num <= num+1'b1; //每640ms增一//---------------设定数码管显示参数-------------------------------parameter seg0 = 7'h3f,seg1 = 7'h06,seg2 = 7'h5b,seg3 = 7'h4f,seg4 = 7'h66,seg5 = 7'h6d,seg6 = 7'h7d,seg7 = 7'h07,seg8 = 7'h7f,seg9 = 7'h6f,sega = 7'h77,segb = 7'h7c,segc = 7'h39,segd = 7'h5e,sege = 7'h79,segf = 7'h71;//-------------------------------------------------------------------------------reg[6:0] sm_dbr; //7段数码管(不包括小数点)always @ (num)case (num) //NUM值显示在两个数码管上4'h0: sm_dbr <= seg0;4'h1: sm_dbr <= seg1;4'h2: sm_dbr <= seg2;4'h3: sm_dbr <= seg3;4'h4: sm_dbr <= seg4;4'h5: sm_dbr <= seg5;4'h6: sm_dbr <= seg6;4'h7: sm_dbr <= seg7;4'h8: sm_dbr <= seg8;4'h9: sm_dbr <= seg9;4'ha: sm_dbr <= sega;4'hb: sm_dbr <= segb;4'hc: sm_dbr <= segc;4'hd: sm_dbr <= segd;4'he: sm_dbr <= sege;4'hf: sm_dbr <= segf;default: ;endcaseassign sm_db = sm_dbr;assign sm_cs1_n = 1'b0; //数码管1常开assign sm_cs2_n = 1'b0; //数码管2常开endmodule。

FPGA的数码管显示(Verilog)

FPGA的数码管显示(Verilog)

FPGA的数码管显示(Verilog)按键与数码管显示module key_led(clk_50M,key,duan_ma,wei_ma);input clk_50M; input [3:0] key;//key为输入的键码的值output [3:0] wei_ma;output [7:0] duan_ma;wire [3:0] key;reg [7:0] duan_ma;reg [3:0] wei_ma;reg [3:0] key_temp;//设置了一个寄存器always @ (posedge clk_50M )beginkey_temp<=key;//把键码的值赋给寄存器case ( key_temp )4'b0111:duan_ma<=8'b1100_0000;//段码,按键后,数码管显示0 4'b1011:duan_ma<=8'b1001_0000;//段码,数码管显示94'b1101:duan_ma<=8'b1000_0010;//段码,数码管显示64'b1110:duan_ma<=8'b1011_0000;//段码,数码管显示3 endcaseendalways @ ( posedge clk_50M )case( key_temp )4'b0111:wei_ma<=4'b0111;//位选信号4'b1011:wei_ma<=4'b1011;4'b1101:wei_ma<=4'b1101;4'b1110:wei_ma<=4'b1110;endcaseendendmodule数码管静态显示0-7module led_0_7 (clk,rst,dataout,en);input clk,rst;output[7:0] dataout;//数码管的段码输出output[7:0] en;//数码管的位选使能输出reg[7:0] dataout;//各段数据输出reg[7:0] en;reg[15:0] cnt_scan;//扫描频率计数器reg[4:0] dataout_buf;always@(posedge clk or negedge rst)beginif(!rst) begincnt_scan<=0;else begincnt_scan<=cnt_scan+1; endendalways @(cnt_scan) begincase(cnt_scan[15:13]) 3'b000 :en = 8'b1111_1110;3'b001 :en = 8'b1111_1101;3'b010 :en = 8'b1111_1011;3'b011 :en = 8'b1111_0111;3'b100 :en = 8'b1110_1111;3'b101 :en = 8'b1101_1111;3'b110 :en = 8'b1011_1111;3'b111 :en = 8'b0111_1111;default :en = 8'b1111_1110;endcaseendalways@(en) //对应COM信号给出各段数据begincase(en)8'b1111_1110:dataout_buf=0;8'b1111_1101:dataout_buf=1;8'b1111_1011:dataout_buf=2;8'b1111_0111:dataout_buf=3;8'b1110_1111:dataout_buf=4;8'b1101_1111:dataout_buf=5;8'b1011_1111: dataout_buf=6;8'b0111_1111: dataout_buf=7; default:dataout_buf=8; endcaseendalways@(dataout_buf) begincase(dataout_buf)4'b0000:dataout=8'b1100_0000; 4'b0001:dataout=8'b1111_1001; 4'b0010:dataout=8'b1010_0100; 4'b0011:dataout=8'b1011_0000; 4'b0100:dataout=8'b1001_1001; 4'b0101:dataout=8'b1001_0010; 4'b0110:dataout=8'b1000_0010; 4'b0111:dataout=8'b1111_1000; 4'b1000:dataout=8'b1000_0000; 4'b1001:dataout=8'b1001_1000; 4'b1010:dataout=8'b1000_1000; 4'b1011:dataout=8'b1000_0011; 4'b1100:dataout=8'b1100_0110; 4'b1101:dataout=8'b1010_0001; 4'b1110:dataout=8'b1000_0110;4'b1111:dataout=8'b1000_1110; endcaseendendmodule。

数码管显示的Verilog代码

数码管显示的Verilog代码
2'b00: AN<=4'b0111;
2'b01: AN<=4'b1011;
2'b10: AN<=4'b1101;
2'b11: AN<=4'b1110;
default:AN<=4'b1111;
endcase
end
always @(*)
begin
case (Data[3:0])
0:seg[7:0]<=8'b00000011;
begin
case(BIT_SEL)
0: Data_4[3:0] <= Data[15:12];
1: Data_4[3:0] <= Data[11:8];
2: Data_4[3:0] <= Data[7:4];
3: Data_4[3:0] <= Data[3:0];
default:Data_4[3:0] <= Data[3:0];
output [7:0] SEG
);
reg[3:0] Data_4;
reg[1:0] BIT_SEL;
reg[15:0] cnt;
SMG_1 SMG_i(SEG,AN,BIT_SEL,Data_4);
always @(posedge CLK or posedge CLR)
if(CLR)
begin
cnt<=16'b0;
控制每个数码管显示对应位的数字begincase
数码管显示的Verilog代码
//用4个数码管显示一个16位二进制数据Data,每个数码管显示各自的数据0.2ms
module SMG_4(

FPGA数码管动态显示Verilog

FPGA数码管动态显示Verilog

FPGA数码管动态显示(BCD)//smg_top.Vmodule smg_top(clk,rst_n,sm_cs,sm_db,num, //用于仿真dis_data_in //用于仿真);input clk; // 50MHzinput rst_n; // 复位信号,低有效input [9:0] dis_data_in; //用于仿真//reg [9:0] dis_data_in; //显示数据wire [11:0] dis_data_out; //显示数据output [2:0]sm_cs; //数码管片选信号,低有效output [3:0] num; //用于仿真output[6:0] sm_db; //7段数码管(不包括小数点)smg_display smg_display(.clk(clk),.rst_n(rst_n),.dis_data(dis_data_out),.sm_cs(sm_cs),.num(num),.sm_db(sm_db));bin_BCD bin_BCD (.clk(clk),.rst_n(rst_n),.bin( dis_data_in),.BCD_out(dis_data_out));endmodule//bin_BCD.V`timescale 1ns / 1psmodule bin_BCD(clk,bin,rst_n,BCD_out);input [9:0] bin;input clk,rst_n;output [11:0]BCD_out; //十进制BCD码reg [3:0] count;reg [11:0]BCD_out;reg [21:0]shift_reg=22'd0;////////////////////// 计数部分////////////////////////always @ ( posedge clk or negedge rst_n )beginif( !rst_n )count<=4'd0;else if (count==11)count<=4'd0;elsecount<=count+1'b1;end////////////////////// 二进制转换为十进制BCD码/////////////////always @ (posedge clk or negedge rst_n )beginif (!rst_n)shift_reg=22'd0;else if (count==0)shift_reg={12'd0,bin};else if ( count<=10) //实现8次移位操作beginif(shift_reg[13:10]>=5) //判断个位是否>5,如果是则+3beginif(shift_reg[17:14]>=5) //判断十位是否>5,如果是则+3beginshift_reg[17:14]=shift_reg[17:14]+2'b11;shift_reg[13:10]=shift_reg[13:10]+2'b11;shift_reg=shift_reg<<1'd1; //对个位和十位操作结束后,整体左移endelsebeginshift_reg[17:14]=shift_reg[17:14];shift_reg[13:10]=shift_reg[13:10]+2'b11;shift_reg=shift_reg<<1'd1;endendelsebeginif(shift_reg[17:14]>=5)beginshift_reg[17:14]=shift_reg[17:14]+2'b11;shift_reg[13:10]=shift_reg[13:10];shift_reg=shift_reg<<1'd1;endelsebeginshift_reg[17:14]=shift_reg[17:14];shift_reg[13:10]=shift_reg[13:10];shift_reg=shift_reg<<1'd1;endendendend/////////////////输出赋值//////////////////////////always @ ( posedge clk or negedge rst_n )beginif ( !rst_n )BCD_out=12'd0;else if (count==11) //此时8次移位全部完成,将对应的值分别赋给个,十,百位BCD_out<={shift_reg[21:18],shift_reg[17:14],shift_reg[13:10]};endendmodule//smg_display.V`timescale 1ns / 1p smodule smg_display(clk,rst_n,dis_data, //需要显示的数字sm_cs,sm_db,num //用于仿真,选择需要显示的数字);input clk; // 50MHzinput rst_n; // 复位信号,低有效input[11:0] dis_data; //显示数据output [3:0] num; //用于仿真output [2:0]sm_cs; //数码管片选信号,低有效output[6:0] sm_db; //7段数码管(不包括小数点)reg [2:0]sm_cs; //数码管片选信号,低有效(共阴)reg[15:0] cnt; //1ms计数=65536*20nsreg[1:0] cnt_dis;//每毫秒刷新一次显示always @ (posedge clk or negedge rst_n)if(!rst_n)begincnt <= 16'd0;cnt_dis <= 2'd1;endelsebegincnt <= cnt+1'b1;if(cnt==16'hffff)cnt_dis=cnt_dis+1'd1;end//-------------------------------------------------------------------------------parameter seg0 = 7'h3f,seg1 = 7'h06,seg2 = 7'h5b,seg3 = 7'h4f,seg4 = 7'h66,seg5 = 7'h6d,seg6 = 7'h7d,seg7 = 7'h07,seg8 = 7'h7f,seg9 = 7'h6f,sega = 7'h77,segb = 7'h7c,segc = 7'h39,segd = 7'h5e,sege = 7'h79,segf = 7'h71;reg[6:0] sm_dbr; //7段数码管(不包括小数点)reg [3:0] num; //显示数据always @ (posedge clk)case (cnt_dis)2'd1:beginnum <= dis_data[11:8];sm_cs<=3'b011;end2'd2:beginnum <= dis_data[7:4];sm_cs<=3'b101;end2'd3:beginnum <= dis_data[3:0];sm_cs<=3'b110;enddefault:sm_cs<=3'b111;endcasealways @ (posedge clk)case (num) //NUM值显示在两个数码管上4'h0: sm_dbr <= seg0;4'h1: sm_dbr <= seg1;4'h2: sm_dbr <= seg2;4'h3: sm_dbr <= seg3;4'h4: sm_dbr <= seg4;4'h5: sm_dbr <= seg5;4'h6: sm_dbr <= seg6;4'h7: sm_dbr <= seg7;4'h8: sm_dbr <= seg8;4'h9: sm_dbr <= seg9;4'ha: sm_dbr <= sega;4'hb: sm_dbr <= segb;4'hc: sm_dbr <= segc;4'hd: sm_dbr <= segd;4'he: sm_dbr <= sege;4'hf: sm_dbr <= segf;default: ;endcaseassign sm_db = sm_dbr; endmodule//smg_top.vt`timescale 1 ns/ 1 psmodule smg_top_vlg_tst();reg clk;reg rst_n;reg [9:0] dis_data_in; //用于仿真wire [2:0] sm_cs;wire [3:0] num; //用于仿真wire [6:0] sm_db;smg_top i1 (.clk(clk),.rst_n(rst_n),.num(num),.sm_cs(sm_cs),.dis_data_in( dis_data_in),.sm_db(sm_db));initialbeginclk<=1'b0;rst_n<=1'b0;dis_data_in<=10'd987;# 100 rst_n<=1'b1;endalways #10 clk<=~clk; endmodule仿真图:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

共阳数码管
`timescale 1ns / 1ps
///////////////////////////////////////////////////////////////////// /////////////
// Company:
// Engineer:
//
// Create Date: 15:21:48 11/06/2010
// Design Name:
// Module Name: v_digitron
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
0xc0,0xf9,0xa4,0xb0 ,0x99,0x92,0x82,0xf8,0x80,0x90
//
///////////////////////////////////////////////////////////////////// /////////////
module v_digitron(clk,rst_n,sm_cs1,sm_cs2,sm_cs3,sm_cs4,sm_db);
input clk,rst_n;
output sm_cs1,sm_cs2,sm_cs3,sm_cs4;
output [6:0] sm_db;
//计数,2^24=16*10^6;即16*10^6*20ns=0.32s=320ms
reg [24:0] cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n) cnt<=25'b0;
else cnt<=cnt+1'b1;
reg [3:0] num;
always @(posedge clk or negedge rst_n)
if(!rst_n) num<=4'b0;
else if(cnt==25'h1ff_ffff) num<=num+1'b1;
parameter
seg0 = 7'hc0,
seg1 = 7'hf9,
seg2 = 7'ha4,
seg3 = 7'hb0,
seg4 = 7'h99,
seg5 = 7'h92,
seg6 = 7'h82,
seg7 = 7'hf8,
seg8 = 7'h80,
seg9 =7'h90,
sega =7'h88,
segb =7'h83,
segc =7'hc6,
segd =7'ha1,
sege =7'h86,
segf =7'h8e;
//segf =7'hff;
reg [6:0] sm_dbr;
always @(num)
case(num)
4'h0:sm_dbr<=seg0; 4'h1:sm_dbr<=seg1; 4'h2:sm_dbr<=seg2; 4'h3:sm_dbr<=seg3; 4'h4:sm_dbr<=seg4; 4'h5:sm_dbr<=seg5; 4'h6:sm_dbr<=seg6; 4'h7:sm_dbr<=seg7; 4'h8:sm_dbr<=seg8; 4'h9:sm_dbr<=seg9; 4'hA:sm_dbr<=sega; 4'hB:sm_dbr<=segb; 4'hC:sm_dbr<=segc; 4'hD:sm_dbr<=segd; 4'hE:sm_dbr<=sege; 4'hF:sm_dbr<=segf; default:;
endcase
assign sm_db = sm_dbr;
assign sm_cs1 = 1'b1;
assign sm_cs2 = 1'b1;
assign sm_cs3 = 1'b1;
assign sm_cs4 = 1'b0;
endmodule
Implementation Constrants Flie NET "clk" LOC = P54;
NET "rst_n" LOC = P38;
NET "sm_cs1" LOC = P34; NET "sm_cs2" LOC = P33; NET "sm_cs3" LOC = P32; NET "sm_cs4" LOC = P26; NET "sm_db<0>" LOC = P25; NET "sm_db<1>" LOC = P16; NET "sm_db<2>" LOC = P23; NET "sm_db<3>" LOC = P21; NET "sm_db<4>" LOC = P20; NET "sm_db<5>" LOC = P17; NET "sm_db<6>" LOC = P83;。

相关文档
最新文档