FPGA之数码管静态显示

该文介绍了数码管的基本概念,包括常见类型和连接方式,并详细阐述了一个基于FPGA的数码管显示程序设计,包括系统框图、顶层模块(含计时器和数码管显示子模块)以及相应的Verilog代码实现。数码管显示通过计数器每0.5秒更新一次,依次显示0到F的十六进制数。
摘要由CSDN通过智能技术生成

一、数码管介绍

1、常见数码管:

 2、数码管连接方式:

LED数码管结构与工作原理__会飞_的鱼的博客-CSDN博客_数码管工作原理

 3、共阴、共阳数码管真值表

 4、驱动方式:

二、程序设计

1、系统框图:

 2、顶层模块

      2个子模块:计时器模块、数码管显示模块

3、代码

 顶层文件:

module seg_led_top (
  input sys_clk,
  input sys_rst_n,
  
  output [5:0]    sel,    //数码管位选定义
  output [7:0]    seg_led //数码管段选定义


);

parameter  TIME_SHOW = 25'd25000_000;  //数码管变化的时间间隔0.5s
wire  add_flag;  //数码管变化的通知信号

//每隔0.5s产生一个时钟周期的脉冲信号
time_count #(.MAX_NUM(TIME_SHOW))
 u_time_count(
    .clk    (sys_clk),
    .rst_n  (sys_rst_n),
    
    .flag   (add_flag)
 );
 
//每当脉冲信号到达时,使数码管显示数量+1
seg_led u_seg_led(
     .clk   (sys_clk),
     .rst_n  (sys_rst_n),
     
     .add_flag   (add_flag),
     .sel        (sel),
     .seg_led    (seg_led)
);
 
 
endmodule

计数器主代码

module time_count(
    input clk,
    input rst_n,

    output reg flag
);
parameter MAX_NUM =25000_000;

reg [24:0] cnt;

always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        flag <= 1'b0;
        cnt <= 24'b0;
      end
      else if(cnt < MAX_NUM - 1'b1) begin
         cnt <= cnt + 1'b1;
         flag <= 1'b0;
        end
      else begin
         cnt <= 24'b0;
         flag <= 1'b1;
       end
end
endmodule
     

数码管主代码

module seg_led(
  input clk,
  input rst_n,
  
  input add_flag,
  output reg [5:0]    sel,    //数码管位选定义
  output reg [7:0]    seg_led //数码管段选定义
);
reg [3:0] num;      //数码管显示的十六进制数

//控制数码管位选信号(低电平有效),选中所有的数码管
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n)
      sel <= 6'b111111;
     else
      sel <= 6'b000000;
 end

//每当通知信号到达时,数码管显示的十六进制数+1
always @ (posedge clk or negedge rst_n) begin
     if(!rst_n)
        num <= 4'h0;
     else if (add_flag) begin
         if (num < 4'hf)
             num <= num + 1'b1;//累加
           else
             num <= 4'h0;//清零
       end
       else
          num <= num;
end

//根据数码管显示的数值,控制段选信号
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n)
       seg_led <= 8'b0;
     else begin
       case (num)
          4'h0 :  seg_led <= 8'b1100_0000;
          4'h1 :  seg_led <= 8'b1111_1001;
          4'h2 :  seg_led <= 8'b1010_0100;
          4'h3 :  seg_led <= 8'b1011_0000;
          4'h4 :  seg_led <= 8'b1001_1001;
          4'h5 :  seg_led <= 8'b1001_0010;
          4'h6 :  seg_led <= 8'b1000_0010;
          4'h7 :  seg_led <= 8'b1111_1000;
          4'h8 :  seg_led <= 8'b1000_0000;
          4'h9 :  seg_led <= 8'b1001_0000;
          4'ha :  seg_led <= 8'b1000_1000;
          4'hb :  seg_led <= 8'b1000_0011;
          4'hc :  seg_led <= 8'b1100_0110;
          4'hd :  seg_led <= 8'b1010_0001;
          4'he :  seg_led <= 8'b1000_0110;
          4'hf :  seg_led <= 8'b1000_1110;
          default : seg_led <= 8'b1100_0000;
         endcase
       end
end
endmodule

       

三、视频演示

FPGA之数码管静态显示

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值