EGo1下板_数码管动态显示

本文介绍了一种使用分时复用技术减少FPGA芯片IO端口数量的方法,通过扫描显示方案驱动多个数码管。文章详细解释了该技术的工作原理,并提供了一个具体的Verilog代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 分时复用

  • 单个数码管的显示电路中,每个数码管都需要有7个LED管和1个小圆点,需要8个IO端口。
  • 为了减少实际使用的FPGA芯片的IO端口,可采用分时复用的扫描显示方案进行数码管驱动。分时复用的扫描显示利用了人眼的视觉暂留特性,如果公共端控制信号的刷新速度足够快,人眼就分辨不出LED的闪烁,认为数码管时同时点亮的。控制信号的最佳刷新频率为1000Hz左右
  • 以四个数码管显示为例,采用扫描显示方案进行驱动时,四个数码管的8个段码并接在一起,再以4个IO分别控制每个数码管的公共端,动态点亮数码管。这样只用12个IO口就可以实现4个数码管的显示控制,比静态显示方法的32个IO口数量少多了。

位选信号:用于控制哪个数码管亮;
段选信号:用于控制数码管显示的内容;

2. 代码

module top_led_dynamic(
    output  reg    [7:0]    seg,	// 数码管的公共段选信号
    output  reg    [3:0]    an,		// 作为4个数码管的位选信号
    
    input   wire            clk,
    input   wire            rst,
    input   wire    [3:0]   in3, in2, in1, in0
    );
    	// EGo1数码管是共阴极的,需要连接高电平,对应位置被点亮
	   parameter   _0 = ~8'hc0;
	   parameter   _1 = ~8'hf9;
	   parameter   _2 = ~8'ha4;
	   parameter   _3 = ~8'hb0;
	   parameter   _4 = ~8'h99;
	   parameter   _5 = ~8'h92;
	   parameter   _6 = ~8'h82;
	   parameter   _7 = ~8'hf8;
	   parameter   _8 = ~8'h80;
	   parameter   _9 = ~8'h90;
	   parameter   _a = ~8'h88;
	   parameter   _b = ~8'h83;
	   parameter   _c = ~8'hc6;
	   parameter   _d = ~8'ha1;
	   parameter   _e = ~8'h86;
	   parameter   _f = ~8'h8e;
	   parameter   _err = ~8'hcf;
	   
	   parameter   N = 18;
    
       
    reg     [N-1 : 0]  regN; 
    reg     [3:0]       hex_in;
    
    always @ (posedge clk or posedge rst)   begin
        if (rst == 1'b0)    begin
            regN    <=  0;
        end else    begin
            regN    <=  regN + 1;
        end
    end
    // regN实现对100MHz的系统时钟的2^16分频
    always @ (*)    begin
        case (regN[N-1: N-2])
            2'b00:  begin
                an  <=  4'b0001;
                hex_in  <=  in0;
            end
            2'b01:  begin
                an  <=  4'b0010;
                hex_in  <=  in1;
            end
            2'b10:  begin
                an  <=  4'b0100;
                hex_in  <=  in2;
            end
            2'b11:  begin
                an  <=  4'b1000;
                hex_in  <=  in3;
            end
            default:    begin
                an  <=  4'b1111;
                hex_in  <=  in3;
            end
        endcase
    end
    
    always @ (*)    begin
        case (hex_in)
            4'h0:   seg <=  _0;
            4'h1:   seg <=  _1;
            4'h2:   seg <=  _2;
            4'h3:   seg <=  _3;
            4'h4:   seg <=  _4;
            4'h5:   seg <=  _5;
            4'h6:   seg <=  _6;
            4'h7:   seg <=  _7;
            4'h8:   seg <=  _8;
            4'h9:   seg <=  _9;
            4'ha:   seg <=  _a;
            4'hb:   seg <=  _b;
            4'hc:   seg <=  _c;
            4'hd:   seg <=  _d;
            4'he:   seg <=  _e;
            4'hf:   seg <=  _f;
            default:seg <=  _err;
        endcase
    end
            
endmodule

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>我们正在处理用户关于FPGA EGO1开发数码管使用方法的询问。根据之前的引用[1],用户可能是在尝试实现学号滚动显示,并且已经有一个Verilog代码示例。因此,我们的回答应该围绕如何使用EGO1开发上的数码管,特别是如何控制8个7段数码管进行滚动显示。由于引用中提到了一个具体的代码示例(学号滚动显示),我们可以以此为基础进行说明,但需要确保我们的回答是通用的,以便用户能够理解数码管的基本使用方法。步骤:1.了解EGO1开发数码管硬件连接:通常,数码管是动态扫描的,即通过位选(选择哪个数码管亮)和段选(显示什么字符)来控制。2.解释动态扫描的原理:由于数码管较多,为了节省IO,通常采用动态扫描方式,即快速轮流点亮每一个数码管,利用人眼的视觉暂留效应。3.给出一个基本的Verilog代码框架,包括:-时钟分频模块(用于产生扫描时钟,如1kHz)-数码管位选计数器(循环选择0到7)-根据位选输出对应的段选数据(需要将显示数据转换为7段码)4.针对滚动显示,可以解释如何实现滚动效果:通常是通过移位显示数据缓冲区来实现。注意:引用中提供的链接可能包含具体代码,但我们不能直接引用外部链接,而是给出核心思路和代码片段。因此,我们将按照以下结构回答:1.数码管工作原理2.EGO1开发数码管连接方式(根据常见情况,具体引脚可能需查手册,但这里给出一般方法)3.Verilog代码设计(分模块讲解)4.滚动显示的实现方法5.注意事项同时,根据用户指令,需要生成相关问题。注意:由于用户指令要求使用中文,并且数学公式用$...$,但我们这里主要是硬件描述,可能涉及到的数字直接用文本表示即可,不需要数学公式。但如果有涉及计算(如分频系数),则使用行内公式。开始回答:</think>### FPGA EGO1 开发数码管使用方法 EGO1开发搭载了8个共阳极7段数码管,采用**动态扫描**方式工作。核心原理是通过快速轮询点亮单个数码管(每秒60Hz以上),利用人眼视觉暂留效应实现稳定显示。以下是关键步骤: #### 一、硬件连接原理 1. **段选信号 (Seg)**: 控制显示形状(a-g+dp共8段) $$ \text{Seg} = \{dp, g, f, e, d, c, b, a\} $$ 2. **位选信号 (An)**: 控制8个数码管的使能(低电平有效) $$ \text{An}[7:0] = \{\text{AN7}, \text{AN6}, \dots, \text{AN0}\} $$ 3. **电路特性**: - 需外接限流电阻(EGO1已集成) - 扫描频率计算: $$ f_{\text{scan}} \geq 8 \times 60\text{Hz} = 480\text{Hz} $$ #### 二、Verilog控制代码框架 ```verilog module seg_display( input clk, // 基础时钟 (100MHz) output reg [7:0] an, // 位选信号 output reg [7:0] seg // 段选信号 ); // 1. 时钟分频(产生2ms扫描周期) reg [15:0] cnt; always @(posedge clk) cnt <= cnt + 1; wire scan_clk = cnt[15]; // 100MHz / 2^16 ≈ 1526Hz // 2. 位选计数器(0-7循环) reg [2:0] sel; always @(posedge scan_clk) sel <= sel + 1; // 3. 位选译码 always @(*) begin an = 8'b1111_1111; // 默认关闭所有 an[sel] = 1'b0; // 使能当前位 end // 4. 段选数据生成(示例:显示数字"5") always @(*) begin case(sel) 0: seg = 8'b0010_0100; // 5的7段码 // 其他位数据... endcase end endmodule ``` #### 三、滚动显示实现 1. **数据缓冲区**:创建16字符的移位寄存器 ```verilog reg [127:0] data_buf = "HEULJY2019040509"; ``` 2. **定时移位**:每0.5秒左移4位(1字符) ```verilog always @(posedge sec_clk) data_buf <= {data_buf[123:0], data_buf[127:124]}; ``` 3. **动态映射**:将缓冲区数据映射到8个显示位 ```verilog wire [31:0] disp_data = data_buf[sel*4 +: 32]; // 当前4字符 ``` #### 四、Vivado操作步骤 1. **引脚分配**(参考EGO1手册): - 位选:`an[0]` → `J17`, `an[1]` → `J18`, ... - 段选:`seg[0]` → `T9` (a段), `seg[1]` → `R9` (b段), ... 2. **下载验证**: ```tcl launch_runs impl_1 -to_step write_bitstream open_hw; program_hw_device ``` > **注意事项**: > 1. 扫描频率过低会导致闪烁,建议500Hz-1kHz > 2. 共阳极数码管需输出**低电平**点亮段 > 3. 学号显示需将字符转换为7段码表(如`H→0x89, E→0x86`)[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值