3004|3

324

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

XILINX NEXYS3之数码管 [复制链接]

本帖最后由 hjl240 于 2014-2-6 23:12 编辑

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



其实数码管的显示原理与单片机控制数码管的原理是一样的,动态显示的原理是利用了人眼的视觉暂留现象。此数码管为共阴数码管。程序比较简单,上面也有注释,如果有什么问题,可以提出来讨论讨论。
附:整个程序与工程。
smg.rar (310.51 KB, 下载次数: 8)

XILINX NEXYS3-实现数码管.pdf (512.63 KB, 下载次数: 11)



`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;//数码管位选

/******************数码管位选定义**************************/
parameter AN1=4'b0111,AN2=4'b1011,AN3=4'b1101,AN4=4'b1110;

/*****************数码管段选定义********************************/
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;

/*************数码管带小数点的段选定义****************************/
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;

/***********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  

/***********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  

/*********LED每隔1秒状态翻转一次*****************************************/
reg ledr;
always @(posedge clk_1 or negedge rst_n)
begin
         if(!rst_n)
                   ledr<=1'b1;
         else
                   ledr<=~ledr;
end

assign led=ledr;


/********下面是秒与分的计时*****************************************/
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


endmodule


端口配置如下:

# PlanAhead Generated physical constraints

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;

此帖出自FPGA/CPLD论坛

最新回复

这个LED的冒号没有接线。我也找过半天! 官方datasheet http://www.xilinx.com/support/documentation/data_sheets/ds312.pdf  详情 回复 发表于 2014-2-8 00:02
点赞 关注
个人签名

欢迎关注:JL单片机

 

回复
举报

3836

帖子

19

TA的资源

纯净的硅(中级)

沙发
 
谢谢楼主分享 先看看哈哈

此帖出自FPGA/CPLD论坛
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个LED的冒号没有接线。我也找过半天!
官方datasheet
http://www.xilinx.com/support/documentation/data_sheets/ds312.pdf
此帖出自FPGA/CPLD论坛

点评

刚才看了一下手册,确实没说这个冒号的接线情况 [attachimg]142071[/attachimg]  详情 回复 发表于 2014-2-17 15:02
 
 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

4
 
ryerwera 发表于 2014-2-8 00:02
这个LED的冒号没有接线。我也找过半天!
官方datasheet
http://www.xilinx.com/support/documentation/da ...

刚才看了一下手册,确实没说这个冒号的接线情况


此帖出自FPGA/CPLD论坛
个人签名

欢迎关注:JL单片机

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表