FPGA实战------数码管(1)静态显示

这篇具有很好参考价值的文章主要介绍了FPGA实战------数码管(1)静态显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA实战数码管(1) 静态显示

led的花样点灯差不多了吧,接下来学习另一个基础的东西,数码管。



前言

数码管在FPGA开发板上占得位置不小,在工程开发中也必不可少,比如后边的温度传感器就会用数码管来显示温度。这里先不多介绍温度传感器,过一段时间就会发了。本篇文章先用数码管来做静态显示。也就是六个数码管显示一起显示一个数,一起变化。


一、数码管原理

Cyclone IV开发板中的数码管是共阳极所以数码管中需要给低电平,对应的led段才会亮
位选信号原理图如图所示,位选信号也是需要低电平有效。

fpga实现数码管静态滚动显示频率是1s单号:滚动显示单号;双号:滚动显示双号,FPGA实战,fpga开发,硬件工程
这张图是C4板子上数码管的电路结构,是不是看起来很麻烦,那就先来张简单的:
fpga实现数码管静态滚动显示频率是1s单号:滚动显示单号;双号:滚动显示双号,FPGA实战,fpga开发,硬件工程
从这张图可以看出:数码管一共有八个小led管组成(DP就是小数点)。数码管就是通过控制每一段led的亮灭来控制显示的数字。

例如:当想让数码管显示零的时候,也就是A/B/C/D/E/F亮,G/DP灭。所以ZERO = 8'b1100_0000;
其中11就是指G/DP没有亮,其他的0都是点亮的led,就由这种亮灭情况,来显示相应的数字。

这里大家可以去想一想其他数字怎么写亮灭才能显示出来。

二、位选、段选

1.位选信号:

位选信号就是挑选六个数码管中的哪个来显示的信号。当选到这个数码管的时候,该数码管才会亮。
上边己经说过:

位选信号原理图如图所示,位选信号也是需要低电平有效。

咱这里让六个数码管一块亮一块灭,所以位选信号的六位同时变化就行。

//------------------------<位选信号>---------------------------

reg  [5:0] sel_r       ;//位选信号寄存

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        sel_r <= 6'b111_111 ;//复位时全灭
    end
    else if(end_cnt_1s)begin
        sel_r <= 6'b111_111 ;
    end
    else begin
        sel_r <= ~sel_r ;//全亮
    end
end

2.段选信号:

段选信号就是上边数码管那张图,一共八段led,怎么选择哪一段亮灭,就是段选信号该做的。

数码管中需要给低电平,对应的led段才会亮

下面的代码就是从0-F段选该怎么选择亮灭显示相应的数。

//-------------------------<段选信号参数>------------------------------
parameter       ZERO   = 8'b1100_0000 ,
                ONE    = 8'b1111_1001 ,
                TWO    = 8'b1010_0100 ,
                THREE  = 8'b1011_0000 ,
                FOUR   = 8'b1001_1001 ,
                FIVE   = 8'b1001_0010 ,
                SIX    = 8'b1000_0010 ,
                SEVEN  = 8'b1111_1000 ,
                EIGHT  = 8'b1000_0000 ,
                NINE   = 8'b1001_0000 ,
                NUM_A  = 8'b1000_1000 ,
                NUM_B  = 8'b1000_0011 ,
                NUM_C  = 8'b1100_0110 ,
                NUM_D  = 8'b1010_0001 ,
                NUM_E  = 8'b1000_0110 ,
                NUM_F  = 8'b1000_1110 ;

下面就是用了一个case语句整理数码管显示的数字。
0-F 一共16位,所以这里用5位宽的cnt_num来控制数码管的16次数字显示。
然后用dig段选与相应的cnt_num的值对应,让数码管“知道”该在啥时候显示啥数字。

//------------------------<cnt_num>---------------------------

reg  [4:0] cnt_num     ;//数码管显示的数字

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_num <= 0 ;
    end
    else if((cnt_num == 5'd15)&&(end_cnt_1s))begin
        cnt_num <= 0 ;//计满归零
    end
    else if(end_cnt_1s)begin
        cnt_num <= cnt_num + 1 ;//每秒加一
    end
    else begin
        cnt_num <= cnt_num ;
    end
end

//------------------------<段选信号>---------------------------

reg  [7:0] dig_r       ;//段选信号寄存

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        dig_r <= ZERO ;//复位归零
    end
    else begin
        case (cnt_num)
            5'd0  : dig_r <= ZERO   ; 
            5'd1  : dig_r <= ONE    ; 
            5'd2  : dig_r <= TWO    ; 
            5'd3  : dig_r <= THREE  ; 
            5'd4  : dig_r <= FOUR   ; 
            5'd5  : dig_r <= FIVE   ; 
            5'd6  : dig_r <= SIX    ; 
            5'd7  : dig_r <= SEVEN  ; 
            5'd8  : dig_r <= EIGHT  ; 
            5'd9  : dig_r <= NINE   ; 
            5'd10 : dig_r <= NUM_A  ; 
            5'd11 : dig_r <= NUM_B  ; 
            5'd12 : dig_r <= NUM_C  ; 
            5'd13 : dig_r <= NUM_D  ;
            5'd14 : dig_r <= NUM_E  ;
            5'd15 : dig_r <= NUM_F  ;   
            default: dig_r <= ZERO  ;
        endcase
    end
end

三、代码

1、静态显示

对了,这里sel和dig是因为在模块信号列表中给sel和dig定义为wire信号,为了用时序逻辑赋值,就分别定义了reg类型的信号。
如果嫌麻烦就在信号列表里定义为reg信号就行。这里给wire、reg类型还不太了解的同学解释一下。加油,迟早会明白的。

/**************************************功能介绍***********************************
Date	: 2023年9月30日 20:33:26
Author	: Yang.
Project : 数码管静态显示
Require : 数码管全显,从1-F轮流显示
*********************************************************************************/
module seg_dynamic (
    input         clk      ,
    input         rst_n    ,
    output [5:0]  sel      ,
    output [7:0]  dig      
);

parameter       ZERO   = 8'b1100_0000 ,
                ONE    = 8'b1111_1001 ,
                TWO    = 8'b1010_0100 ,
                THREE  = 8'b1011_0000 ,
                FOUR   = 8'b1001_1001 ,
                FIVE   = 8'b1001_0010 ,
                SIX    = 8'b1000_0010 ,
                SEVEN  = 8'b1111_1000 ,
                EIGHT  = 8'b1000_0000 ,
                NINE   = 8'b1001_0000 ,
                NUM_A  = 8'b1000_1000 ,
                NUM_B  = 8'b1000_0011 ,
                NUM_C  = 8'b1100_0110 ,
                NUM_D  = 8'b1010_0001 ,
                NUM_E  = 8'b1000_0110 ,
                NUM_F  = 8'b1000_1110 ;

//------------------------<计时器>---------------------------
parameter       MAX_1S = 26'd50_000_000 ;

reg   [25:0] cnt_1s      ;//1s计数器
wire         add_cnt_1s  ;
wire         end_cnt_1s  ;

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_1s <= 0 ;
    end
    else if(add_cnt_1s)begin
        if(end_cnt_1s)begin
            cnt_1s <= 0 ;
        end
        else begin
            cnt_1s <= cnt_1s + 1 ;
        end
    end
end

assign add_cnt_1s = 1'b1 ;
assign end_cnt_1s = add_cnt_1s && cnt_1s == MAX_1S - 1 ;

//------------------------<位选信号>---------------------------

reg  [5:0] sel_r       ;//位选信号寄存

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        sel_r <= 6'b111_111 ;//复位时全灭
    end
    else if(end_cnt_1s)begin
        sel_r <= 6'b111_111 ;
    end
    else begin
        sel_r <= ~sel_r ;//全亮
    end
end

//------------------------<cnt_num>---------------------------

reg  [4:0] cnt_num     ;//数码管显示的数字

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_num <= 0 ;
    end
    else if((cnt_num == 5'd15)&&(end_cnt_1s))begin
        cnt_num <= 0 ;//计满归零
    end
    else if(end_cnt_1s)begin
        cnt_num <= cnt_num + 1 ;//每秒加一
    end
    else begin
        cnt_num <= cnt_num ;
    end
end

//------------------------<段选信号>---------------------------

reg  [7:0] dig_r       ;//段选信号寄存

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        dig_r <= ZERO ;//复位归零
    end
    else begin
        case (cnt_num)
            5'd0  : dig_r <= ZERO   ; 
            5'd1  : dig_r <= ONE    ; 
            5'd2  : dig_r <= TWO    ; 
            5'd3  : dig_r <= THREE  ; 
            5'd4  : dig_r <= FOUR   ; 
            5'd5  : dig_r <= FIVE   ; 
            5'd6  : dig_r <= SIX    ; 
            5'd7  : dig_r <= SEVEN  ; 
            5'd8  : dig_r <= EIGHT  ; 
            5'd9  : dig_r <= NINE   ; 
            5'd10 : dig_r <= NUM_A  ; 
            5'd11 : dig_r <= NUM_B  ; 
            5'd12 : dig_r <= NUM_C  ; 
            5'd13 : dig_r <= NUM_D  ;
            5'd14 : dig_r <= NUM_E  ;
            5'd15 : dig_r <= NUM_F  ;   
            default: dig_r <= ZERO  ;
        endcase
    end
end

assign sel = sel_r ;
assign dig = dig_r ;



endmodule

2.仿真代码

`timescale 1ns/1ns
    
module tb_seg_dynamic();

//激励信号定义 
    reg				tb_clk  	;
    reg				tb_rst_n	;

//输出信号定义	 
    wire	[5:0]		seg_sel	;
    wire	[7:0]		seg_dig ;

//时钟周期参数定义	
    parameter		CLOCK_CYCLE = 20;   

//参数重新定义
    defparam u_seg_dynamic.MAX_1S = 100;

//模块例化
    seg_dynamic  u_seg_dynamic( 
    /*input				    */.clk		(tb_clk    ),
    /*input				    */.rst_n	(tb_rst_n  ),
    /*output		[5:0]	*/.sel	    (seg_sel),//位选
    /*output		[7:0]	*/.dig	    (seg_dig) //段选
);	

//产生时钟
    initial 		tb_clk = 1'b0;
    always #(CLOCK_CYCLE/2) tb_clk = ~tb_clk;

//产生激励
    initial  begin 
        tb_rst_n = 1'b1;

        #(CLOCK_CYCLE*2);
        tb_rst_n = 1'b0;
        #(CLOCK_CYCLE*20);
        tb_rst_n = 1'b1;

        #(CLOCK_CYCLE*10000);
        $stop;

    end

endmodule 

总结

1、仿真结果

fpga实现数码管静态滚动显示频率是1s单号:滚动显示单号;双号:滚动显示双号,FPGA实战,fpga开发,硬件工程
从图中可以看出,数码管的位选信号同时变化且符合变化条件,段选信号也符合变化条件,合理且成功。

2、上板效果

FPGA数码管静态显示

数码管基础还是很简单的,接下来就是动态显示,然后就可以制作一个万能模版,以后有哪里用到,就直接套用模版。文章来源地址https://www.toymoban.com/news/detail-762537.html

到了这里,关于FPGA实战------数码管(1)静态显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

    数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显示)。 八段数码管是一个八字型数码管,分为八段:a、b、c、d、e、f、g、dp,其中dp为小数点,每一段即

    2024年02月08日
    浏览(115)
  • 【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之数码管静态显示(四)

      本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开发平台)简介 盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板

    2024年02月10日
    浏览(47)
  • 静态数码管——FPGA

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 六位数码管全选,每间隔0.5s轮流显示0~F。 静态与动态数码管: 静态数码管 : 在静态显示中,只考虑段选信号。在不同的时刻,各个位选信号保持不变,并根据真值表,选择要显示的数字或者字母。 动态数码管 :

    2024年02月16日
    浏览(42)
  • FPGA——静态数码管

    quartus 18.1 modelsim vscode Cyclone IV开发板 我们使用的数码管是8段数码管,每段是由led组成。通过控制每段led的亮灭,来控制数码管显示不同的数字和字母。 数码管分为共阴极和共阳极,共阳极数码管如图所示,a—dp为输入端,全部在二极管的负极,二极管的正极极共同接+5v(高电

    2024年02月16日
    浏览(37)
  • FPGA_数码管显示

    一位数码管: 数码管等效电路(共阴极 和 共阳极) 数码管显示的值: 假设我们需要b,c亮,我们只需要给b,c接高电平,其他接低电平就可。 seg[7:0]  = 8\\\'b0000_0110 对于数码管显示的值,seg值如下图: 多位数码管-----如下图(以3位为例) 假设现在需要LED1亮,那么就让sel0为1,

    2024年01月23日
    浏览(47)
  • FPGA学习—数码管显示

    数码管动态显示采用了人眼暂存的原理,即时分复用,在数码管实现动态显示。 整个实验设计流程框架如下图所示: 开发板采用共阳极数码管,即低电平点亮。 本实验准备设计一个定时器,6为数码管显示24小时制的时间,所以编写一个计数模块。 改变变量COUNT的数值,可实

    2024年02月09日
    浏览(42)
  • Intel FPGA:数码管显示

    个人说明: 限于时间紧迫以及作者水平有限,本文错误、疏漏之处恐不在少数,恳请读者批评指正。意见请留言或者发送邮件至:“Email:noahpanzzz@gmail.com” 。 本博客的工程文件均存放在:GitHub:https://github.com/panziping。 本博客的地址:CSDN:https://blog.csdn.net/ZipingPan 。 参考: 芯

    2024年04月15日
    浏览(37)
  • 【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display

    写在前面: 本章主要内容为理解七点数码管显示的概念,并使用 Verilog 实现。生成输入信号后通过仿真确认各门的动作,通过 FPGA 检查在 Verilog 中实现的电路的操作。 七段数码管是利用多重输出功能的非常有用的元件。该元件用于字符化,如十进制、十六进制数等。适当配

    2024年02月02日
    浏览(47)
  • [FPGA 学习记录] 数码管动态显示

    数码管动态显示 在上一小节当中,我们对数码管的静态显示做了一个详细的讲解;但是如果单单只掌握数码管的静态显示这种显示方式是远远不够的,因为数码管的静态显示当中,被选中的数码位它们显示的内容都是相同的,这种显示方式在我们的实际应用当中显然是不合适

    2024年02月04日
    浏览(50)
  • FPGA基础设计之数码管显示

    数码管是一种半导体发光器件,其基本单元是发光二极管。一般分为七段数码管和八段数码管,多的一段是小数点。也有其他如N型、米型数码管以及16段、24段管等。本次设计的是八段数码管 公阴极数码管高电平亮,公阳极数码管低电平亮。AC620上搭载的是公阳极数码管。 数

    2023年04月26日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包