第三节 FPGA驱动数码管

  1. 原理图

    今天不太开心。
    项目名称:GFPGA驱动数码管。
    材料:FPGA开发板、共阳极数码管。
    实验内容:使用FPGA驱动一个数码管每秒依次显示1~E,至于为啥不显示F,因为我懒的改了。
    电气原理图如下。
    开发板的6个数码管的原理图
    开发板的6个数码管
    FPGA和数码管的段码的定义
    FPGA和数码管段码的定义
    数码管0的各位的I/O定义
    数码管0的各位的IO定义

  2. 编辑器

    接下来建立工程、编写代码。因为quartus自带的编辑器非常垃圾,所以我进行配置了关联Notepad++。配置细节tool–> options–>preferred Text Editor如图。
    text editor
    对于Command-line中引号的内容你可以直接选择…然后找到notepad++双击添加就行。下面是代码。

  3. 代码部分

module Nixie (LEDs ,Nixies,clk,rst);

output [7:0] LEDs;
output [6:0] Nixies;
input  clk,rst;

reg [26:0] cnt;

reg [6:0] NixieDisplay;

reg [7:0] GE;

parameter 
    segment0  = 8'd1,
    segment1  = 8'd2,
    segment2  = 8'd3,
    segment3  = 8'd4,
    segment4  = 8'd5,
    segment5  = 8'd6,
    segment6  = 8'd7,
    segment7  = 8'd8,
    segment8  = 8'd9,
    segment9  = 8'd10,
    segment10 = 8'd11,
    segment11  = 8'd12,
    segment12  = 8'd13,
    segment13  = 8'd14,
    segment14  = 8'd15,
    segment15  = 8'd16;


parameter 
    duan0  = 8'Hc0,
    duan1  = 8'HF9,
    duan2  = 8'HA4,
    duan3  = 8'HB0,
    duan4  = 8'H99,
    duan5  = 8'H92,
    duan6  = 8'H82,
    duan7  = 8'HF8,
    duan8  = 8'H80,
    duan9  = 8'H90,
    duan10 = 8'H88,
    duan11 = 8'H83,
    duan12 = 8'Hc6,
    duan13 = 8'Ha1,
    duan14 = 8'H86,
    duan15 = 8'H8e;


always @(posedge clk or negedge rst)
    begin 
        if(!rst) 
                begin
                    cnt = 0;

                    GE  = 0;
                end
        else 
            begin
                cnt = cnt + 27'b1;

                if(cnt >= 27'H2FAF080) 
                    begin 
                        cnt = 0;
                        GE = GE + 8'b1;
                        if(GE == 8'd16) GE = 0;
                    end 
            end 
    end

always @(posedge clk)
    begin
        case(GE)
            segment0:  NixieDisplay = duan0[6:0];
            segment1:  NixieDisplay = duan1[6:0];
            segment2:  NixieDisplay = duan2[6:0];
            segment3:  NixieDisplay = duan3[6:0];
            segment4:  NixieDisplay = duan4[6:0];
            segment5:  NixieDisplay = duan5[6:0];
            segment6:  NixieDisplay = duan6[6:0];
            segment7:  NixieDisplay = duan7[6:0];
            segment8:  NixieDisplay = duan8[6:0];
            segment9:  NixieDisplay = duan9[6:0];
            segment10: NixieDisplay = duan10[6:0];
            segment11: NixieDisplay = duan11[6:0];
            segment12: NixieDisplay = duan12[6:0];
            segment13: NixieDisplay = duan13[6:0];
            segment14: NixieDisplay = duan14[6:0];
            segment15: NixieDisplay = duan15[6:0];

            default:  NixieDisplay = duan0[6:0];
        endcase
    end

    assign Nixies = NixieDisplay;
    assign LEDs  = GE;

endmodule
烧录进FPGA即可看到数码管在一每秒更换一次的速度进行工作。当然我多加了几个LED来指示状态。代码解析下节继续。
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 答:#include <stdio.h> int main(){ int i; //管脚定义 int com[8] = {2,3,4,5,6,7,8,9}; //初始化数码管 for(i = 0;i < 8;i++){ pinMode(com[i],OUTPUT); } //循环输出0~9 while(1){ for(i = 0;i < 10;i++){ //输出位码 int bit[8] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int j; for(j = 0;j < 8;j++){ digitalWrite(com[j],bit[i]&(0x01<<j)); } delay(1000); } } return 0; } ### 回答2: FPGA(Field-Programmable Gate Array)是可编程逻辑门阵列,驱动数码管主要需要使用FPGA的引脚和逻辑电路来实现。下面是一个基本的数码管驱动代码: 首先,需要在FPGA引脚上定义数码管的输入引脚和输出引脚,以及与之相关的时钟信号和使能信号。假设使用4位公共阳极数码管,连接到FPGA引脚AN0-AN3,A-G、DP连接到FPGA引脚SEG0-SEG7。另外,CLK表示时钟信号,EN表示使能信号。 module FPGA_Driver( input logic [7:0] HEX, input logic CLK, input logic EN, output logic [6:0] SEG, output logic [3:0] AN ); // 数码管显示时序计数器 logic [2:0] counter; always_ff@(posedge CLK) begin if (EN) begin // 使能信号为有效时 if (counter==4'b111) begin // 数码管循环显示 counter <= 0; end else begin counter <= counter + 1; end end end always_comb begin case (counter) 3'b000: begin AN <= 4'b1110; // 数码管的第1位显示 SEG <= HEX[0:6]; // 数码管的第1位字符 end 3'b001: begin AN <= 4'b1101; // 数码管的第2位显示 SEG <= HEX[0:6]; // 数码管的第2位字符 end 3'b010: begin AN <= 4'b1011; // 数码管的第3位显示 SEG <= HEX[0:6]; // 数码管的第3位字符 end 3'b011: begin AN <= 4'b0111; // 数码管的第4位显示 SEG <= HEX[0:6]; // 数码管的第4位字符 end default: begin AN <= 4'b1111; // 关闭数码管显示 SEG <= 7'b111_1111; // 全部段关闭 end endcase end endmodule 以上是一个简单的FPGA驱动数码管的代码,实现了四位数码管的循环显示。其中,HEX为输入,表示要显示的数值(例如:0~9,A~F),CLK为时钟信号,EN为使能信号,SEG和AN为4位数码管的引脚输出。在每个时钟上升沿时,根据计数器的值选择对应位的数码管显示和字符。当使能信号无效时,数码管将关闭。 需要注意的是,具体的引脚定义和时序可以根据实际硬件平台和数码管的类型进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值