基于FPGA的SOPC技术.docx
- 文档编号:25131915
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:16
- 大小:231.19KB
基于FPGA的SOPC技术.docx
《基于FPGA的SOPC技术.docx》由会员分享,可在线阅读,更多相关《基于FPGA的SOPC技术.docx(16页珍藏版)》请在冰豆网上搜索。
基于FPGA的SOPC技术
基于FPGA的数字时钟设计
摘要:
EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL和C语言在FPGA实验板上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为23时59分59秒、。
总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数模块、处理器及外设模块,并且使用QuartusII运用VHDL语言对分频和计数两个模块进行硬件电路设计和电路波形仿真,运用sopc技术嵌入内核并创建了系统所需的外部设备FLASH和SRAM软件通过使用NiosII运用C语言进行编程然后下载到硬件电路中,并在FPGA实验板上进行调试和验证。
该设计采用自顶向下、混合输入方式(原理图输入—顶层文件连接和VHDL语言输入—各模块程序设计)实现数字钟的设计、下载和调试。
关键词:
数字钟;FPGA;VHDL语言;C语言;SOPC技术;
1、选题背景和研究内容
近年来,随着数字集成电路技术的发展,用以前传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率。
能大大降低设计难度的VHDL设计方法正在被越来越广泛的采用。
VHDL即超高速集成电路硬件描述语言,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076--1993版本。
现在,VHDL作为IEEE的工业标准硬件描述语言,已成为通用硬件描述语言。
现在电子钟产品可谓百家争鸣,市场上到处可见一些功能齐全的设备,可能基于单片机的比较多,用FPGA设计电子钟可能比较少。
因为两个都可以实现同样的功能,而FPGA芯片的价格远比单片机高。
出于利润,当然会选择开发成本少的产品。
本次设计的目的是为了检验所学的知识(VHDL语言与SOPC技术)同时结合实践巩固知识,由于初涉该领域,相关的知识可能不够全面,实践的经验不够,所以本设计旨在能够实现数字钟的功能,对于各模块设计的优化和性能等方面没有多加考虑。
2、SOPC技术概述
SOPC(SystemOnProgrammableChip)即可编程的片上系统,或者说是基于大规模FPGA的单片系统。
SOPC的设计技术是现代计算机辅助设计技术、EDA技术和大规模集成电路技术高度发展的产物。
SOPC技术的目标就是试图将尽可能大而完整的电子系统,包括嵌入式处理器系统、接口系统、硬件协处理器或加速系统、DSP系统、数字通信系统、存储电路以及普通数字系统等,在单一FPGA中实现,使得所设计的电路系统在其规模、可靠性、体积、功耗、功能、性能指标、上市周期、开发成本、产品维护及其硬件升级等多方面实现最优化。
SOPC技术是一门全新的综合性电子设计技术,涉及面广,SOPC在电子设计技术上给出了一种以人的基本能力为依据的软硬件综合解决优化方案。
3、数字钟系统总体设计方案
3.1 数字钟的构成
该数字钟系统构成主要包括分频程序模块、时分秒计数模块、处理器及外设模块三个模块,其总体结构框图如图1所示
图1总体结构框图
3.2 数字钟的工作原理
数字钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。
秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的50MHz信号通过分频得到。
当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号,每一秒钟发出一个中断给CPU,CPU采用NIOS,它响应中断,并读出小时、分、秒等信息。
CPU对读出的数据译码,使之动态显示在数码管上。
4、单元模块电路设计
4.1分频模块电路设计与实现
分频器是数字系统设计中的基本电路,根据不同设计的需要,我们会遇到偶数分频、奇数分频、半整数分频等。
通常由计数器或计数器的级联构成各种形式的偶数分频及非等占空比的奇数分频,实现较为简单。
本文设计的分频器是利用VHDL硬件描述语言,通过QuartusⅡ开发平台,使用Altera公司的FPGA,设计了用50MHZ的时钟信号输入进行50000000分频得到1HZ的时钟信号,作为秒计数器的个位提供时钟信号。
其原理图如图2所示。
图2分频模块原理图
4.2计数模块设计与实现
秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的50MHz信号通过分频得到。
当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号。
其原理图如图3所示。
图3计数模块原理图
4.3处理器及外设模块设计和实现
该模块CPU采用NIOSII处理器,程序存储采用4M的Flash,数据存储采用外部的512k的SRAM,使用Flash来保存NIOSII中运行的程序代码和FPGA的配置数据,处理器在复位后从Flash开始执行程序,使用IDEFlashProgrammer进行编程,将程序下载到Flash中,一个1位的I/O口接受中断信号,六个4位I/O口作为数据输入端口,六个8位I/O口作为数据输出端口,外接六个8位led数码管,通过分频后的时钟信号每一秒钟给CPU一个中断信号,CPU响应中断,并通过4位I/O口读出小时、分、秒等信息,对读出的数据进行译码,并通过8位I/O口使之动态显示在数码管上。
原理图如图4所示。
图4处理器及外设模块原理图
系统总的原理图如图5所示
图5系统总原理图
5、系统软件设计
中断译码程序流程图如图6所示
图6中断译码程序流程图
6、系统调试和测试
分频模块的调试与测试,分频模块采用的VHDL语言编写,对该模块进行功能和时序仿真,由于进行50000000分频的仿真比较困难,所以在此对2分频进行仿真.,图7为仿真输入波形图,采用输入时钟CLK周期为10ns,图8为仿真输出波形图,输出FN时钟周期为20ns。
图7分频模块仿真输入波形图
图8仿真输出波形图
计数模块的调试与测试,计数模块采用的VHDL语言编写,对该模块进行功能和时序仿真,仿真输入的时钟信号周期为10ns,输出应为六位的时钟信号,仿真的波形图如图9所示。
图9计数模块仿真输出波形图
处理器与外设模块的调试与测试,该模块采用SOPC技术生成,运用C语言编程在该模块中实现数据的传输译码,经过反复的在线调试,最终将时钟显示在FPGA实验板上。
7、结论
本文设计了一个数字钟,输入时钟为50MHz,输出的小时、分、秒显示在数码管上,1秒钟改变一下显示。
数字钟的计数用VHDL语言设计实现,每一秒钟发出一个中断给CPU,CPU采用NIOS,它响应中断,并读出小时、分、秒等信息。
CPU对读出的数据译码,使之能在数码管上显示。
通过本次的数字钟系统设计,系统的复习整个基于FPGA的SOPC技术的知识,并且了解了CPLD可编程芯片的结构和引脚,能够熟练的运用QuartusII这个软件,能够采用VHDL语言实现基本的分频,计数器等硬件电路的设计和波形仿真,能够熟练的运用NIOSII结合C语言进行软件编程,并将软件下载到硬件电路进行调试。
数字钟的实物图如图10所示。
图10数字钟实物图
8、附录
分频的VHDL程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFPIS
PORT(CLK,RST:
INSTD_LOGIC;
FN:
OUTSTD_LOGIC);
ENDFP;
ARCHITECTURENEOOFFPIS
SIGNALTEMP:
STD_LOGIC;
BEGIN
PROCESS(CLK,RST)
VARIABLECOUNT:
INTEGERRANGE1TO25000000;
BEGIN
IFRST='0'THENTEMP<='0';
ELSIFCLK'EVENTANDCLK='0'THEN
IFCOUNT=25000000THENCOUNT:
=1;TEMP<=NOTTEMP;
ELSECOUNT:
=COUNT+1;
ENDIF;
ENDIF;
FN<=TEMP;
ENDPROCESS;
ENDNEO;
计数模块的VHDL程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSSZIS
PORT(RST:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
MIAO1:
OUTINTEGERRANGE9DOWNTO0;
MIAO2:
OUTINTEGERRANGE9DOWNTO0;
FEN1:
OUTINTEGERRANGE9DOWNTO0;
FEN2:
OUTINTEGERRANGE9DOWNTO0;
SHI1:
OUTINTEGERRANGE9DOWNTO0;
SHI2:
OUTINTEGERRANGE9DOWNTO0);
ENDSSZ;
ARCHITECTUREONEOFSSZIS
BEGIN
PROCESS(RST,CLK)
VARIABLEM1:
INTEGERRANGE9DOWNTO0;
VARIABLEM2:
INTEGERRANGE9DOWNTO0;
VARIABLEF1:
INTEGERRANGE9DOWNTO0;
VARIABLEF2:
INTEGERRANGE9DOWNTO0;
VARIABLES1:
INTEGERRANGE9DOWNTO0;
VARIABLES2:
INTEGERRANGE9DOWNTO0;
BEGIN
IFRST='0'THENM1:
=0;M2:
=0;F1:
=0;F2:
=0;S1:
=0;S2:
=0;
ELSIFCLK'EVENTANDCLK='1'THEN
IFM1<9THENM1:
=M1+1;
ELSIFM1=9THENM1:
=0;
IFM2<5THENM2:
=M2+1;
ELSIFM2=5THENM2:
=0;
IFF1<9THENF1:
=F1+1;
ELSIFF1=9THENF1:
=0;
IFF2<5THENF2:
=F2+1;
ELSIFF2=5THENF2:
=0;
IFS1<4THENS1:
=S1+1;
ELSIFS1=4THENS1:
=0;
IFS2<2THENS2:
=S2+1;
ELSIFS2=2THENS2:
=0;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
MIAO1<=M1;
MIAO2<=M2;
FEN1<=F1;
FEN2<=F2;
SHI1<=S1;
SHI2<=S2;
ENDPROCESS;
ENDONE;
译码C语言程序代码:
#include
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
#include"sys/alt_irq.h"
#include"priv/alt_busy_sleep.h"
unsignedintin_1,in_2,in_3,in_4,in_5,in_6;
unsignedcharout_1,out_2,out_3,out_4,out_5,out_6;
unsignedchardisplay(unsignedintx)
{
switch(x)
{case0:
x=0xc0;break;
case1:
x=0xf9;break;
case2:
x=0xa4;break;
case3:
x=0xb0;break;
case4:
x=0x99;break;
case5:
x=0x92;break;
case6:
x=0x82;break;
case7:
x=0xf8;break;
case8:
x=0x80;break;
case9:
x=0x90;break;
default:
x=0xc0;break;
}
returnx;
}
voidyima(void)
{in_1=IORD_ALTERA_AVALON_PIO_DATA(PIO_IN1_BASE)&0xff;
out_1=display(in_1);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT1_BASE,out_1);
in_2=IORD_ALTERA_AVALON_PIO_DATA(PIO_IN2_BASE)&0xff;
out_2=display(in_2);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT2_BASE,out_2);
in_3=IORD_ALTERA_AVALON_PIO_DATA(PIO_IN3_BASE)&0xff;
out_3=display(in_3);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT3_BASE,out_3);
in_4=IORD_ALTERA_AVALON_PIO_DATA(PIO_IN4_BASE)&0xff;
out_4=display(in_4);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT4_BASE,out_4);
in_5=IORD_ALTERA_AVALON_PIO_DATA(PIO_IN5_BASE)&0xff;
out_5=display(in_5);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT5_BASE,out_5);
in_6=IORD_ALTERA_AVALON_PIO_DATA(PIO_IN6_BASE)&0xff;
out_6=display(in_6);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT6_BASE,out_6);
}
staticvoidinter_interrupt(void*context,alt_u32id)
{/*关中断*/
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INTURRPT_BASE,0x00);
/*清边沿捕获寄存器*/
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INTURRPT_BASE,0x00);
/*调用译码子程序*/
yima();
/*开中断*/
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INTURRPT_BASE,0xFF);
}
voidinit_pio(void)
{
/*初始化PIO_OUT为输出*/
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_OUT1_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_OUT2_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_OUT3_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_OUT4_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_OUT5_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_OUT6_BASE,0xff);
/*初始化PIO_IN为输入*/
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_IN1_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_IN2_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_IN3_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_IN4_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_IN5_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_IN6_BASE,0x00);
/*开中断*/
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INTURRPT_BASE,0xff);
/*清边沿捕获寄存器*/
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INTURRPT_BASE,0x00);
/*注册中断服务子程序*/
alt_irq_register(INTURRPT_IRQ,NULL,inter_interrupt);
}
intmain(void)
{init_pio();
while
(1)
{;}
return0;
}
参考文献:
[1]周立功,SOPC嵌入式系统基础教程,北京航空航天大学出版社,2008.4
[2]周立功,SOPC嵌入式系统实验教程,北京航空航天大学出版社,2006.7
[3]张志刚,FPGA与SOPC设计教程—DE实践,西安电子科技大学出版社,2007
[4]潘松黄继业,EDA技术实用教程,科学出版社,2006.8
[5]华清远见嵌入式培训中心,FPGA应用开发入门与典型实例,人民邮电出版社,2008.6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA SOPC 技术