基于FPGA乒乓球游戏机Verilog设计文档格式.docx
《基于FPGA乒乓球游戏机Verilog设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于FPGA乒乓球游戏机Verilog设计文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
两种HDL均为IEEE标准。
VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。
被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。
数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
VerilogHDL语言具有下述描述能力:
设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。
所有这些都使用同一种建模语言。
此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。
因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。
语言从C编程语言中继承了多种操作符和结构。
VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解。
但是,VerilogHDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。
当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
1.2.1Verilog语言的用途
VerilogHDL就是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,它是由GDA(GatewayDesignAutomation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。
1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得VerilogHDL迅速得到推广应用。
1989年CADENCE公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。
1990年CADENCE公司公开发表了VerilogHDL,并成立LVI组织以促进VerilogHDL成为IEEE标准,即IEEEStandard1364-1995.
VerilogHDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,因而可以把VerilogHDL内容安排在与ASIC设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统设计的,这样的安排可以使学习者同时获得设计实际电路的经验。
与之相比,VHDL的学习要困难一些。
但VerilogHDL较自由的语法,也容易造成初学者犯一些错误,这一点要注意。
1.2.2Verilog的历史
VerilogHDL语言最初是于1983年由GatewayDesignAutomation公司为其模拟器产品开发的硬件建模语言。
那时它只是一种专用语言。
由于他们的模拟、仿真器产品的广泛使用,VerilogHDL作为一种便于使用且实用的语言逐渐为众多设计者所接受。
在一次努力增加语言普及性的活动中,VerilogHDL语言于1990年被推向公众领域。
OpenVerilogInternational(OVI)是促进Verilog发展的国际性组织。
1992年,OVI决定致力于推广VerilogOVI标准成为IEEE标准。
这一努力最后获得成功,Verilog语言于1995年成为IEEE标准,称为IEEEStd1364-1995。
1.2.3Verilog模块
模块是Verilog的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。
一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述;
设计的数据流行为使用连续赋值语句进行描述;
时序行为使用过程结构描述。
一个模块可以在另一个模块中调用。
1.3本文研究的意义
通过乒乓球游戏机的开发研究更好的了解使用FPGA芯片,,运用VerilogHDL语言编程,使自己在理论上和实验室条件下达到了比较高的水平。
第2章Verilog的基本理论
2.1Verilog模块的定义
末块的定义从关键字module开始,到关键字endmodule结束,每条VerilogHDL语句以“;
”做为结束(块语句、编译向导、endmodule等少数除外)。
2.2Verilog模块的组成
一个完整的Verilog模块由以下五个部分组成:
1.模块定义行:
modulemodule_name(port_list);
2.说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。
语句定义设计的功能和结构。
说明部分和语句可以散布在模块中的任何地方;
但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。
为了使模块描述清晰和具有良好的可读性,最好将所有的说明部分放在语句前。
说明部分包括:
寄存器,线网,参数:
reg,wire,parameter
端口类型说明行:
input,output,inout
函数、任务:
function,task,等
3.描述体部分:
这是一个模块最重要的部分,在这里描述模块的行为和功能,子模块的调用和连接,逻辑门的调用,用户自定义部件的调用,初始态赋值,always块,连续赋值语句等等。
4.结束行,以endmodule结束,注意后面没有分号了。
以下为建模一个半加器电路的模块的简单实例。
moduleHalfAdder(A,B,Sum,Carry);
inputA,B;
outputSum,Carry;
assign#2Sum=A^B;
assign#3Carry=A&
B;
endmodule
模块的名字是HalfAdder。
模块有4个端口:
两个输入端口A和B,两个输出端口Sum和Carry。
由于没有定义端口的位数,所有端口大小都为1位;
同时,由于没有各端口的数据类型说明,这四个端口都是线网数据类型。
模块包含两条描述半加器数据流行为的连续赋值语句。
从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的。
每条语句的执行顺序依赖于发生在变量A和B上的事件。
在模块中,可用下述方式描述一个设计:
1)数据流方式;
2)行为方式;
3)结构方式;
4)上述描述方式的混合。
2.3EP2C5T144C8芯片简介
EP2C5T144C8-FPGA开发板(以下简称EP2C5开发板)采用Altera公司推出的CYCLONEⅡ系列芯片EP2C5T144C8芯片作为核心处理器进行设计,CYCLONEⅡ系列芯片可以说是目前市场上性价比较高的芯片,比第一代的EP1C6或者EP1C12等芯片设计上、内部的逻辑资源上都有很大的改进,同时价格也可以被广大客户接受;
虽然Altera推出了CYCLONEIII甚至于IV代的芯片,但是目前市场上价格走势偏高,尤其是针对广大初学者的定位,目前还不是适合采用。
2.3.1EP2C8开发板功能
①板载EP2C8Q208C8-FPGA核心芯片;
②板载SDRAM-K4S641632-UC60或HY57V641620FTP-7,两款SDRAM兼容,容量64Mbit,引脚独立,用来做NIOSII实验的程序运行空间;
③50MHz有源晶体,提供系统工作主时钟,通过22Ω;
匹配电阻连接只CLK0和CLK4,均可以作为系统时钟使用;
④5v电源输入接口,外经5mm,内径3.5mm内正外负;
⑤电源开关,正视开发板,向上接通电源;
⑥R_C按键,FPGA的重新配置按键,按下之后,系统重新从EPCS4配置芯片中读取程序然后作;
⑦Rst按键,这个用户IO,可以当做用户输入按键使用,也可以分配为系统的复位按键;
⑧IN5822二极管防止电源反接,高速肖特基二极管;
⑨电源工作指示D2;
⑩25x2双排直插2.54间距用户接口;
1个用户LED-D4,引脚独立,没有与接口板进行复用;
下载指示灯D1,平时熄灭,下载的时候会亮,按下R_C按键的时候也会亮;
JTAG下载接口,对应下载的文件是SOF文间,速度很快,JTAG将程序直接下载到FPGA中,但是掉电程序丢失,平时学习推荐使用JTAG方式,最后固化程序的时候再通过ASP方式将程序下载到配置芯片中即可;
ASP下载接口,对应下载的是POF文件,速度相对JTAG比较慢,而且需要重新上电并且拔掉下载线,才能工作,操作相对麻烦,不推荐学习的时候使用,最后需要断电操作的情况下再使用ASP下载模式;
4线制RS232串口通信接口以及SRAM片选跳线选择;
当与接口板连接时,改引脚与复用;
25x2双排直插2.54间距用户接口;
螺丝铜柱支撑;
1085-3.3v稳压芯片;
1117-1.2v稳压芯片,提供FPGA核电压;
SRAM芯片IS61LV25616AL256kx16b,(选配件);
AT24C02-I2C存储器件配置芯片EPCS4(4Mb)。
2.3.2开发板功能描述
①VGA接口-利用显示器实现显示图片、文字;
②PS2接口-可以接入PS2键盘;
③串口通信接口-做串口UART通讯实验;
④AD输入调节电位器;
⑤设置引脚、GND、VCC扩展引脚;
⑥外设资源接口双排孔接入;
⑦外设资源接口双排针接入;
⑧DS18B20温度传感器;
⑨LCD1602液晶接口;
⑩主板5v、3.3v电源滤波电路;
主板与接口板双排针接口;
TL4312.5v基准电压电路;
PCF8563时钟电路;
DAC-TLC56158位单通道DA输出;
蜂鸣器电路;
ADC-TLC5498位单通道输入;
8位数码管显示;
4x4矩阵键盘输入;
8路LED输出指示;
红外通讯接口;
4位拨码开关输入;
主板与接口板双排阵接口;
4位独立按键输入。
2.3.3EP2C5T144C8芯片的引脚图
2.4Verilog硬件描述语言的主要能力
基本逻辑门,例如and、or和nand等都内置在语言中。
·
用户定义原语(UDP)创建的灵活性。
用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。
开关级基本结构模型,例如pmos和nmos等也被内置在语言中。
提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查。
可采用三种不同方式或混合方式对设计建模。
这些方式包括:
行为描述方式—使用过程化结构建模;
数据流方式—使用连续赋值语句方式建模;
结构化方式—使用门和模块实例语句描述建模。
VerilogHDL中有两类数据类型:
线网数据类型和寄存器数据类型。
线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。
能够描述层次设计,可使用模块实例结构描述任何层次。
设计的规模可以是任意的;
语言不对设计的规模(大小)施加任何限制。
VerilogHDL不再是某些公司的专有语言而是IEEE标准。
人和机器都可阅读Verilog语言,因此它可作为EDA的工具和设计者之间的交互语言。
VerilogHDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。
PLI是允许外部函数访问Verilog模块内信息、允许设计者与模拟器交互的例程集合。
设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级。
能够使用内置开关级原语在开关级对设计完整建模。
同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。
VerilogHDL能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。
这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。
在行为级描述中,VerilogHDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。
能够使用门和模块实例化语句在结构级进行结构描述。
在VerilogHDL的混合方式建模能力,即在一个设计中每个模块均可以在不同设计层次上建模。
VerilogHDL还具有内置逻辑函数,例如&
(按位与)和|(按位或)。
对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。
可以显式地对并发和定时进行建模。
提供强有力的文件读写能力。
语言在特定情况下是非确定性的,即在不同的模拟器上模型可以产生不同的结果;
例如,事件队列上的事件顺序在标准中没有定义。
第3章乒乓球游戏机的软件设计
3.1乒乓球游戏机系统组成
瓶乓球比赛游戏机的组成如图1所示。
比赛规则约定:
五局三胜;
1分一局;
裁判发出比赛开始信号,触发FPGA内部随机数发生器模块产生首次发球权方;
比赛进行中,选手连续两次获得发球权后,发球权交予对方,如未获发球权方发球,裁判端犯规音响电路鸣响;
6个LED排列成行模拟乒乓球台(因为我的开发板上只有6个LED灯,比赛开始时候中间两个灯亮,如果有条件的话有10来个灯最好了);
点亮的LED模拟乒乓球,受FPGA控制从左到右或从右到左移动;
比赛选手通过按钮输入模拟击球信号,实现LED移位方向的控制;
若发亮的LED运动在球台中点至对方终点之间时,对方未能及时按下击球按钮使其向相反方向移动,即失去一分。
3.1.2功能模块设计
图1中,基于FPGA设计的控制端为整个系统的核心,其内部主要由简易随机数发生器、发球权控制器、乒乓球位置控制器、甲乙方计分控制器、犯规音响控制器等模块组成。
整个控制端采用模块化设计,先用Verilog语言编写功能模块,然后用顶层原理图将各功能模块连接起来。
设计的难点在于协调各模块工作,严格遵守各信号间时序关系。
本系统采用50MHz系统时钟。
简易随机数发生器比赛首次发球权由随机数发生器产生的数据决定,其随机性要求不严,因此,采用非常简单的模式产生,即一旦FPGA上电,系统时钟百分频产生一方波信号square,当裁判闭合开始比赛开关产生start信号上升沿时,读取此时square信号值作为随机数发生器输出data_rand。
模块仿真如图2所示,结果满足设计要求。
此模块设计时保证了square信号周期应远大于start信号上升沿建立时间,保证随机数据的正确读取。
3.2发球权控制器
发球权控制器的控制过程为:
如果按下复位按钮,发球权数码管显示8,否则,开始比赛开关闭合时,显示随机数发生器的值(0或1,0代表甲方、1代表乙方)。
而在比赛中,为遵守发球权交换规则,设计甲乙双方计分器总和信号sum是不为0的偶数时(即计分总次低位变化时),发球权数码管显示由0变为1或由1变为0。
此模块设计中,发球权数码管的信号控制受多个时钟的控制,即开始比赛开关start和计分值sum[1]信号,将两个信号组合成一个时钟信号,并统一两个时钟的触发沿。
因此最佳时钟触发方式如图3所示的qq_en信号。
为满足这种时序要求,借助计分总和次低位sum_1信号和启动信号start设计qq_en信号。
3.3乒乓球位置控制
乒乓球位置控制、甲乙计分、犯规音响控制乒乓球位置控制电路为FPGA控制端的核心,依据比赛规则,采用了Mealy型状态机[10]来实现,大大降低了设计难度。
状态机共定义了7个状态,各状态定义如表1所示,状态转换如图5所示,转换条件如表2所示,具体程序如下。
3.3.1基于FPGA乒乓球比赛游戏机顶层原理图
结论
经过这次对乒乓球游戏机系统的设计,让我对EDA设计有了更进一步的认识,同时也对EDA这门课程游客更深入的了解。
这次设计让我了解了关于乒乓球游戏机的原理课设计理念,要设计一个电路要先进行软件仿真再进行实际的电路制作。
通过这次设计让我收获不小。
这次的课程设计终于顺利完成了,也解决了设计中遇见的一些问题。
这次设计让我受益匪浅。
对软件运用更加的熟练。
在摸索该如何设计程序使之实现的过程中,培养并锻炼了我的设计思维,增加了实际操作经验,锻炼了能力,总的来说这次收获了很多,基本能够学以致用。
根据所学课程,数字电子技术、模拟电子技术、Verilog、EDA等所学知识的应用在设计过程中都得到了相应巩固,我们对本专业的了解也更深了一层。
经过了这次自己实践动手的设计,自己的分析能力得到了提高,动手能力也有很大进步,从中也收获了很多经验,希望今后类似这样课程设计、类似这样的锻炼机会能更多些。
我想在今后的实践过程中我会有更大的进步,也会做的越来越好。
参考文献
[1]侯建军,SOPC技术基础教程,清华大学出版社,2008-05
[2]
童诗白.
华成英.
模拟电子技术基础[M].
高等教育出版社,2006-5
[3]
邱关源.
电路.
高等教育出版社[M].
[4]
王新梅.
肖国镇.
纠错码——原理与方法[M].
西安电子科技大学出版
[5]
曹昕燕.
周凤臣.
EDA技术实验与课程设计[M].
清华大学出版社,2006-5
[6]王金明数字系统设计与VerilogHDL[M]电子工业出版社,2009-1
附录
pp_en信号产生模块如下:
modulepp_en(clk,start,sum_1,pp_en,cnt);
inputclk;
inputstart;
//裁判启动信号
inputsum_1;
//总局数sum次低位sum[1]
outputpp_en;
output[4:
0]cnt;
//pp_en信号个数
//----------------------------------------------------
regsum_1_a,sum_1_b;
regstart_a,start_b;
reg[4:
0]cnt_r;
always@(posedgeclk)
begin
start_a<
=start;
start_b<
=start_a;
sum_1_a<
=sum_1;
sum_1_b<
=sum_1_a;
end
if(pp_en)
cnt_r<
=cnt_r+4'
b1;
else
=cnt_r;
assigncnt=cnt_r;
assignpp_en=(start_a^start_b)|(sum_1_a^sum_1_b);
endmodule
根据pp_en信号和随机数data_rand控制甲乙球权模块:
modulepp_possession(clk,reset,data_rand,pp_en,cnt,led_pose);
inputreset;
inputdata_rand;
inputpp_en;
input[4:
output[3:
0]led_pose;
//甲乙球权输出,0代表甲,1代表乙。
//---------------------------------------------------
reg[3:
0]led_pose_r;
always@(posedgeclkornegedgereset)
if(!
reset)
led_pose_r<
=4'
d8;
begin
if(cnt==5'
b1)
={3'
b0,data_rand};
=!
led_pose_r;
end
led_po