文章摘要:
本文通过基于Avalon-MM总线设备的数码管显示组件的应用,来说明的组件的添加与应用;


硬件平台:EP4CE6F17C8
开发环境:Quartus II 13.1/Nios II 13.1


创建数码管组件

/*
 *  功能描述:基于Avalon-MM总线的数码管组件
 */
module avalon_mm_smg (
    clk,            // 时钟信号
    rst_n,          // 复位信号
    
    // Avalon-MM接口
    address,        // 地址线(3bit)
    chipselect,     // 片选
    write_n,        // 写使能(低电平有效)
    writedata,      // 写数据
    readdata,       // 读数据
    
    // 硬件接口
    data_pin,       // 数据管段 
    sel_pin         // 数据管位
 );

input         clk;
input         rst_n;
input [ 2: 0] address;
input         chipselect;
input         write_n;
input [31: 0] writedata;
output[31: 0] readdata;

output [7:0] data_pin;
output [5:0] sel_pin;
//-----------------------------------------------   
reg[31: 0] readdata;

// 模块连接线
reg[7:0]segs[5:0];  // 6字节显示数据
//-----------------------------------------------  
// 寄存器读操作
always @(posedge clk or negedge rst_n)begin
  if (rst_n == 0)
      readdata <= 0;
  else if(address < 6)
       readdata <= {32'b0 | segs[address]};
  else
       readdata <= 0; 
end
//----------------------------------------------- 
// 寄存器写操作   
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        segs[0] <= 0;    
        segs[1] <= 0;
        segs[2] <= 0;
        segs[3] <= 0;
        segs[4] <= 0;
        segs[5] <= 0;
    end  
    
    else if (chipselect && ~write_n) begin 
        if(address < 6) begin
            segs[address] = writedata[7:0];
        end        
    end
end 
//----------------------------------------------- 
// 例化数码管显示模块
smg_scan s0(
    .clk(clk),              // 时钟信号
    .rst_n(rst_n),          // 复位信号
    .data_pin(data_pin),    // 数据引脚,共阳数码管
    .sel_pin(sel_pin),      // 选通信号,低电平导通   
    .seg0(segs[0]),         // 数据
    .seg1(segs[1]),         // 数据
    .seg2(segs[2]),         // 数据
    .seg3(segs[3]),         // 数据
    .seg4(segs[4]),         // 数据
    .seg5(segs[5])          // 数据
);
//----------------------------------------------- 
endmodule

打开Qsys软件

Project --> New Components...


基本信息
请输入图片描述


添加文件
1.添加文件,并指定顶层文件(Top-level File);

添加源文件

2.点击Analyze Synthesis Files,系统将自动分析模块接口,如果后续修改了接口,则需要重新操作;

这里显示的错误是因为信号定义的问题,暂时不用理会,下一步骤中会处理;


信号处理

请输入图片描述


接口定义
点击Remove Interfaces With No Signals删除无用的信号;

请输入图片描述

此时不应该再有任何错误了,点击Finish完成组件创建;


将数码管组件添加至系统中


示例代码:

/*
 *  main.c
 *  Created on: 2017-4-18
 *  Author    : alex.duan
 *  Descript  :
 */
#include "system.h"

// 寄存器定义
#define rSMG0 *((volatile int *)(SMG_BASE + (0 << 2)))
#define rSMG1 *((volatile int *)(SMG_BASE + (1 << 2)))
#define rSMG2 *((volatile int *)(SMG_BASE + (2 << 2)))
#define rSMG3 *((volatile int *)(SMG_BASE + (3 << 2)))
#define rSMG4 *((volatile int *)(SMG_BASE + (4 << 2)))
#define rSMG5 *((volatile int *)(SMG_BASE + (5 << 2)))

// 数码管显示表(共阳极显示)
char smg_table[16] = {
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};

// 延时程序
void delay(int n)
{
    while(n--);
}

// 主函数入口
int main(void)
{
    int val = 0x00;
    while(1)
    {
        // 这种数码管的显示方案是不是简单很多
        rSMG0 = (int)smg_table[val%10];
        rSMG1 = (int)smg_table[val/10%10];
        rSMG2 = (int)smg_table[val/100%10];
        rSMG3 = (int)smg_table[val/1000%10];
        rSMG4 = (int)smg_table[val/10000%10];
        rSMG5 = (int)smg_table[val/100000%10];

        delay(1000000); // 延时一会
        val++;
    }

    return 0;
}