FPGA课程设计.docx
《FPGA课程设计.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
FPGA课程设计
F
P
G
A
课
程
设
计
报
告
专业:
12级电子信息工程
班级:
一班
姓名:
李威
学号:
120101011109
指导老师:
祝宏
制作日期:
2014年11月20号
1、任务书:
第九周(10月27号至11月2号):
一百进制可逆计数器的模块原理设计,代码编写,波形仿真,代码调试,模块封装以及管脚分配任务。
第十周(11月3号至11月9号):
完成第二道设计课题(交通灯)和第三道设计课题(多功能数字钟)模块原理设计,代码编写,波形仿真,代码调试,模块封装以及管脚分配任务。
第十一周(11月10号至11月16号):
在实验室使用ED2-115开发板进行功能模块实际演示。
第十二周(11月17号至11月23号):
完成对FPGA课程设计报告的书写。
2、报告内容:
设计课题一、一百进制可逆计数器
1)实验要求:
设计一个可控的100进制可逆计数器,要求用DE2-115开发板下载。
(1)计数器的时钟输入信号周期为1S。
(2)以十进制形式显示。
(3)有一个复位端clr和两个控制端plus和minus,在这些控制信号的作用下,计数器具有复位、增或减计数、暂停功能。
clr
plus
minus
功能
0
×
×
复位为0
1
1
0
递增计数
1
0
1
递减计数
1
1
1
暂停计数
图1-1
2)信号定义:
分频模块:
ncR:
暂停 ; CLOCK_50:
500Hz分频 ;
s:
1000Hz分频;
译码模块:
indec_0~7:
译码输入; outdec_0~7:
译码输出;
计数模块:
clk :
脉冲 ; clear复位端; plus:
加计数使能端;
minus:
减计 数使能端 ; cin:
计数使能端 ;
3)主要模块verilog代码及注示:
modulecount100(clk,clear,plus,minus,qout,cin);
inputclk,clear,plus,minus,cin;//输入由开关控制拨上为1,拨下为0
output[7:
0]qout;
reg[7:
0]qout;
always@(posedgeclk)
beginif(clear)qout<=0;//如果复位端为1则执行复位功能
elseif((plus)&&(!
minus))//若plus为1且minus为0时加计数
begin
if(cin)//使能端为1时才进行计数
begin
if(qout[3:
0]==9)//模为100的计数
begin
qout[3:
0]<=0;
if(qout[7:
4]==9)qout[7:
4]<=0;
elseqout[7:
4]<=qout[7:
4]+1;
end
elseqout[3:
0]<=qout[3:
0]+1;
end
end
elseif((!
plus)&&(minus))//若plus为0且minus为1进行减计数
beginif(cin)
if(qout[3:
0]==0)
begin
qout[3:
0]<=9;
if(qout[7:
4]==0)qout[7:
4]<=9;
elseqout[7:
4]<=qout[7:
4]-1;
end
elseqout[3:
0]<=qout[3:
0]-1;
end
Else//若plus和minus均为1则暂停
qout<=qout;
end
endmodule
4)模块封装图:
5)对应各模块功能仿真波形(数据分析)分析及结论
图1-2
如图1-2所示当复位端clear为1时输出qout为0,当复位端clear为0时计数器开始正常计数
us
图1-3
如图1-3所示当复位端clear为0且使能端cin为1,plus为1,minus为0时进行加计数
图1-4
如图1-4所示当复位端clear为0且使能端cin为1,plus为0,minus为1时进行减计数.
6)选用芯片型号、定义芯片管脚号
选用芯片型号:
CycloneIVE
芯片管脚:
CLOCK_50
Input
PIN_Y2
2
B2_N0
3.3-V
SW[4]
Input
PIN_AB27
5
B5_N1
2.5V
SW[3]
Input
PIN_AD27
5
B5_N2
2.5V
SW[2]
Input
PIN_AC27
5
B5_N2
2.5V
SW[1]
Input
PIN_AC28
5
B5_N2
2.5V
SW[0]
Input
PIN_AB28
5
B5_N1
2.5V
HEX0[6]
Output
PIN_H22
6
B6_N0
2.5V
HEX0[5]
Output
PIN_J22
6
B6_N0
2.5V
HEX0[4]
Output
PIN_L25
6
B6_N1
2.5V
HEX0[3]
Output
PIN_L26
6
B6_N1
2.5V
HEX0[2]
Output
PIN_E17
7
B7_N2
2.5V
HEX0[1]
Output
PIN_F22
7
B7_N0
2.5V
HEX0[0]
Output
PIN_G18
7
B7_N2
2.5V
HEX1[6]
Output
PIN_U24
5
B5_N0
2.5V
HEX1[5]
Output
PIN_U23
5
B5_N1
2.5V
HEX1[4]
Output
PIN_W25
5
B5_N1
2.5V
HEX1[3]
Output
PIN_W22
5
B5_N0
2.5V
HEX1[2]
Output
PIN_W21
5
B5_N1
2.5V
HEX1[1]
Output
PIN_Y22
5
B5_N0
2.5V
HEX1[0]
Output
PIN_M24
6
B6_N2
2.5V
表1-2
设计课题二、交通灯
1)实验要求:
交通灯控制系统,要求用DE2-115开发板下载。
(1)设计一个十字路口交通信号灯的定时控制电路。
要求红、绿灯按一定的规律亮和灭,绿灯亮时,表示该车道允许通行;红灯亮时,该车道禁止通行。
并在亮灯期间进行倒计时,并将运行时间用数码管显示出来。
(2)要求主干道每次通行时间为40秒,支干道每次通行时间为30秒。
每次变换运行车道前绿灯闪烁,持续时间为5秒。
即车道要由主干道转换为支干道时,主干道在通行时间只剩5秒钟时,绿灯闪烁5秒显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。
同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。
(3)定时器要求采用递减计时方式进行计时。
注:
TimeH、TimeL分别表示计数器的高位和低位
HG、HR分别表示主干道的绿灯和红灯
CG、CR分别表示支干道的绿灯和红灯
两个定时时间:
绿灯闪烁和绿灯停止闪烁
4个状态:
S0:
主干道绿灯亮,支干道红灯亮。
S1:
主干道绿灯闪烁,支干道红灯亮。
S2:
支干道绿灯亮,主干道红灯亮。
S3:
支干道绿灯闪烁,主干道红灯亮。
2)顶层逻辑电路图组成、信号定义及原理简单叙述
图2-1
3)信号定义:
分频模块:
ncR:
暂停CLOCK_50:
500Hz分频s:
1000Hz分频
译码模块:
indec_0~7:
译码输入outdec_0~7:
译码输出
功能模块:
en:
脉冲acount:
主干道计数器bcount:
支干道计数器lampa0:
主干道绿灯lampa1:
主干道红灯lampb0:
支干道绿灯lampb1:
支干道红灯
4)交通灯代码:
moduletraffic(clk,en,lampa0,lampb0,lampa1,lampb1,acount,bcount);
output[7:
0]acount,bcount;//acount代表主干道计数器bcount代表支干道计数器
outputlampa0,lampb0,lampa1,lampb1;//0代表绿灯1代表红灯a代表主干道b代表支干道
inputclk,en;
reg[2:
0]counta,countb;
reg[7:
0]numa,numb;
regtempa,tempb;
reg[7:
0]ared,agreen,bred,bgreen;
reglampa0,lampb0,lampa1,lampb1;
always@(en)
if(!
en)//设置灯亮的时间
begin
ared<=8'h30;//主干道红灯亮30秒
agreen<=8'h40;//主干道绿灯亮40秒
bred<=8'h40;//支干道红灯亮40秒
bgreen<=8'h30;//支干道绿灯亮30秒
end
assignacount=numa;//设置中间变量进行计数
assignbcount=numb;
always@(posedgeclk)
begin
if(en)
begin//设置中间变量使计数可以循环进行
if(!
tempa)//若tenpa为0则继续往下执行
begin
tempa<=1;
case(counta)//用counta作为主干道状态选择0则亮绿灯1则亮红灯
0:
beginnuma<=agreen;lampa0<=1;lampa1<=0;counta<=1;end
1:
beginnuma<=ared;lampa0<=0;lampa1<=1;counta<=0;end
endcase
end
elsebegin//开始倒计时
if(numa>1)
if(numa[3:
0]==0)begin
numa[3:
0]<=4'b1001;
numa[7:
4]<=numa[7:
4]-1;
end
elsenuma[3:
0]<=numa[3:
0]-1;
if(numa==2)tempa<=0;
end
end
elsebegin
lampa0<=0;lampa1<=1;tempa<=0;counta<=0;
end
if((numa<7)&&(counta==1)&&(numa>1))lampa0<=~lampa0;//最后5秒/绿灯闪烁
end
always@(posedgeclk)
begin
if(en)
begin
if(!
tempb)//设置中间变量使计数可以循环进行
begin
tempb<=1;
case(countb)//用countb作为支干道状态选择0则亮红灯1则亮绿灯
0:
beginnumb<=bred;lampb0<=0;lampb1<=1;countb<=1;end
1:
beginnumb<=bgreen;lampb0<=1;lampb1<=0;countb<=0;end
endcase
end
elsebegin
if(numb>1)//开始倒计时
if(numb[3:
0]==0)begin
numb[3:
0]<=4'b1001;
numb[7:
4]<=numb[7:
4]-1;
end
elsenumb[3:
0]<=numb[3:
0]-1;
if(numb==2)tempb<=0;
end
end
elsebegin
lampb0<=0;lampb1<=1;tempb<=0;countb<=0;
end
if((numb<7)&&(numb>1)&&(lampa1==1))lampb0<=~lampb0;//最后5秒绿灯闪烁
end
endmodule
5)模块封装图:
6)对应各模块功能仿真波形(数据分析)分析及结论
图2-2
如图2-2所示主干道绿灯(lampa0)亮40秒(acount)同时支干道红灯(lampb1)亮,最后5秒主干道绿灯闪烁,然后红绿灯转换。
图2-3
如图2-3所示支干道绿灯(lampb0)亮30秒(bcount)同时主干道红灯(lampb1)亮30秒,最后5秒支干道绿灯闪烁,然后红绿灯转换,最后如上述进行依次循环。
7)选用芯片型号、定义芯片管脚号(列表格示意)及简述下载过程
选用芯片型号:
CycloneIVE
芯片管脚:
CLOCK_50
Input
PIN_Y2
2
B2_N0
3.3-V
HEX0[6]
Output
PIN_H22
6
B6_N0
2.5V
HEX0[5]
Output
PIN_J22
6
B6_N0
2.5V
HEX0[4]
Output
PIN_L25
6
B6_N1
2.5V
HEX0[3]
Output
PIN_L26
6
B6_N1
2.5V
HEX0[2]
Output
PIN_E17
7
B7_N2
2.5V
HEX0[1]
Output
PIN_F22
7
B7_N0
2.5V
HEX0[0]
Output
PIN_G18
7
B7_N2
2.5V
HEX1[6]
Output
PIN_U24
5
B5_N0
2.5V
HEX1[5]
Output
PIN_U23
5
B5_N1
2.5V
HEX1[4]
Output
PIN_W25
5
B5_N1
2.5V
HEX1[3]
Output
PIN_W22
5
B5_N0
2.5V
HEX1[2]
Output
PIN_W21
5
B5_N1
2.5V
HEX1[1]
Output
PIN_Y22
5
B5_N0
2.5V
HEX1[0]
Output
PIN_M24
6
B6_N2
2.5V
HEX2[6]
Output
PIN_W28
5
B5_N1
2.5V
HEX2[5]
Output
PIN_W27
5
B5_N1
2.5V
HEX2[4]
Output
PIN_Y26
5
B5_N1
2.5V
HEX2[3]
Output
PIN_W26
5
B5_N1
2.5V
HEX2[2]
Output
PIN_Y25
5
B5_N1
2.5V
HEX2[1]
Output
PIN_AA26
5
B5_N1
2.5V
HEX2[0]
Output
PIN_AA25
5
B5_N1
2.5V
HEX3[6]
Output
PIN_Y19
4
B4_N0
3.3-V
HEX3[5]
Output
PIN_AF23
4
B4_N0
3.3-V
HEX3[4]
Output
PIN_AD24
4
B4_N0
3.3-V
HEX3[3]
Output
PIN_AA21
4
B4_N0
3.3-V
HEX3[2]
Output
PIN_AB20
4
B4_N0
3.3-V
HEX3[1]
Output
PIN_U21
5
B5_N0
2.5V
HEX3[0]
Output
PIN_V21
5
B5_N1
2.5V
LEDG[1]
Output
PIN_E22
7
B7_N0
2.5V
LEDG[0]
Output
PIN_E21
7
B7_N0
2.5V
LEDR[1]
Output
PIN_F19
7
B7_N0
2.5V
LEDR[0]
Output
PIN_G19
7
B7_N2
2.5V
SW[1]
Input
PIN_AC28
5
B5_N2
2.5V
SW[0]
Input
PIN_AB28
5
B5_N1
2.5V
表2-1
设计课题三、多功能数字钟
1)实验要求:
多功能数字钟系统(层次化设计),要求用DE2-115开发板下载。
(1)基本功能:
60秒—60分—24小时。
(2)扩展功能:
①报时;每小时59分51,53,55,57秒低频报时,59秒高频报时。
②校时校分;
③时段控制;6点—18点输出灯不亮,其它时间灯亮。
④独立设计除上述3种功能以外的扩展功能,可加分。
2)信号定义:
分频模块:
ncR:
暂停CLOCK_50:
500Hz分频s:
1000Hz分频
译码模块:
indec_0~7:
译码输入outdec_0~7:
译码输出
功能模块clk:
原始脉冲clks,clkm:
秒钟、分钟的进位脉冲
light:
背景灯remain1、remain2:
整点报时信号
outh、outm、outs:
时钟、分钟、秒钟输出端
alarm:
闹钟输出
3)功能模块代码、封装图以及仿真波形图:
时钟模块代码
modulehours(clkm,outh,light);//时钟模块:
含24进制以及背景灯时段控制
outputouth,light;//输出端口:
outh(时钟显示),light(背景灯)
reg[7:
0]outh;reglight;
inputclkm;//输入端口:
clkm(由分钟进位产生的时钟信号)
always@(posedgeclkm)
begin
/************二十四进制的实现(始)**************/
if(outh[3:
0]<9)//低位小于9的时候
begin
if(outh[3:
0]==3&&outh[7:
4]==2)//到达23后下一个状态为0
begin
outh[3:
0]=0;
outh[7:
4]=0;
end
else
outh[3:
0]=outh[3:
0]+1;//未到23,低位加一
end
else//低位等于9的时候
begin
outh[7:
4]=outh[7:
4]+1;//高位加1
outh[3:
0]=0;//低位为0
end
/***********二十四进制的实现(终)*************/
/*********背景灯时段控制的实现***********/
if(outh[7:
4]<1)//高位为0的时候(0:
00~9:
59)
begin
if(outh[3:
0]<6)//低位小于6(0:
00~5:
59)背景灯亮
light=1;
else
light=0;
end
else//当高位不小于1(10:
00~23:
59)
begin
if(outh[3:
0]>=8||outh[7:
4]>1)
//当高位大于1(20:
00~23:
59)或低位大于等于8(18:
00~19:
59)背景灯亮
light=1;
else
light=0;
end
end
endmodule
分钟模块代码
moduleminute(clks,outm,clkm,sound);//分钟模块:
含60时进制以及整点报时
outputoutm,clkm,sound;//输出端口:
outm(分钟显示),clkm(分钟进位信号)sound(整点报时信号(59分))
regclkm,sound;
reg[7:
0]outm;
inputclks;//输入端口:
clks(秒钟进位产生的时钟信号)
always@(posedgeclks)
begin
if(outm[3:
0]==9)//当低位为9
begin
if(outm[3:
0]==9&&outm[7:
4]==5)//如果此时为59分,下个时钟上升沿来临
begin//分钟归0,产生进位信号,整点报时信号清零
outm[3:
0]=0;
outm[7:
4]=0;
clkm=1;
sound=0;
end
else//否则高位加1,低位为0
begin
outm[7:
4]=outm[7:
4]+1;
outm[3:
0]=0;
end
end
else//如果低位不为(小于)9,
begin
if(outm[3:
0]==8&&outm[7:
4]==5)//如果此时是58分,当下一个时钟上升沿来临
begin
outm[3:
0]=outm[3:
0]+1;//低位加1(59),整点报时为1,进位信号清零
sound=1;
clkm=0;
end
else//此时不是58分,低位加1,进位信号清零
begin
outm[3:
0]=outm[3:
0]+1;
clkm=0;
end
end
end
endmodule
秒钟模块代码
modulesecond(clks,outs,clk,sound,remain1,remain2);//秒钟模块
outputouts,clks,remain1,remain2;//remain1,remain2为整点报时的两种信号
regclks,remain1,remain2;
reg[7:
0]outs;
inputclk,sound;
always@(posedgeclk)
begin
if(outs[3:
0]==9)
begin
if(outs[3:
0]==9&&outs[7:
4]==5)
begin
outs[3:
0]=0;
outs[7:
4]=0;
clks=clks+1;
end
else
begin
outs[7:
4]=outs[7:
4]+1;
outs[3:
0]=0;
end
end
else
begin
outs[3:
0]=outs[3:
0]+1;
clks=0;
end
if(sound)//当分钟到达59分,sound信号来临
begin
if(outs[7:
4]==5&&outs[3:
0]>0&&outs[3:
0]<9)//51~58秒信号灯1开始闪烁
remain1=~remain1;
elseif(outs[7:
4]==5&&outs[3:
0]==9)//59秒信号灯2开始闪烁
remain2=1;
else
begin
remain1=0;
remain2=0;
end
end
end
endmodule
时钟电路部分的各模块封装图:
时钟电路部分的顶层模块结构:
校时校分功能模块
校时校分功能可以通过增大时钟和分钟的时钟信号频率来实现,