基于FPGA的秒表数码管显示

链接:https://pan.baidu.com/s/1JzG7b9xz8OXOeETqunnyBw
提取码:1234

功能

功能:四位数码管显示,从零开始计数,前两位显示秒(059),后两位显示0.01秒(099),
计满后从零开始,有开始键、暂停键、复位键。当第一次按下开始键,秒表从初始开始计数,LED显示器上显示当前计时值;当紧按下(按住)暂停键时,秒表暂停计时,LED上显示当前计时值,放开则继续计时;当按下复位键时,秒表停止计数,并且计数结果清零。

部分代码

module time_clock(
    clk,
    reset_n,
    start_key,
    pause_key,
    duan,
    wei
    );
    
    input           clk;                            //clk:50MHZ时钟输入;
    input           reset_n;                        //复位信号输入,低电平有效;
    input           start_key;                      //开始信号输入,低电平有效;
    input           pause_key;                      //暂停功能按键,进行秒表计时和倒计时时可以通过该按键进行暂停,‘1’暂停,‘0’继续
    
    output  [7:0]   duan;                           //duan:数码管段码;
    output  [7:0]   wei;                            //wei:数码管位码;
    
    reg     [7:0]   duan;                           //duan:数码管段码;
    reg     [7:0]   wei;                            //wei:数码管位码;

    reg     [24:0]  count;                          //100HZ时钟计数器
    reg     [13:0]  count2;                         //扫描时钟计数器
    reg             clk_2000hz;                     //100HZ时钟信号

    reg             clk_scan;                       //数码管扫描时钟
    reg     [1:0]   select;                         //用于扫描时选择显示位码
    
    // ****************************************************
    //开始按键消抖模块
    // ****************************************************
    reg         start_key_out;
    parameter   start_s0=3'b000,
                start_s1=3'b001,
                start_s2=3'b010,
                start_s3=3'b011,
                start_s4=3'b100,
                start_s5=3'b101;
    reg [2:0]   start_state;
    always @(posedge clk or negedge reset_n)
    begin
        if(reset_n == 1'b0)
        begin
            start_state <= start_s0;
            start_key_out <= 1'b1;
        end
        else
        begin
            case (start_state)
            start_s0:
            begin 
                start_key_out <= 1'b1;
                if(start_key == 1'b0)
                start_state <= start_s1;
                else 
                start_state <= start_s0;
            end
            start_s1:
            begin 
                if(start_key == 1'b0)
                start_state <= start_s2;
                else 
                start_state <= start_s0;
            end 
            start_s2:
            begin 
                if(start_key == 1'b0)
                start_state <= start_s3;
                else 
                start_state <= start_s0;    
            end 
            start_s3:
            begin 
                if(start_key == 1'b0)
                start_state <= start_s4;
                else 
                start_state <= start_s0;    
            end
            start_s4:
            begin 
                if(start_key == 1'b0)
                start_state <= start_s5;
                else 
                start_state <= start_s0;    
            end
            start_s5:
            begin 
                if(start_key == 1'b0)
                begin
                    start_key_out <= 1'b0;
                    start_state <= start_s5;
                end 
                else 
                begin
                    start_key_out <= 1'b0;
                    start_state <= start_s5;
                end
            end
            default:
            begin
                start_state <= start_s0;
                start_key_out <= 1'b1;
            end
            endcase
        end
    end
    //****************************************************************************************************
    //  模块名称:分频模块
    //  功能描述:
    //****************************************************************************************************
    always @(posedge clk or negedge reset_n)//2000HZ时钟进程
    begin
        if(reset_n == 1'b0)
        begin
            count <= 25'd0;
            clk_2000hz <= 1'b0;
        end
        else
            if(count == 25'd12499)
            begin
                clk_2000hz <= ~clk_2000hz;
                count <= 25'd0;
            end
            else
                count <= count + 1'b1;
    end
    
    reg     [17:0]  counter_count;
    reg             clk_100hz;
    always @(posedge clk or negedge reset_n)//100HZ时钟进程 clk_2000hz
    begin
        if(reset_n == 1'b0)
        begin
            counter_count <= 18'd0;
            clk_100hz <= 1'b0;
        end
        else
            if(~pause_key == 1'b0)//当暂停的时候不进行产生计数时钟信号
                if(counter_count == 18'd1)//9
                begin
                    clk_100hz <= ~clk_100hz;
                    counter_count <= 18'd0;
                end
                else
                    counter_count <= counter_count + 1'b1;
            else
            begin
                clk_100hz <= 1'b0;
                counter_count <= 18'd0;
            end
    end    
    //****************************************************************************************************
    //  模块名称:秒表计时
    //  功能描述:
    //**************************************************************************************************** 
    reg     [3:0]   counter_haomiao_ge;             //秒表计时,毫秒个位数BCD码
    reg     [3:0]   counter_haomiao_shi;            //秒表计时,毫秒十位数BCD码
    reg     [3:0]   counter_miao_ge;                //秒表计时,秒个位数BCD码
    reg     [2:0]   counter_miao_shi;               //秒表计时,秒十位BCD二进制码
    always @(posedge clk_100hz or negedge reset_n)
    begin
        if(reset_n == 1'b0)
        begin
            counter_haomiao_ge <= 4'd0;
            counter_haomiao_shi <= 4'd0;
            counter_miao_ge <= 4'd0;
            counter_miao_shi <= 3'd0;
        end
        else
            if(~start_key_out == 1'b1)//开始信号有效的时候进行计时
                if(counter_haomiao_ge == 4'd9)
                begin
                    counter_haomiao_ge <= 4'd0;
                    if(counter_haomiao_shi == 4'd9)
                    begin
                        counter_haomiao_shi <= 4'd0;
                        if(counter_miao_ge ==4'd9)
                        begin
                            counter_miao_ge <= 4'd0;
                            if(counter_miao_shi == 3'd5)
                            begin
                                counter_miao_shi <= 3'd0;
                            end
                            else
                               counter_miao_shi <= counter_miao_shi + 1'b1;
                        end
                        else
                            counter_miao_ge <= counter_miao_ge + 1'b1;
                    end
                    else
                        counter_haomiao_shi <= counter_haomiao_shi + 1'b1;
                end
                else
                    counter_haomiao_ge <= counter_haomiao_ge + 1'b1;
            else
            begin
                counter_haomiao_ge <= 4'd0;
                counter_haomiao_shi <= 4'd0;
                counter_miao_ge <= 4'd0;
                counter_miao_shi <= 3'd0;
            end
    end 
    //****************************************************************************************************
    //  模块名称:毫秒、秒计数寄存模块
    //  功能描述:
    //****************************************************************************************************        
    reg     [3:0]   reg_haomiao_ge;                 //毫秒个位数BCD码
    reg     [3:0]   reg_haomiao_shi;                //毫秒十位数BCD码
    reg     [3:0]   reg_miao_ge;                    //秒个位数BCD码
    reg     [2:0]   reg_miao_shi;                   //秒十位BCD二进制码
    always @(posedge clk or negedge reset_n)
    begin
        if(reset_n == 1'b0)
        begin
            reg_haomiao_ge <= 4'd9;
            reg_haomiao_shi <= 4'd9;
            reg_miao_ge <= 4'd9;
            reg_miao_shi <= 3'd5;
        end
        else
        begin
            reg_haomiao_ge <= counter_haomiao_ge;
            reg_haomiao_shi <= counter_haomiao_shi;
            reg_miao_ge <= counter_miao_ge;
            reg_miao_shi <= counter_miao_shi;
        end
    end
    //****************************************************************************************************
    //  模块名称:数码管位选择时钟产生模块
    //  功能描述:
    //****************************************************************************************************
    always @(posedge clk or negedge reset_n)//数码管扫描时钟产生进程
    begin
        if(reset_n == 1'b0)
        begin
            count2 <= 14'd0;
            clk_scan <= 1'b0;
        end
        else
            if(count2 == 14'd10000)
            begin
                count2 <= 14'd0;
                clk_scan <= ~clk_scan;//2500Hz的数码管扫描频率时钟信号
            end
            else
                count2 <= count2 + 1'b1;
    end
    //****************************************************************************************************
    //  模块名称:数码管位选择产生信号模块
    //  功能描述:
    //****************************************************************************************************
    always @(posedge clk_scan or negedge reset_n)
    begin 
        if(reset_n == 1'b0)
            select <= 2'b00;
        else
            select <= select + 1'b1;//数码管位选择信号
    end
    //****************************************************************************************************
    //  模块名称:译码电路
    //  功能描述:
    //****************************************************************************************************
    always @(posedge clk or negedge reset_n)
    begin
        if(reset_n == 1'b0)
        begin
            wei <= 8'b11111111;
            duan <= 8'hff;
        end
        else
        begin
            if(select == 2'd0)
            begin
                wei <= 8'b11101111;//毫秒个位数显示
                case(reg_haomiao_ge)
                    4'b0000:duan <= 8'b1100_0000;//0
                    4'b0001:duan <= 8'b1111_1001;//1
                    4'b0010:duan <= 8'b1010_0100;//2
                    4'b0011:duan <= 8'b1011_0000;//3
                    4'b0100:duan <= 8'b1001_1001;//4
                    4'b0101:duan <= 8'b1001_0010;//5
                    4'b0110:duan <= 8'b1000_0010;//6
                    4'b0111:duan <= 8'b1111_1000;//7
                    4'b1000:duan <= 8'b1000_0000;//8
                    4'b1001:duan <= 8'b1001_0000;//9
                    default:duan <= 8'hff;
                endcase
            end
            else if(select == 2'd1)
            begin
                wei <= 8'b11011111;//毫秒十位数显示
                case(reg_haomiao_shi)
                    4'b0000:duan <= 8'b1100_0000;//0
                    4'b0001:duan <= 8'b1111_1001;//1
                    4'b0010:duan <= 8'b1010_0100;//2
                    4'b0011:duan <= 8'b1011_0000;//3
                    4'b0100:duan <= 8'b1001_1001;//4
                    4'b0101:duan <= 8'b1001_0010;//5
                    4'b0110:duan <= 8'b1000_0010;//6
                    4'b0111:duan <= 8'b1111_1000;//7
                    4'b1000:duan <= 8'b1000_0000;//8
                    4'b1001:duan <= 8'b1001_0000;//9
                    default:duan <= 8'hff;
                endcase
            end
            else if(select == 2'd2)
            begin
                wei <= 8'b10111111;//秒个位数显示
                case(reg_miao_ge)
                    4'b0000:duan <= 8'b0100_0000;//0
                    4'b0001:duan <= 8'b0111_1001;//1
                    4'b0010:duan <= 8'b0010_0100;//2
                    4'b0011:duan <= 8'b0011_0000;//3
                    4'b0100:duan <= 8'b0001_1001;//4
                    4'b0101:duan <= 8'b0001_0010;//5
                    4'b0110:duan <= 8'b0000_0010;//6
                    4'b0111:duan <= 8'b0111_1000;//7
                    4'b1000:duan <= 8'b0000_0000;//8
                    4'b1001:duan <= 8'b0001_0000;//9
                    default:duan <= 8'hff;
                endcase
            end

            else if(select == 2'd3)
            begin
                wei <= 8'b01111111;//秒十位数显示
                case(reg_miao_shi)
                    3'b000:duan <= 8'b1100_0000;
                    3'b001:duan <= 8'b1111_1001;
                    3'b010:duan <= 8'b1010_0100;
                    3'b011:duan <= 8'b1011_0000;
                    3'b100:duan <= 8'b1001_1001;
                    3'b101:duan <= 8'b1001_0010;
                    3'b110:duan <= 8'b1000_0010;
                    default:duan <= 8'hff;
                endcase
            end
            else 
            begin
                wei <= 8'b11111111;
                duan <= 8'hff;
            end
        end
    end
endmodule


  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本科生毕业论文(设计)开题报告书 题 目: 基于FPGA的数字秒表设计 学生姓名: *********** 学 号: ********** 专业班级: 自动化******班 指导老师: ************ 2010年 3 月 20 日 论文(设计)题目 ISP技术及其应用研究 课题目的、意义及相关研究动态: 课题设计的主要目的:运用所学的数字电子技术的基本知识和数字电子电路的设计方法,将数字电子技术的基础知识与EDA技术有机地联系起来,EDA电子仿真软件的仿真功能强大,具有完备的文件库,具有选用元器件创建电路、仿真模拟运行电路的功能,并且在输入信号的加入、输出信号的显示上能完全模拟实际和调制过程中的各种波型和操作过程。此类设计需要在EDA仿真软件上仿真进行,并利用下载工具,下载到特定的硬件设备上,进行实时的运行与验证,来证明所设计的电路的正确性。这样把所学到的理论知识综合的运用到一些较复杂的数字逻辑电路系统中去,使我们在实践基本技能方面得到一次全面系统的锻炼;这样可以使我们了解和掌握现代复杂数字系统芯片的设计方法和所用到的EDA工具,为走上社会进入专业的电子技术公司后,能胜任各种电子产品集成化的实际设计工作打下了坚实的基础。 课题的意义:秒表是一种常见的计时工具,种类比较多。这里用EDA技术设计一种基于FPGA 的数字秒表。它可以为用户提供了传统的PLD技术无法达到的灵活性,带来了巨大的时间效益和经济效益,是可编程技术的实质性飞跃。FPGA还是有其具大的优势比如它的高速性。 相关研究动态:现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA 技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。EDA 设计可分为系统级、电路级和物理实现级。 课题的主要内容(观点)、创新之处: 课题设计的主要内容: 1. 设计任务: 设计一个采用六位LED数码管显示分、秒,0.1s,0.01s计时方式的数字秒表。使用按键开关可实现开始/结束计时操作,及复位清零操作。 2.设计要求: 要求:1、设计方案具有合理性、科学性; 2、系统工作稳定可靠; 3、系统抗干扰性能强; 4、系统硬件电路简单、程序结构明晰。 3.系统功能 1. 有启/停开关,用于开始/结束计时操作 2. 秒表计时长度为59.分59.99秒,超过计时长度,有溢出则报警,计时长度可手动设置。 3. 设置复位开关,在任何情况下只要按下复位开关,秒表都要无条件进行复位清0操作。 4. 用FPGA器件实现,用VHDL语言编程,并进行下载,仿真。 创新之处: 利用EDA技术中最为瞩目的在系统可编程技术进行电子系统的设计的创新之处:1、用软件的方式设计硬件;2、用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成;3、设计过程中可用有关软件进行各种仿真;4、系统可现场编程,在线升级;5、整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。
数字秒表是一种常见的计时工具。它通常用于测量时间,计算运动员完成任务所用的时间,也用于科学研究和工程测量等方面。本文将介绍基于FPGA的数字秒表设计。 FPGA是一种可编程逻辑器件,可以在电路板上实现特定功能。数字秒表由数字计时器和显示器组成。数字计时器计算时间,然后将结果转换为显示器可以显示的七段数码显示。因此,数字秒表的设计需要包括两个部分。 首先,设计数字计时器需要确定计时器的精度和计时范围。计时器的精度越高,计时器计算的时间越准确。计时范围决定了计时器能够计算的最长时间。在FPGA上实现计时器可以使用计时器模块,其中包括一个时钟发生器和计数器。时钟发生器发出固定的脉冲,驱动计数器的计数。计时器模块的输出可以是二进制值或BCD码。 其次,设计计算和显示数字秒表所需的数字电路。由于秒表的显示通常使用七段数码管,需要设计数字电路将计时器模块的输出转换为七段数码管所需的信号。这可以通过组合逻辑和时序逻辑的组合来实现。由于FPGA的可编程性,可以轻松地在FPGA上实现数字电路。 综上所述,基于FPGA的数字秒表设计需要确定计时器的精度和计时范围,并设计计算和显示数字秒表所需的数字电路。FPGA的可编程性使得数字电路的设计更加简单,同时提高了数字秒表的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值