首页 > 其他分享 >基于EP4CE6F17C8的FPGA单数码管秒计数实例

基于EP4CE6F17C8的FPGA单数码管秒计数实例

时间:2024-03-21 21:44:38浏览次数:32  
标签:count FPGA 端口 EP4CE6F17C8 seg 数码管 模块

一、电路模块

本例的电路模块与“基于EP4CE6F17C8的FPGA数码管动态显示实例”中的完全一样,此处就不再给出了。

二、实验代码

本例实现1个数码管循环显示字符1~F,显示间隔为1秒,代码使用Verilog编写,采用例化的形式,共有三个文件。

先编写数码管实现显示字形解码的程序,模块名称为seg_decode,文件名称为seg_decode.v,代码如下。

module seg_decode(
    input[3:0]  char_val,             //显示的字形,可显示0~F十六个字形,所以需要4位
    output reg[7:0] seg7              //字形编码,包含小数点,共8位
);

always@(*)                            //敏感信号为所有输入量
begin
    case(char_val)
        4'd0:seg7 <= 8'b1100_0000;    //字形0的编码
        4'd1:seg7 <= 8'b1111_1001;    //字形1的编码
        4'd2:seg7 <= 8'b1010_0100;    //字形2的编码
        4'd3:seg7 <= 8'b1011_0000;    //字形3的编码
        4'd4:seg7 <= 8'b1001_1001;    //字形4的编码
        4'd5:seg7 <= 8'b1001_0010;    //字形5的编码
        4'd6:seg7 <= 8'b1000_0010;    //字形6的编码
        4'd7:seg7 <= 8'b1111_1000;    //字形7的编码
        4'd8:seg7 <= 8'b1000_0000;    //字形8的编码
        4'd9:seg7 <= 8'b1001_0000;    //字形9的编码
        4'ha:seg7 <= 8'b1000_1000;    //字形A的编码
        4'hb:seg7 <= 8'b1000_0011;    //字形B的编码
        4'hc:seg7 <= 8'b1100_0110;    //字形C的编码
        4'hd:seg7 <= 8'b1010_0001;    //字形D的编码
        4'he:seg7 <= 8'b1000_0110;    //字形E的编码
        4'hf:seg7 <= 8'b1000_1110;    //字形F的编码
        default:seg7 <= 7'b111_1111;  //默认不显示
    endcase
end
endmodule

接下来编写秒计数程序,模块名称为count_m16,文件名称为count_m16.v,代码如下。

module count_m16(
      input          clk,                  //板载50HMz系统时钟
      input          rst,                  //复位按键
      input          en,                   //计数使能位 
      output reg[3:0]data                  //计数值,从0~F共16位,所以用4位
);

always@(posedge clk or negedge rst)       //敏感信号为时钟上沿或复位下沿
begin
    if(rst == 0)                          //低电平复位
        data <= 4'd0;                     //复位时计数值清零
    else if(en)                           //如果计数使能,则执行计数,否则保持上一次的值不变
    begin
        if(data == 4'd15)                 //如果计数到达F时,
            data <= 4'd0;                 //计数值清零
        else
            data <= data + 4'd1;           //否则计数值加1
    end
end
endmodule

最后编写数码管显示程序,并设置为顶层模块,模块名称为seg_count,文件名称为seg_count.v,代码如下。

module seg_count(
    input clk,                            //板载50HMz系统时钟
    input rst,                            //复位按键
    output [7:0] seg,                     //段码端口
    output bit                            //位选端口
);
assign bit = 1'b0;                        //点亮数码管
reg [25:0] cnt;                           //定义26位时钟计数器
reg sec;                                  //定义秒信号
always@(posedge clk or negedge rst)       //敏感信号为时钟上沿或复位下沿
begin
    if(rst == 0)                          //低电平复位时秒计数清零
    begin
        sec <= 1'b0;
    end
    else if(cnt == 26'd49_999_999)        //时钟计数器到达1秒时
    begin
        cnt <= 26'd0;                     //时钟计数器清零
        sec <= 1'b1;                      //产生秒信号
    end
    else
    begin
        sec <= 1'b0;                      //否则秒信号清零
        cnt <= cnt + 26'd1;               //时钟计数器加1,即来一次时钟脉冲加一次
    end
end
wire [3:0] count_data;                    //定义显示的值
//下面例化1个秒计数单元
count_m16 U0(.clk(clk), .rst(rst), .en(sec), .data(count_data));
//下面例化1个字形解码单元
seg_decode S0(.char_val(count_data), .seg7(seg));
endmodule

三、代码说明

1、count_m16模块主要负责十六进制计数,在系统时钟的同步下,来一个en脉冲计一次数,计满后回零。计数的快慢取决于en端口输入的脉冲周期,产生的计数值则通过data端口向外输出。
2、seg_decode模块主要负责计数值到字形码的解码(转换),通过char_val端口向内输入计数值,转换成字形编码后通过seg7端口向外输出。
3、seg_count模块为顶层模块,负责产生秒时钟信号(即en脉冲),通过例化十六进制计数单元,把秒信号en传入,之后获得按秒变化的计数值count_data。同时通过例化数码管字形解码单元,把计数值count_data传入,之后获得字形编码seg7。最终获取的字形编码通过顶层的seg端口连接到数码管段码引脚,最低位数码管的位选引脚直接连接到低电平点亮。
4、元件例化是EDA设计中一种常用的手段,有点类似C语言中的函数调用,但它例化出来的是逻辑元器件。通过例化不仅能产生出实体元件,还能通过端口名关联的方式与外部进行连接,从而实现信号的输入和输出。

四、实验步骤

FPGA开发的详细步骤请参见“基于EP4CE6F17C8的FPGA开发流程(以半加器为例)”一文,本例只对不同之处进行说明。

本例工程放在D:\EDA_FPGA\Exam_4文件夹下,工程名称为Exam_4。有三个模块文件,一个名称为seg_count.v,设置为顶层实体,另外两个名称分别为seg_decode.v和count_m16.v,用于提供例化。其余步骤与“基于EP4CE6F17C8的FPGA开发流程”中的一样。

接下来看管脚约束,本例中只用到了最低位的1个数码管,一共有9个引脚,再加上时钟晶振和复位按钮,一共11个。具体的端口分配如下图所示。

对于未用到的引脚设置为三态输入方式,多用用途引脚全部做为普通I/O端口,电压设置为3.3-V LVTTL(与”基于EP4CE6F17C8的FPGA开发流程“中的一样)。需要注意,程序中的每个端口都必须为其分配管脚,如果系统中存在未分配的I/O,软件可能会进行随机分配,这将造成不可预料的后果,存在烧坏FPGA芯片的风险。

接下来对工程进行编译,编译完成后,可查看一下逻辑器件的消耗情况,如下图所示。

另外,还可以点击菜单Tools->Netlist Viewers->RTL Viewer,查看一下生成的RTL电路图,如下图所示。

最后进行程序下载,并查看结果。下面是数码管动态显示秒计数图片的其中几张。

…………

标签:count,FPGA,端口,EP4CE6F17C8,seg,数码管,模块
From: https://www.cnblogs.com/fxzq/p/18078512

相关文章

  • m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
    1.算法仿真效果本系统进行Vivado2019.2平台的开发,测试结果如下所示:   2.算法涉及理论知识概要       电子钟是现代生活中常见的计时工具,其准确性和功能性不断提高。基于FPGA的电子钟设计不仅具有灵活的可定制性,还能通过集成其他功能(如闹钟)来增强实用性。Verilog......
  • DSP,STM32,ARM,51单片机,FPGA相关解释
    搞嵌入式,物联网相关的朋友们可能将这些硬件的一些技术栈混淆,本文将大致对此进行梳理:对比ARM与其他架构ARM架构的优势在于它的高能效比,这使得它非常适合于移动设备和嵌入式系统。与之相比,例如x86架构更常见于个人电脑和服务器中,它们通常追求更高的性能,能耗问题不是首要考虑。......
  • FPGA之串口接收数据(看注释)
    兜兜转转看了好多家视频和好几本书,明白了FPGA难学的原因之一是因为讲的好(我觉得就是很详细,告诉你为什么这么来写代码)的视频比较少,之前看到的那本书其实也很好,只是没有说为什么这么写,以及某些步骤的用意,这次看了野火的视频,发现挺符合我的需求,他们视频和我借的那本书思路是相同的,野......
  • FPGA入门笔记008——数码管动态扫描设计与验证
    #FPGA入门笔记008——数码管动态扫描设计与验证1、数码管动态扫描原理​ 8段数码管的结构图如图1所示:图1——8段数码管结构图(a为共阴极,b为共阳极)​ 对于共阴数码管需要给对应段以高电平才会使其点亮,而对于共阳极数码管则需要给低电平才会点亮。AC620上板载的是共阳极数......
  • FPGA通过I2C控制AT24C64
    文章目录前言一、代码设计框图二、IIC_drive模块设计2.1、模块接口:2.2、代码功能描述:2.3、IIC协议实现过程:三、EEPROM_ctrl模块设计3.1、模块接口:3.2、代码功能描述四、EEPROM_drive模块五、iic_top模块前言继上一篇FPGA学习_I2C总线协议内容,本文将基于FPGA通过I2......
  • 锁相环技术原理及FPGA实现(第四章4.1)
            经过前面几章的学习,我们已积累了设计锁相环电路的一些基本技能。根据作者的学习经验,这个阶段最期望的一定不是再去理解什么原理公式,学习什么方法思路。好比初次接触到羽毛球时,在网上看了一段中规中矩的教学视频,又刚好买回一支炫丽的球拍,走进球场,实在没有心情......
  • FPGA设计优化(3.7)
            设计规则1:对综合后的设计就要开始进行扇出分析,以尽早发现高扇出的网线,并评估其可能对设计造成的影响。report_high_fanout_nets的具体用法如Tcl代码9-1所示。代码第3行的选项-load_types生成的报告样例如图9-1所示。从此报告中可以看到网线rectify_reset的扇出......
  • STM32 TIM3 定时器应用之数码管显示定时时间
     实现目标1、STM32基于HAL库定时器的使用;2、加强数码管的学习。一、定时器概述?1、生活中哪些场景会用到定时器?2、STM32F1定时器二、原理图设计三、STM32CubeMX配置1.定时器时钟配置2.定时器3、数码管、蜂鸣器的配置  3.开启定时器3中断四、程序......
  • libtorch实现一个数码管数字识别网络
    这里的数字范围是0~9共10个数字,用5×3的数字矩阵表示,把它当成图像那么可以看成5×3的图片。如下图中的数字0,用“1”代表有颜色(亮),“0”代表没颜色(灭)。网络是经典的BP神经网络,15个输入,10个输出。当输入是形状“0”时,输出索引为0的数字最大接近于1;当输入是形状“1”时,输出索引为1的......
  • FPGA静态时序分析与约束(二)、时序分析
    系列文章目录FPGA静态时序分析与约束(一)、理解亚稳态FPGA静态时序分析与约束(三)、读懂vivado时序报告文章目录系列文章目录前言一、时序分析基本概念1.1时钟抖动1.2时钟偏斜1.3时钟不确定性Uncertainty1.4建立时间和保持时间1.5启动沿和锁存沿二、时序分析基本步......