fpga论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA
课
程
论
文
学院:电气学院
专业班级:
姓名:
学号:
指导老师:***
日期:2015年12月13日
目录一、摘要
二、概念
2.1 什么是FPGA
2.2 工作原理
2.3 芯片结构
2.4 配置模式
三、FPGA的设计语言介绍
3.1 VHDL语言介绍
3.2 Verilog语言介绍
四、交通灯的Verilog语言程序
4.1 设计背景
4.2 Verilog程序
4.3 C语言程序
五、学习体会
六、参考文献
FPGA结课论文
一、摘要
现在,随着系统级FPGA以及系统芯片的出现,软硬件协调设计和系统设计变得越来越重要。
传统意义上的硬件设计越来越倾向于与系统设计和软件设计结合。
硬件描述语言为适应新的情况,得到迅速发展,出现了很多新的硬件描述语言,像Superlog、SystemC、CynlibC++等。
本次设计是基于FPGA/CPLD数控脉冲宽度调制信号发生器实现,该系统主要模块有:时钟产生电路模块、JTAG编程连接模块、电源电路模块,通过连线将各个模块进行连接成最小系统,系统精简,实现方便且功能强大,比起传统的信号发生器有着比较明显的优势。
本设计立足系统可靠性及稳定性等高技术要求,采用FPGA芯片实现数控脉冲宽度调制信号发生器的FPGA/CPLD设计,其电路设计比较简单,外围电路少,易于控制和检查,较传统的分离元件实现方式有着明显的优势,尤其是其设计电路实现周期,其抗干扰及调试过程都很简单。
二、概念
2.1什么是FPGA?
FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。
是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB (Input Output Block)和内部连线(Interconnect)三个部分。
FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA 芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
2.2工作原理
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB (Input Output Block)和内部连线(Interconnect)三个部分。
现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD 器件)相比,FPGA具有不同的结构。
FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑
电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。
FPGA 的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
2.3芯片结构
主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理和DSP)的硬核(ASIC型)模块。
FP芯片主要由7部分完成,分别为:可编程输入输出单元、基本可编程逻辑元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌用硬件模块。
每个模块的功能如下:
1、编程输入输出单元(IOB)
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求。
FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。
通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。
I/O 口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps 的数据速率。
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。
当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。
为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有一种VCCO,但不同bank的VCCO可以不同。
只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。
2. 可配置逻辑块(CLB)
CLB是FPGA内的基本逻辑单元。
CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些选型电路(多路复用器等)和触发器组成。
开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。
在xilinx公司的FPGA器件中,CLB 由多个(一般为1个或2个)相同的Slice和附加逻辑构成。
每个CLB模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM和分布式ROM。
3.数字时钟管理模块(DCM)
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。
Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。
相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
4.嵌入式块RAM(BRAM)
大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。
块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器(CAM)以及FIFO 等常用存储结构。
RAM、FIFO是比较普及的概念,在此就不冗述。
CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。
除了块RAM,还可以将FPGA中的LUT灵活地配置成
RAM、ROM和FIFO等结构。
5.丰富的布线资源
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。
FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。
第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。
6.底层内嵌功能单元
内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Loop)、DSP和CPU等软处理核(SoftCore)。
越来越丰富的内嵌功能单元,单片FPGA 成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC过渡。
DLL和PLL具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。
Xilinx公司生产的芯片上集成了DLL,Altera公司的芯片集成了PLL核生成的工具方便地进行管理和配置。
7. 内嵌专用硬核
内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。
为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。
例如:为了提高FPGA的乘法速度,主流的FPGA 中都集成了专用乘法器;为了适用通信总线与接口标准,很多高端的FPGA内部都集成了串并收发器(SERDES),可以达到数十Gbps的收发速度。
2.4 配置模式
FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
三、FPGA的设计语言介绍
FPGA设计通常会使用HDL语言,比如Verilog HDL或者VHDL。
当采用HDL 语言来描述一个硬件电路功能的时候,要确保代码描述的电路是硬件可实现的。
HDL语言的语法与C语言很相似,但是它们之间有着本质的区别。
C语言是基于过程的高级语言,编译后可以在CPU上运行。
而Verilog HDL语言描述的本身就是硬件结构,编译后是硬件电路。
3.1 VHDL语言介绍
Very-High-Speed Integrated Circuit Hardware Description La nguage是VHDL的英文全名。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是
VHDL系统设计的基VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。
3.2Verilog语言介绍
HDL:Hardware Discription Language,是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。
所有这些都使用同一种建模语言。
此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。
因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。
语言从C编程语言中继承了多种操作符和结构。
Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。
但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。
当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
一个完整的Verilog模块由以下五个部分组成:
1.模块定义行:module module_name (port_list);
2.说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。
语句定设计的功能和结构。
说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。
为了使模块描述清晰和具有良好的可读性, 最好将所有的说明部分放在语句前。
说明部分包括:寄存器,线网,参数:reg, wire, paramer端口类型说明行:input, output, inout 函数、任务:function, task等。
3.主体部分:这是一个模块最重要的部分,在这里描述模块的行为和功能,子模块的调用和连接,逻辑门的调用,用户自定义部的调用,初始态赋值,always块,连续赋值语句等等。
4.结束行,以 endmodule 结束,注意后面没有分号了。
5. 在模块中,可用下述方式描述一个设计:
1)数据流方式
2) 行为方式;
3) 结构方式;
4) 上述描述方式的混合。
四、交通灯的Verilog语言程序
4.1设计背景
随着社会经济的发展,城市交通问题越来越引起人们的关注。
出行交通的协调,已成为交通管理部门需要解决的重要问题之一。
城市交通控制系统是用于城市交通数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。
随着城市机动车量的不断增加,许多城市出现了交通超负荷运行的情况,因此,自80年代后期,这些城市纷纷修建城市高速道路,在高速道路建设完成的初期,它们也曾有效地改善了交通状况。
然而,随着交通量的快速增长和缺乏对高速道路的系统研究和控制,高速道路没有充分发挥出预期的作用。
而城市高速道路在构造上的特点,也决定了城市高速道路的交通状况必然受高速道路与普通道路耦合处。
4.2Verilog程序
Moduletraffic(clk,smbit,key,smseg,en,rst,hold,light1,light2);
input clk;//定义时钟引脚
input rst,en; //定义复位和使能引脚
output [7:0]sm_bit;//定义数码管位选引脚
output [7:0]sm_seg;//定义数码管段选引脚output[2:0]light1,light2;//定义两个方向交通灯reg [7:0]sm_bit_r;
reg [7:0]sm_seg_r;
reg [3:0]disp_dat;;//定义数码管显示数据寄存器
Reg[24:0]count;//定义计数器寄存器
reg sec;//定义秒信号寄存器
reg tim1,tim2,st1,st2;//定义tim1位倒计时是否到达的位标识reg[1:0]state1,state2,ste;//定义一些状态
reg[2:0]light1,light2;
reg[3:0]num;
reg[7:0]num1,num2;//num1num2的值为倒计时的值reg[7:0]red1,red2,green1,green2,yellow1,yellow2;//定义红黄蓝灯的一些状态
assign smbit=smbitr;
assign smseg=smsegr;
always@(posedge clk)
begin
count=count+1'b1;
if(count==25'd2*******)//时间达到一秒
Begin
count=25'd0;
sec=~sec;
end
end
always@(posedge clk)
Begin
case (count[17:15])
3'd0:dispdat=num1[3:0];//秒个位
3'd1:dispdat=num1[7:4];//秒十位
3'd2:dispdat=4'ha;//显示"-"
3'd3:dispdat=num2[3:0];//分个位
3'd4:dispdat=num2[7:4];//分十位
3'd5:dispdat=4'ha;//显示"-"
endcase
case(count[17:15]) //选择数码管显示位
3'd0:smbitr=8'b11111110;//选择第一个数码管显示3'd1:smbitr=8'b11111101;//选择第二个数码管显示3'd2:smbitr=8'b11111011;//选择第三个数码管显示3'd3:smbitr=8'b11110111;//选择第四个数码管显示3'd4:smbitr=8'b11101111;//选择第五个数码管显示3'd5:smbitr=8'b11011111;//选择第六个数码管显示3'd6:smbitr=8'b10111111;//选择第七个数码管显示3'd7:smbitr=8'b01111111;//选择第八个数码管显示
endcase
end
always @(posedge clk)
Begin
case(dispdat)
4'h0:smsegr=8'hc0;//显示0
4'h1:smsegr=8'hf9;//显示1
4'h2:smsegr=8'ha4;//显示2
4'h3:smsegr=8'hb0;//显示3
4'h4:smsegr=8'h99;//显示4
4'h5:smsegr=8'h92;//显示5
4'h6:smsegr=8'h82;//显示6
4'h7:smsegr=8'hf8;//显示7
4'h8:smsegr=8'h80;//显示8
4'h9:smsegr=8'h90;//显示9
4'ha:smsegr=8'hbf;//显示-
default:smsegr=8'hff;//不显示
endcase
end
always@(en)
if(!en)
begin
green1<=8'b00110101;
red1<=8'b00100101;
yellow1<=8'b00000101;
green2<=8'b00100101;
red2<=8'b00110101;
yellow2<=8'b00000101;
end
always@(posedge sec)//南北方向
begin
if(!rst)//复位模块
begin
light1<=3'b001;
num1<=green1;
end
if(!tim1)
begin
tim1<=1;
case(state1)
2'b00:beginnum1<=green1;light1<=3'b110;state1<=2'b01;end
2'b01:beginnum1<=yellow1;light1<=3'b101;state1<=2'b11;end
2'b11:beginnum1<=red1;light1<=3'b011;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b101;state1<=2'b00;end//状态机使三个状态一直循环
default:light1<=3'b011;
endcase
end
else
begin
if(num1==1)tim1<=0;
else if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;//倒计时模块
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
end
end
always@(posedge sec)//东西方向
begin
if(!rst)//复位模块
begin
light2<=3'b100;
num2<=red2;
end
if(!tim2)
begin
tim2<=1;
case(state2)
2'b00:beginnum2<=red2;light2<=3'b011;state2<=2'b01;end
2'b01:beginnum2<=yellow1;light2<=3'b101;state2<=2'b11;end 2'b11:beginnum2<=green2;light2<=3'b110;state2<=2'b10;end 2'b10:beginnum2<=yellow2;light2<=3'b101;state2<=2'b00;end default:light2<=3'b011;
endcase
end
else
begin
if(num2==1)tim2<=0;
else if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
end
end
endmodule
4.3 C语言程序
#include<reg52.h>
#define uchar unsigned char
#define time 50000
#define ON 0
#define OFF 1
sbit NSB=P1^5;//南北绿灯
sbit NSY=P1^4;//南北黄灯
sbit NSR=P1^3; //南北红灯
sbit EWB=P1^2;//东西绿灯
sbit EWY=P1^1;//东西黄灯
sbit EWR=P1^0;//东西红灯
sbit P27=P2^7;
sbit P26=P2^6;
sbit P23=P2^3;
sbit P22=P2^2;
/*===============倒计时=========================*/
uchar N=15,Y=12,Z=15,M=27,G=30,U=30;
uchar C50ms;
uchar seg=1;
void InitialT1(void)
{
ET1=0;TMOD=0x10;
TH1=(65536-time)>>8;
TL1=(65536-time)&0xff;
TR1=1;
ET1=1;
EA=1;
}
Void ISRT 1(void) interrupt3
{
TR1=0;
TH1=(65536-time)>>8;
TL1=(65536-time)&0xff;
TR1=1;
C50ms++;
if(C50ms>19)
{
N--;
M--;
Y--;
Z--;
G--;
U--;
C50ms=0;
}
}
/*=================延时=======================*/
void Delay10uS(uchar second)
{
int i;
while((second--)!=0)
{
for(i=0;i<3;i++){;}
}
}
/*==================led控制========================*/
uchar discode[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void display1(uchar num1,uchar num2)
{
P0=discode[num1]; P22=ON; Delay10uS(1); P22=OFF; //控制南led显示P0=discode[num2]; P23=ON; Delay10uS(1); P23=OFF;
}
void display2(uchar num3,uchar num4)
{
P0=discode[num3]; P26=ON; Delay10uS(1); P26=OFF; //控制东西led 显示
P0=discode[num4]; P27=ON; Delay10uS(1); P27=OFF;
}
main()
{
int i;
// P0=0xff;
/*=============初始状态:东西南北都红灯==================*/
NSR=ON;
EWR=ON;
for(i=0;i<800;i++)
{
Delay10uS(20);
}
NSR=OFF;
EWR=OFF;
while(1)
{
InitialT1();// 初始化计时器
/*=============状态1:东西绿灯(12s) 南北红灯(15s)==================*/
/*=============状态2:东西黄灯(3s) 南北红灯(15s)=================*/ EWB=ON;
NSR=ON;
while(N!=0)
{
display1(N/10,N%10);// 南北红灯(15s)
display2(Y/10,Y%10);// 东西绿灯(12s)
while(N==3)
{
while(Z!=0)
{
display1(N/10,N%10);// 南北红灯(3s)
display2(Z/10,Z%10);// 东西黄灯(3s)
EWB=OFF;
EWY=ON;
}
}
}
NSR=OFF;
EWB=OFF;
EWY=OFF;
P0=0xff; //全关掉
//Delay10uS(1);
/*=============状态3:东西红灯(15s) 南北绿灯(12s)==================*/
/*=============状态4:东西红灯(15s) 南北黄灯(3s)==================*/
EWR=ON;
NSB=ON;
while(G!=0)
{
display2(G/10,G%10);// 东西红灯(12s)
display1(M/10,M%10);// 南北绿灯(12s)
while(G==3)
{
while(U!=0)
{
display2(G/10,G%10);// 东西红灯(3s)
display1(U/10,U%10);// 南北绿灯(3s)
NSB=OFF;
NSY=ON;
}
}
}
EWR=OFF;
NSB=OFF;
NSY=OFF;
//P0=0xFF;
//Delay10uS(1);
/*=====================重新赋值===============================*/ N=15,Y=12,Z=15,M=27,G=30,U=30;
}
}
五、学习体会
半学期的学习让我对FPGA有了一定的了解,从一开始听老师讲课的云里雾
里,到慢慢的理解。
刚做FPGA实验时自己总觉着不知道在干什么,经过几次的
练习慢慢的明白了其中的道理,在本学期的电子实习中还用到了VHDL语言,慢
慢的意识到VHDL语言和Verilog语言的重要性和应用之处。
感觉自己现在对
FPGA和两种语言还差的太多,之后还得要学习更多。
六、参考文献
[1] 潘松,黄继业等.EDA技术实用技术.北京:科学
出版社,2004
[3] 齐洪喜,陆颖.VHDL电路设计实用教程.北京:清华大学出版社,2004
[4] 江国强,EDA技术与应用.北京:电子工业出2004.8。