找回密码
 注册
关于网站域名变更的通知
查看: 524|回复: 1
打印 上一主题 下一主题

转——XILINX NEXYS3之数码管

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-28 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
转——XILINX NEXYS3之数码管
5 E4 t( l  ]. \  M

. _& V/ u' q! Z, G- a
本实验实现数码管显示分钟与秒,并且第一个led每隔1秒状态翻转一次。将SW0拨到上面,时间开始走动。(由于没有找到数码管冒号的控制端,故用小数点代替,如果知道数码管的冒号控制端,可以回复我
先看有关数码管的原理图:

, {9 g+ p6 i: G3 O0 S, I$ E! q. d/ x/ v; }3 `

* h- }5 ^9 I  ~! v/ d' ?4 A
其实数码管的显示原理与单片机控制数码管的原理是一样的,动态显示的原理是利用了人眼的视觉暂留现象。此数码管为共阴数码管。程序比较简单,上面也有注释,如果有什么问题,可以提出来讨论讨论。
附:整个程序与工程。
游客,如果您要查看本帖隐藏内容请回复
0 ^& Q- }1 L& L4 l$ o

4 j; D+ ]: u( U3 t9 }: g7 b$ d8 i
% a: D% T  G+ Q' i. `8 E' u
: f4 N5 z! R0 u- m( U( o
`timescale 1ns / 1ps
module smg(
  led,
         clk,
         rst_n,
         duan,
         wei
   );
output led;//led
input clk;//100MHz时钟
input rst_n;//复位信号
output reg[7:0]  duan;//数码管段选
output reg[3:0] wei;//数码管位选
9 {; i5 |6 J6 B" J
/******************数码管位选定义**************************/
parameter AN1=4'b0111,AN2=4'b1011,AN3=4'b1101,AN4=4'b1110;
$ O6 W, T4 A; t1 e5 x9 o5 P
/*****************数码管段选定义********************************/
parameter zero=8'b0000_0011,one =8'b1001_1111,
two = 8'b0010_0101,three =8'b0000_1101,four = 8'b1001_1001,
five = 8'b0100_1001,six =8'b0100_0001,seven = 8'b0001_1111,
eight = 8'b0000_0001,nine = 8'b0000_1001;
" h. O1 h9 }( I. H
/*************数码管带小数点的段选定义****************************/
parameter zero_dp=8'b0000_0010,one_dp =8'b1001_1110,
two_dp = 8'b0010_0100,three_dp =8'b0000_1100,four_dp = 8'b1001_1000,
five_dp = 8'b0100_1000,six_dp =8'b0100_0000,seven_dp = 8'b0001_1110,
eight_dp = 8'b0000_0000,nine_dp =8'b0000_1000;
5 Y( i  M- y% x- `( ?: g1 [  _) T
/***********1HZ分频模块 提供时钟秒基准***************************************/
reg[25:0] cnt;//x/100 000000=0.5 x=50 000000 26
reg clk_1;
always @(posedge clk )
begin
         if(cnt==50000000)
            begin
              cnt<=26'b0;
                            clk_1<=~clk_1;
                   end
         else
                   cnt<=cnt+26'b1;
end  

# |$ W5 i4 L* ?: V+ e  |  A4 P
/***********1000HZ分频模块 为数码管刷新用*********************************/
reg[15:0] cnt2;//50 000
reg clk_1k;
always @(posedge clk )
begin
         if(cnt2==50000)
            begin
              cnt2<=16'b0;
                            clk_1k<=~clk_1k;
                   end
         else
                   cnt2<=cnt2+16'b1;
end  

$ l. `  i0 {9 Q' @5 a, V2 \
/*********LED每隔1秒状态翻转一次*****************************************/
reg ledr;
always @(posedge clk_1 or negedge rst_n)
begin
         if(!rst_n)
                   ledr<=1'b1;
         else
                   ledr<=~ledr;
end

$ g. y7 D% i7 F
assign led=ledr;

8 W; d' i+ @# v6 U5 I& Q- P; u% a# ?  k9 H5 f" V5 S1 v( z
/********下面是秒与分的计时*****************************************/
reg [5:0] miao;
reg[5:0] fen;
always@(posedge clk_1 or negedge rst_n)
begin
         if(!rst_n)//复位
         begin
                   miao<=10;
                   fen<=12;
         end
         else
         begin
                   miao<=miao+6'b1;//每隔一秒,秒自加1
                   if(miao==59)//如果秒等于59
                   begin
                            miao<=6'b0;//
                            fen<=fen+6'b1;
                            if(fen==59)
                                     fen<=6'b0;
                   end
         end
end
/**********下面开始显示秒,分钟************************************/
reg [1:0] count;
always @(posedge clk_1k or negedge rst_n)
begin
         if(!rst_n)//复位
         begin
                   duan<=zero;
                   wei<=4'b0000;
         end
         else
         begin
                   count<=count+2'b1;//相当于每隔4ms数码管整体刷新一次,第一秒,刷新秒的个  //位,第二秒,刷新秒的十位,第三秒刷新分的个位,第四秒刷新分的十位
                   if(count==2'b00)
                   begin
                            wei<=AN1;//首先显示秒的个位
                            case(miao%10)
                                     0:duan<=zero;
                                     1:duan<=one;
                                     2:duan<=two;
                                     3:duan<=three;
                                     4:duan<=four;
                                     5:duan<=five;
                                     6:duan<=six;
                                     7:duan<=seven;
                                     8:duan<=eight;
                                     9:duan<=nine;
                            endcase
                   end
                   elseif(count==2'b01)
                   begin
                            wei<=AN2;//显示秒的十位
                            case(miao/10)
                                     0:duan<=zero;
                                     1:duan<=one;
                                     2:duan<=two;
                                     3:duan<=three;
                                     4:duan<=four;
                                     5:duan<=five;
                                     6:duan<=six;
                                     7:duan<=seven;
                                     8:duan<=eight;
                                     9:duan<=nine;
                            endcase
                   end
                   elseif(count==2'b10)
                   begin
                            wei<=AN3;//显示十的个位
                            case(fen%10)
                                     0:duan<=zero_dp;
                                     1:duan<=one_dp;
                                     2:duan<=two_dp;
                                     3:duan<=three_dp;
                                     4:duan<=four_dp;
                                     5:duan<=five_dp;
                                     6:duan<=six_dp;
                                     7:duan<=seven_dp;
                                     8:duan<=eight_dp;
                                     9:duan<=nine_dp;   
                            endcase
                   end            
                   elseif(count==2'b11)
                   begin
                            count<=2'b00;
                            wei<=AN4;//显示十的十位
                            case(fen/10)
                                     0:duan<=zero;
                                     1:duan<=one;
                                     2:duan<=two;
                                     3:duan<=three;
                                     4:duan<=four;
                                     5:duan<=five;
                                     6:duan<=six;
                                     7:duan<=seven;
                                     8:duan<=eight;
                                     9:duan<=nine;         
                            endcase
                   end
         end
end

, F' K9 m( S7 M; H' e6 r3 g
" b5 [% z* h+ J& n  H
endmodule

( s9 W& a; v0 b% `6 B( U- L5 b: r  ]8 H& O5 u) D" E
端口配置如下:
% @5 s! x: B. ?
# PlanAhead Generated physical constraints
* }% {) G* ?) ]. L' ?
NET "duan[7]" LOC = T17;
NET "duan[6]" LOC = T18;
NET "duan[5]" LOC = U17;
NET "duan[4]" LOC = U18;
NET "duan[3]" LOC = M14;
NET "duan[2]" LOC = N14;
NET "duan[1]" LOC = L14;
NET "duan[0]" LOC = M13;
NET "wei[3]" LOC = N16;
NET "wei[2]" LOC = N15;
NET "wei[1]" LOC = P18;
NET "wei[0]" LOC = P17;
NET "clk" LOC = V10;
NET "rst_n" LOC=T10;
NET "led" LOC =T11;
6 t, U1 l, i+ `

1 |1 Z& X, V( a  K7 c6 ~4 W

该用户从未签到

2#
发表于 2019-4-28 17:34 | 只看该作者
发帖是心得 回帖是美德
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 06:08 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表