Nios II开发--数码管组件
文章摘要:
本文通过基于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;
}