FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)

这篇具有很好参考价值的文章主要介绍了FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实现功能

1. 能正常完成时钟的时、分、秒走时;

2. 使用LED闪烁或者改变颜色等方式实现秒的指示,要求闪烁频率或者颜色切换频率为1Hz

3. 使用两位七段数码管显示时和分,其切换方式为:默认显示“分钟”,按住K4键显示“小时”,按下K3显示秒针;

4. 关上开关sw2,使用K1K2键调整时间,分别为“+”和“-”,则K1K2调整“分钟”,当K4按下,则K1K2调整“小时”,当K3按下,则K1K2调整“秒针”;

5. 整点报时:当时间到达每个整点,则全彩LED以某种固定颜色按1Hz频率闪烁相应次数(按24小时制);

6. 闹钟设置,将sw3开关设置为1,开始设置固定时钟和分钟,当时间计时到达时,八个led灯闪烁一分钟;

二、实验

1.整体结构

FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)

2.主函数 

// Module Function:时钟设计
 
module time_clock (clk,rst,seg_led_1,seg_led_2,led,key,sw2,sw3,led_rgb1,led_rgb2);
 
    input clk,rst;
    input [3:0]key;
    input sw2,sw3;
    output reg [8:0] seg_led_1;
    output reg [8:0] seg_led_2;    

    output reg [7:0] led;
    output reg [2:0] led_rgb1=3'b 111;
    output reg [2:0] led_rgb2=3'b 111;
    
        
        reg   [3:0] cnt1 ;                               //定义了一个4位的计数器
        reg   [3:0] count1;
        reg   [3:0] count_set_1;
        reg   [3:0] cnt2 ;
        reg   [3:0] count2;
        reg   [3:0] count_set_2;
        reg   [3:0] cnt3 ;                               //定义了一个4位的计数器
        reg   [3:0] count3;
        reg   [3:0] count_set_3;
        reg   [3:0] cnt4 ;
        reg   [3:0] count4;
        reg   [3:0] count_set_4;
        reg   [3:0] cnt5 ;                               //定义了一个4位的计数器
        reg   [3:0] count5;
        reg   [3:0] count_set_5;
        reg   [3:0] cnt6 ;
        reg   [3:0] count6;
        reg   [3:0] count_set_6;
        reg   [30:0]count_1s;
        reg   [30:0]count_05s;
        reg [15 : 0] count;
        reg [15 : 0] count0;
        reg [8:0] seg [9:0]; 
     

        wire clk1s;                                     //定义一个中间变量,表示分频得到的时钟,用作计数器的触发        
        
        
        //间隔脉冲模块,产生一个   秒针    时钟信号
        parameter N1 = 12000000;
    always@(posedge clk) begin
    if(!rst) 
        count_1s <= 0;
    else if(count_1s == N1-1)
        count_1s<=0;
    else
        count_1s<= count_1s + 1;
    end
    //间隔脉冲模块,产生一个调整  间隔     信号时钟信号
    parameter N2 = 1500000;
    always@(posedge clk) begin
    if(!rst) 
        count_05s <= 0;
    else if(count_05s == N2-1)
        count_05s<= 0;
    else
        count_05s<= count_05s + 1;
    end

       
     
    divide #(.WIDTH(32),.N(12000000)) u2 (         //传递参数
            .clk(clk),
            .rst_n(rst),                   //例化的端口信号都连接到定义好的信号
            .clkout(clk1s)
            );   

     
     
       always @(posedge clk or negedge rst)
begin
            
            if (!rst) //---------------------------------------------异步清零
                 begin
                    cnt1 <= 0;
                    cnt2<=0;
                    cnt3 <= 0;
                    cnt4<=0;
                    cnt5 <= 0;
                    cnt6<=0;
                 end
            //----------------------------------------开始计时
        else
        begin
            if(sw2==1)//sw2调整时间的开关   1:开始计时   0:调整时间    sw3为闹钟设置开关 设置闹钟模式sw3:1  退出设置闹钟模式sw3:0 
            begin
                            if(count_1s==N1-1 )
                                begin
                                //秒
                                     if((cnt2==5)&&(cnt1==9))
                                        begin
                                            cnt1<=0;
                                            cnt2<=0;
                                        //分钟
                                            if((cnt4==5)&&(cnt3==9))
                                                begin
                                                    cnt3<=0;
                                                    cnt4<=0;
                                                    //小时
                                                    if((cnt6==2)&&(cnt5==3))
                                                        begin
                                                        cnt5<=0;
                                                        cnt6<=0;
                                                        end
                                                    else if(cnt5==9)
                                                        begin
                                                        cnt5<=0;
                                                        cnt6<=cnt6+1;
                                                        end
                                                     else
                                                        begin
                                                        cnt5<=cnt5+1;
                                                        end
                                                    //小时
                                                end
                                            else if(cnt3==9)
                                                begin
                                                cnt3<=0;
                                                cnt4<=cnt4+1;
                                                end
                                             else
                                                begin
                                                cnt3<=cnt3+1;
                                                end
                                        end
                                        //分钟
                                    else if(cnt1==9)
                                        begin
                                        cnt1<=0;
                                        cnt2<=cnt2+1;
                                        end
                                     else
                                        begin
                                        cnt1<=cnt1+1;
                                        end
                                        
                                //秒
                                end
                            
                    
                           
            end
            //-------------------------------------------------------------------暂停调整时间
            if(sw2==0 && sw3==0)
            begin
                if(key[2]==1 && key[3]==1)//-----------------------------------------------调整分针
                    begin
                        if(  key[0]==0 )
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if((cnt4==5)&&(cnt3==9))
                                            begin
                                            cnt3<=0;
                                            cnt4<=0;
                                            end
                                    else if(cnt3==9 )
                                            begin
                                            cnt3<=0;
                                            cnt4<=cnt4+1;
                                            end
                                    else
                                            begin
                                            cnt3<=cnt3+1;
                                            end
                                end
                                
                                
                            end
                        else if(key[1]==0)
                         
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if(cnt3==0 && cnt4==0)
                                        begin
                                        cnt3<=9;
                                        cnt4<=5;
                                        end
                                    else if(cnt3==0)
                                        begin
                                        cnt3<=9;
                                        cnt4<=cnt4-1;
                                        end
                                    else
                                        cnt3<=cnt3-1;
                                end
                            
                    end
                    else
                        begin
                        cnt3<=cnt3;
                        cnt4<=cnt4;
                        end
                    end
            
                else if(key[2]==1 && key[3]==0)//-----------------------------------------------调整时针
                    begin
                        if(  key[0]==0 )
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if((cnt6==2)&&(cnt5==3))
                                            begin
                                            cnt5<=0;
                                            cnt6<=0;
                                            end
                                    else if(cnt5==9)
                                            begin
                                            cnt5<=0;
                                            cnt6<=cnt6+1;
                                            end
                                    else
                                            begin
                                            cnt5<=cnt5+1;
                                            end
                                end
                            end
                        else if(key[1]==0)
                         
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if(cnt5==0 && cnt6==0)
                                        begin
                                        cnt5<=3;
                                        cnt6<=2;
                                        end
                                    else if(cnt5==0)
                                        begin
                                        cnt5<=9;
                                        cnt6<=cnt6-1;
                                        end
                                    else
                                        cnt5<=cnt5-1;
                                end
                                
                            end
                        else
                            begin
                            cnt5<=cnt5;
                            cnt6<=cnt6;
                            end
                    end
                else if(key[2]==0 && key[3]==1)//-----------------------------------------------调整秒针
                    begin
                        if(  key[0]==0 )
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if((cnt2==5)&&(cnt1==9))
                                            begin
                                            cnt1<=0;
                                            cnt2<=0;
                                            end
                                    else if(cnt1==9)
                                            begin
                                            cnt1<=0;
                                            cnt2<=cnt2+1;
                                            end
                                    else
                                            begin
                                            cnt1<=cnt1+1;
                                            end
                                end
                            end
                        else if(key[1]==0)
                         
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if(cnt1==0 && cnt2==0)
                                        begin
                                        cnt1<=9;
                                        cnt2<=5;
                                        end
                                    else if(cnt1==0)
                                        begin
                                        cnt1<=9;
                                        cnt2<=cnt2-1;
                                        end
                                    else
                                        cnt1<=cnt1-1;
                                end
                                
                            end
                        else
                            begin
                            cnt1<=cnt1;
                            cnt2<=cnt2;
                            end
                    end

                

            end
            //-----------------------------------------------设置闹钟 
         
            if(sw3==1 )
            begin
                if(key[2]==1 && key[3]==1)//-----------------------------------------------调整分针
                    begin
                        if(  key[0]==0 )
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if((count_set_4==5)&&(count_set_3==9))
                                            begin
                                            count_set_3<=0;
                                            count_set_4<=0;
                                            end
                                    else if(count_set_3==9 )
                                            begin
                                            count_set_3<=0;
                                            count_set_4<=count_set_4+1;
                                            end
                                    else
                                            begin
                                            count_set_3<=count_set_3+1;
                                            end
                                end
                                
                                
                            end
                        else if(key[1]==0)
                         
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if(count_set_3==0 && count_set_4==0)
                                        begin
                                        count_set_3<=9;
                                        count_set_4<=5;
                                        end
                                    else if(count_set_3==0)
                                        begin
                                        count_set_3<=9;
                                        count_set_4<=count_set_4-1;
                                        end
                                    else
                                        count_set_3<=count_set_3-1;
                                end
                            
                    end
                    else
                        begin
                        count_set_3<=count_set_3;
                        count_set_4<=count_set_4;
                        end
                    end
            
                else if(key[2]==1 && key[3]==0)//-----------------------------------------------调整时针
                    begin
                        if(  key[0]==0 )
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if((count_set_6==2)&&(count_set_5==3))
                                            begin
                                            count_set_5<=0;
                                            count_set_6<=0;
                                            end
                                    else if(count_set_5==9)
                                            begin
                                            count_set_5<=0;
                                            count_set_6<=count_set_6+1;
                                            end
                                    else
                                            begin
                                            count_set_5<=count_set_5+1;
                                            end
                                end
                            end
                        else if(key[1]==0)
                         
                            begin
                                if(count_05s==N2-1)
                                begin
                                    if(count_set_5==0 && count_set_6==0)
                                        begin
                                        count_set_5<=3;
                                        count_set_6<=2;
                                        end
                                    else if(count_set_5==0)
                                        begin
                                        count_set_5<=9;
                                        count_set_6<=count_set_6-1;
                                        end
                                    else
                                        count_set_5<=count_set_5-1;
                                end
                                
                            end
                        else
                            begin
                            count_set_5<=count_set_5;
                            count_set_6<=count_set_6;
                            end
            
                    end
            
            
            end

        end         
end
 //--------------------------------------------------------------------数码管显示
        
                                //在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial
    initial                                                      //initial和always不同,其中语句只执行一次
        begin
          seg[0] = 9'h3f;                                           //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字  0
          seg[1] = 9'h06;                                           //7段显示数字  1
          seg[2] = 9'h5b;                                           //7段显示数字  2
          seg[3] = 9'h4f;                                           //7段显示数字  3
          seg[4] = 9'h66;                                           //7段显示数字  4
          seg[5] = 9'h6d;                                           //7段显示数字  5
          seg[6] = 9'h7d;                                           //7段显示数字  6
          seg[7] = 9'h07;                                           //7段显示数字  7
          seg[8] = 9'h7f;                                           //7段显示数字  8
          seg[9] = 9'h6f;                                           //7段显示数字  9
     end
always @(posedge clk)
begin 
    if(sw3==0)
    begin
        if(key[2]==1 && key[3]==0)
            begin
            count5<=cnt5;
            count6<=cnt6;
            seg_led_1<=seg[count6];
            seg_led_2<=seg[count5]; 
    
            end
        else if(key[2]==0 && key[3]==1)
        begin
            count1<=cnt1;
            count2<=cnt2;
            seg_led_1<=seg[count2];
            seg_led_2<=seg[count1]; 
        end
        else
        begin
            count4<=cnt4;
            count3<=cnt3;
            seg_led_1<=seg[count4];
            seg_led_2<=seg[count3]; 
        end
    end
    else
    begin
        if(key[2]==1 && key[3]==0)
            begin
            count5<=count_set_5;
            count6<=count_set_6;
            seg_led_1<=seg[count6];
            seg_led_2<=seg[count5]; 
    
            end
        else if(key[2]==0 && key[3]==1)
        begin
            count1<=count_set_1;
            count2<=count_set_2;
            seg_led_1<=seg[count2];
            seg_led_2<=seg[count1]; 
        end
        else
        begin
            count4<=count_set_4;
            count3<=count_set_3;
            seg_led_1<=seg[count4];
            seg_led_2<=seg[count3]; 
        end
    end
    
end

//--------------------------------------------整点--三色灯闪烁
always @(posedge clk1s)
begin
    led_rgb2[0]<=~led_rgb2[0];//--------------------------------------------三色灯秒钟闪烁
    if(cnt3==0 && cnt4==0)
        begin
            led_rgb1[0]<=~led_rgb1[0];
        end
    else
        begin
            led_rgb1[0]<=1;
            
        end
        

end
//-------------------------------------------闹钟闪烁
always @(posedge clk1s)
begin
    if(count_set_3 == cnt3 && count_set_4 == cnt4 && count_set_5 == cnt5 &&  count_set_6 == cnt6)
    begin
            
            led<=~led;
    end  
    else
    begin
            led<=8'b 11111111;
    end
end

  
endmodule

3.分频器


// Module Function:任意整数时钟分频
 
module divide (	clk,rst_n,clkout);
 
        input 	clk,rst_n;                       //输入信号,其中clk连接到FPGA的C1脚,频率为12MHz
        output	clkout;                          //输出信号,可以连接到LED观察分频的时钟
 
        //parameter是verilog里常数语句
	parameter	WIDTH	= 24;             //计数器的位数,计数的最大值为 2**WIDTH-1
	parameter	N	= 12_000_000;             //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出
 
	reg 	[WIDTH-1:0]	cnt_p,cnt_n;     //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
	reg			clk_p,clk_n;     //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟
 
	//上升沿触发时计数器的控制
	always @ (posedge clk or negedge rst_n )         //posedge和negedge是verilog表示信号上升沿和下降沿
                                                         //当clk上升沿来临或者rst_n变低的时候执行一次always里的语句
		begin
			if(!rst_n)
				cnt_p<=0;
			else if (cnt_p==(N-1))
				cnt_p<=0;
			else cnt_p<=cnt_p+1;             //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器
		end
 
         //上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
         always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				clk_p<=0;
			else if (cnt_p<(N>>1))          //N>>1表示右移一位,相当于除以2去掉余数
				clk_p<=0;
			else 
				clk_p<=1;               //得到的分频时钟正周期比负周期多一个clk时钟
		end
 
        //下降沿触发时计数器的控制        	
	always @ (negedge clk or negedge rst_n)
		begin
			if(!rst_n)
				cnt_n<=0;
			else if (cnt_n==(N-1))
				cnt_n<=0;
			else cnt_n<=cnt_n+1;
		end
 
        //下降沿触发的分频时钟输出,和clk_p相差半个时钟
	always @ (negedge clk)
		begin
			if(!rst_n)
				clk_n<=0;
			else if (cnt_n<(N>>1))  
				clk_n<=0;
			else 
				clk_n<=1;                //得到的分频时钟正周期比负周期多一个clk时钟
		end
 
        assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;      //条件判断表达式
                                                                    //当N=1时,直接输出clk
                                                                    //当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p
                                                                    //当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
endmodule 

4.广角分配

FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)文章来源地址https://www.toymoban.com/news/detail-504655.html

到了这里,关于FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA的电子时钟设计与实现 (在EDA开发板上实现电子时钟功能)

    开发板: 此款开发板使用的是 ALTERA 公司的 Cyclone IV 系列 FPGA,型号为 EP4CE6F17C8, 256 个引脚的 FBGA 封装。  题目:在EDA开发板上实现电子时钟功能 要求:实现电子时钟程序编写,实现在7段数码管显示时、分、秒,使用4x4矩阵按键模拟调节时钟指令输入按键,并实现整点报时

    2024年02月04日
    浏览(31)
  • 【FPGA & Modsim】数字时钟

    实验题目:    数字时钟设计                                   实验目的:    掌握数字时钟的工作原理;掌握使用数字逻辑设计集成开发环境分模块设计数字时钟的方法。                           实验内容: 1、创建一个数字时钟工程,使用

    2024年01月18日
    浏览(26)
  • FPGA项目设计:数字时钟

    项目要求: 设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。 项目设计: 系统框架图: 计数模块时序图: 代码实现: 计数模块: 数码管显示模块: 顶层文件:

    2024年02月14日
    浏览(31)
  • 基于FPGA的数字时钟系统设计

    在FPGA的学习中,数字时钟是一个比较基础的实验案例,通过该实验可以更好的锻炼初学者的框架设计能力以及逻辑思维能力,从而打好坚实的基本功,接下来就开始我们的学习吧! 1.数码管介绍 数码管通俗理解就是将8个LED(包含dp部分)灯拼接到一起组成的,分别标号为a~g。前

    2024年02月06日
    浏览(33)
  • FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019   级    电子科学与技术   专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。

    2024年02月03日
    浏览(34)
  • 基于FPGA的数字时钟(使用vivado)

    使用两个四位数码管,可以实现时钟分钟秒钟显示,高两位设置不显示。 换了一个新开发板,nexys4ddr,资料不多,最多使用的就是一本英文Reference Manual。 其实是老师觉得我计数器还差点,得再练练。 Digilent NEXYS4DDR Vivado2018.3 60进制秒钟计数然后进1分钟 60进制分钟计数然后进

    2024年02月03日
    浏览(30)
  • FPGA数字时钟(可暂停调数,含代码)

    前段时间刚刚开始初步学习FPGA相关知识,在学习了一段时间后,利用前面所学知识,写了一个数字时钟,顺便在这里写下总结,方便理解。 (本人小白一名,有错欢迎指出,欢迎探讨) 我使用的FPGA芯片型号是Cyclone IV的EP4CE6F17C8,如有想测试实现效果的同学,可以把后面3-

    2024年02月02日
    浏览(33)
  • 基于FPGA的多功能数字时钟设计报告

    作品基于intel Cyclone IV E EP4CE10F17C8 FPGA板卡,主要开发环境为Quartus Ⅱ,编程并实现了多功能温湿度电子钟。本作品在实现显示实时时间的基础上,设计并完成了设置闹钟、改变闹钟铃声、显示实时温度和实时湿度、基于以太网通信协议的实时视频传输等功能。在未设置闹钟时

    2024年02月05日
    浏览(34)
  • FPGA实验报告 Verilog HDL:7人表决器 巴克码信号发生器 FPGA数字时钟

    写在前面:本文提供以下三个任务的思路讲解和代码实现, 如需参考引脚配置说明,可以点击下方链接跳转查看完整实验报告 ;本实验使用的是Altera公司的cycloneⅢ类型的芯片。 Verilog HDL实现:7人表决器 信号发生器 多功能数字时钟 实验目标:实现7人投票表决电路,支持人

    2024年02月05日
    浏览(37)
  • FPGA学习——FPGA实现电子时钟

    Cyclone IV开发板上的数码管一共有6个,我们每次只能选择其中一个显示,怎么解决电子时钟时、分、秒同时显示呢?要实现电子时钟首先要了解什么是余晖效应。   余晖效应一般指视觉暂留。 视觉暂留现象即视觉暂停现象(Persistence of vision,Visual staying phenomenon,duration o

    2024年02月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包