FPGA基础实例---数字跑表
发布日期:2021-05-07 17:48:00 浏览次数:25 分类:精选文章

本文共 2584 字,大约阅读时间需要 8 分钟。

数字跑表设计与实现

目录

  • 实例主要内容
  • 实例目标
  • 原理简介
  • 代码分析
  • 1. 实例主要内容

    通过Verilog语言编写一个具有“百分秒、秒、分”计时功能的数字跑表,可以实现一个小时以内精确到百分之一秒的计时。数字跑表的显示可以通过编写数码管显示程序来实现,本实例只给出了数字跑表的实现过程。同时可以增加小时的计时功能,实现完整的跑表功能。

    2. 实例目标

    本实例主要实现计数即进位的设计,通过几个always模块的设计实现一个特定用途的模块-数字跑表。

    3. 原理简介

    本数字跑表首先从最低位的百分秒计数器开始,按照系统时钟进行计数。计数至100后向秒计数器进位,秒计数器以百分秒计数器的进位位为时钟进行计数。计数至60后向分计数器进位,分计数器以秒计数器的进位位为时钟进行计数,读者可以自行增加小时计数器。

    如果使用同一使用系统时钟作为计数时钟,则计数器将是一个6000进制的计数器,而分计数器将是一个3600000进制的计数器。这样将极大的浪费FPGA的逻辑资源。而使用进位位作为计数时钟,只需要一个100进制的计数器和两个60进制的计数器。

    在实际的设计中,为了让计数器更加简单,计数器使用高低位两个计数器实现。100进制计数器分别是高位10进制计数器,低位10进制计数器;60进制计数分别是高位6进制计数器,低位10进制计数器。这样整个数字跑表使用6个计数器实现。

    同时由于10进制计数器重复使用了5次,可以使用独立的模块实现10进制计数器,这样就可以通过模块复用来节省整个模块使用的资源。数字跑表提供清零为CLR和暂停为PAUSE,百分秒的时钟信号可以通过系统时钟分频提供。分频至1/100s,即可实现真实的时间计数。

    4. 代码分析

    首先给出代码中端口信号的定义,可根据这些端口与自己的工程设计连接。

    • CLK:时钟信号
    • CLR:异步复位信号
    • PAUSE:暂停信号
    • MSH、MSL:百分秒的高位和低位
    • SH、SL:秒信号的高位和低位
    • MH、ML:分钟信号的高位和低位

    代码为:

    module paobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);input CLK,CLR;input PAUSE;output [3:0] MSH,MSL,SH,SL,MH,ML;reg [3:0] MSH,MSL,SH,SL,MH,ML;reg cn1,cn2;//cn1为百分秒向秒的进位,cn2位秒向分的进位//百分秒计数模块always @(posedge CLK or negedge CLR)begin    if(!CLR)    begin        MSH <= 4'd0;        MSL <= 4'd0;        cn1 <= 0;    end    else if(!PAUSE)    //PAUSE为0时正常计数,为1时暂停计数    begin        if(MSL == 9)        begin            MSL <= 0;            if(MSH == 9)            begin                MSH <= 0;            //低、高位计数至10时,高位归零            cn1 <= 1;            end            else            begin                MSH <= MSH + 1;            //低位计数至10,高位计数            end        end        else        begin            MSL <= MSL + 1;        //低位计数未至10时,低位计数        cn1 <= 0;        end    endend//秒计数模块always @(posedge cn1 or negedge CLR)begin    if(!CLR)    begin        SH <= 0;        SL <= 0;        cn2 <= 0;    end    else if(SL == 9)    begin        SL <= 0;        if(SH == 5)        begin            SH <= 0;        //低位计数至10,高位计数至6时,高位归零        cn2 <= 1;        end        else        begin            SH <= SH + 1;        //低位计数至10,高位计数未至6时,高位计数        end    end    else    begin        SL <= SL + 1;        //低位计数未至10时,低位计数        cn2 <= 0;    endend//分钟计数模块always @(posedge cn2 or negedge CLR)begin    if(!CLR)    begin        MH <= 0;        ML <= 0;    end    else if(ML == 9)    begin        ML <= 0;        //低位计数至10时,低为归零        if(MH == 5)        begin            MH <= 0;        //低位计数至10,高位计数至6时,高位归零        end        else        begin            MH <= MH + 1;        //低位计数至10,高位计数未至6时,高位计数        end    end    else    begin        ML <= ML + 1;        //低位计数未至10时,低位计数    endendendmodule

    通过上面的这3个模块,即可实现数字跑表的功能。

    补充说明

    可以尝试添加小时计数单元。

    上一篇:FPGA中task和function说明
    下一篇:Altera FPGA基本开发流程

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年03月20日 19时40分39秒