FPGA课程设计报告.docx
《FPGA课程设计报告.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计报告.docx(23页珍藏版)》请在冰点文库上搜索。
![FPGA课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/2a961e52-d239-429d-8253-be35d7012f8f/2a961e52-d239-429d-8253-be35d7012f8f1.gif)
FPGA课程设计报告
FPGA课程设计报告
专 业:
通信工程
班 级:
班
姓 名:
学 号:
指导老师:
祝 宏
制作日期:
11.10—11.20
设计课题1:
设计一个可控的100进制可逆计数器,要求用DE2-115开发板下载。
(1) 计数器的时钟输入信号周期为200ns。
(2) 以十进制形式显示。
(3) 有一个复位端clr和两个控制端plus和minus,在这些控制信号的作用下,计数器具有复位、增或减计数、暂停功能。
clr
plus
minus
功能
0
×
×
复位为0
1
1
0
递增计数
1
0
1
递减计数
1
1
1
暂停计数
设计步骤
第一步:
参考书中的60进制计数器设计出100进制的加法计数器,用时30分钟;
第二步:
仿照100进制的加法可以设计出100进制的减法计数器,用时45分钟;
第三步:
将两段程序拼凑起来,利用两个控制端控制加减和暂停功能,用时15分钟。
关键词
可逆;暂停;循环计数。
内容摘要
计数器具有复位、增减计数和暂停功能,可循环计数,可用作平时的
计数器用。
总体方案
顶层逻辑电路图
上图为100进制可逆计数器的封装图,sw[0]控制计数脉冲的频率大小,sw[1]控制清零端,sw[2]和sw[3]为两个控制端plus和minus,hex1和hex0分别显示100进制的十位和个位。
底层功能模块设计
100进制可逆加减的程序代码:
module count100(qout,//输出的数字
cout,//进位
data,//置位数字
load,//置位端
clr,//清零端
clk,//时钟脉冲
plus,//控制端
minus//控制端);
input load,clk,clr,plus,minus;input[7:
0] data;//输入
output [7:
0] qout;
reg[7:
0] qout;output cout;//输出
always @(posedge clk)//脉冲
begin
if(!
clr) qout<=0;//如果清零端为0,将输出清零
elseif(load)qout<=data;//如果置数端为1,将置数端数字给输出
else if(plus&!
minus&qout[3:
0]==9&qout[7:
4]==9) qout<=0;//当plus为1且minus为0时如果计数到99时回到00
else if(plus&!
minus)//plus为1,minus为0,递增计数
begin
if(qout[3:
0]==9)
begin
qout[3:
0]<=0;
if(qout[7:
4]==9) qout[7:
4]<=0;
else
qout[7:
4]<=qout[7:
4]+1;
end
else qout[3:
0]<=qout[3:
0]+1;
end
else if(!
plus&minus)//plus为0,minus为1,递减计数
begin
if(qout[3:
0]==0)
begin
qout[3:
0]<=9;
if (qout[7:
4]==0) qout[7:
4]<=9;
else
qout[7:
4]<=qout[7:
4]-1;
end
else qout[3:
0]<=qout[3:
0]-1;
end
else if(plus&minus) // qout<=qout;//plus为1,minus为1,暂停计数
else qout<=0; //为其他时清零
end
assign cout=(qout==8'd99)?
1:
0;//为99时进位端进
endmodule
注释:
利用plus和minus的几种组合可控制加减和暂停计数。
利用清零端可将计数清零,以便计数。
各模块功能仿真波形显示的结果:
当plus为1,minus为0时,递增计数到99时下一刻为00。
当clk为0时,计数器清零。
当plus为0,minus为1时,递减计数,00时下一秒变为99。
当plus为1,minus为1,暂停计数。
设计中遇到问题及解决方法
在设计时,我用的是让其自己加减的方法,在仿真时可以做出正确的结果,但是在下载板中显示时,个位一直从0加到了F才向十位进位,我感觉到可能是程序出错了,我没有将十位和个位分开,而是写在了一起,导致默认为十六位计数,于是我将程序改为分开计数,最后终于成功了。
心得体会
从第一个简单的实验中我感觉到,看起来简单的事,可能自己亲手做的时候就会 发现很多问题,这些问题都要自己去解决,后面的两个实验更难,我需要更多的去开动脑筋,多多查阅资料,力争做好。
设计课题2:
交通灯控制系统,要求用DE2-115开发板下载。
(1) 设计一个十字路口交通信号灯的定时控制电路。
要求红、绿灯按一定的规律亮和灭,绿灯亮时,表示该车道允许通行;红灯亮时,该车道禁止通行。
并在亮灯期间进行倒计时,并将运行时间用数码管显示出来。
(2)要求主干道每次通行时间为40秒,支干道每次通行时间为30秒。
每次变换运行车道前绿灯闪烁,持续时间为5秒。
即车道要由主干道转换为支干道时,主干道在通行时间只剩5秒钟时,绿灯闪烁5秒显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。
同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。
(3)定时器要求采用递减计时方式进行计时。
两个定时时间:
绿灯闪烁和绿灯停止闪烁
4个状态:
S0:
主干道绿灯亮,支干道红灯亮。
S1:
主干道绿灯闪烁,支干道红灯亮。
S2:
支干道绿灯亮,主干道红灯亮。
S3:
支干道绿灯闪烁,主干道红灯亮
设计步骤
第一步:
在程序内部转载一个计数器,从70递减计数到00,如此循环。
用时15分钟。
第二步:
设计主干道的计时器,从40到00,主干道绿灯亮,最后五秒时绿灯闪烁,支干道红灯亮。
用时120分钟。
第三步:
设计支干道的计时器,从30到00,支干道绿灯亮,最后五秒时绿灯闪烁,主干道红灯亮。
用时60分钟。
关键词
交通灯;十字路口;倒计时闪烁。
内容摘要
该红绿灯可实现十字路口的交通管制,主干道和支干道分别通行40秒和30秒如此循环,可便于交通顺畅,通行与否由红绿灯予以提示。
总体方案
顶层逻辑电路图
上图为红绿灯的封装图,sw[0]为脉冲频率控制端,sw[1]为清零端,LEDR[0]为主干道红灯,LEDG[0]为主干道绿灯,LEDR[1]为支干道红灯,LEDG[1]为支干道绿灯,HEX7为主干道秒钟的十位,HEX6为主
干道秒钟的个位,HEX5为支干道秒钟的十位,HEX4为支干道秒钟的个位。
底层功能模块设计
红绿灯的程序代码:
module led(clk, //脉冲
clr, //清零端
m_ledr, //主干道红灯
m_ledg, //主干道绿灯
s_ledr, //支干道红灯
s_ledg, //支干道绿灯
count1, //主干道秒钟
count2 //支干道秒钟
);
input clk,clr;
output m_ledr,m_ledg,s_ledr,s_ledg;
output[7:
0] count1,count2;
reg m_ledr,m_ledg,s_ledr,s_ledg;
reg[7:
0] count1,count2;
reg[1:
0] state;
reg[7:
0] times;
parameter state0=2'b00, //定义四种状态
state1=2'b01,
state2=2'b10,
state3=2'b11;
always @(posedge clk or negedge clr)
begin
if(!
clr) //清零
begin
times<=8'h70; //计数清零
state<=state0; //状态复位
end
else if(times==0) //计数为零
times<=8'h70; //计数预置
else
begin
times[3:
0]<=times[3:
0]-1; //计数个位减一
if(times[3:
0]==4'h0) //判断计数个位是否为零
begin
times[7:
4]<=times[7:
4]-1; //十位减一
times[3:
0]<=4'h9; //个位置数
end
case(state) //是哪种状态?
state0:
if(times==8'h36) //状态零阶段,计数器为36~70
state<=state1; //状态转换
state1:
if(times==8'h31) //状态一阶段,计数器为31~35
state<=state2; //状态转换
state2:
if(times==8'h6) //状态二阶段,计数器为6~30
state<=state3; //状态转换
state3:
if(times==8'h1) //状态三阶段,计数器为1~5
begin
state<=state0; //状态转换
times<=8'h70; //计数清零
end
endcase
end
end
always @(posedge clk)
begin
if(times!
=0) //计数不为零吗?
begin
case(state) //是哪种状态?
(状态机输出)
state0:
begin
m_ledg<=1; //状态零,主干道红灯灭,绿灯亮。
支干道红灯亮,绿灯灭。
m_ledr<=0;
s_ledg<=0;
s_ledr<=1;
count2<= times-8'h30;//支干道计数显示
count1<=times-8'h30; //主干道时间显示
end
state1:
begin
m_ledg<=~m_ledg; //状态一,主干道红灯灭,绿灯闪烁。
支干道红灯亮,绿灯灭。
m_ledr<=0;
s_ledg<=0;
s_ledr<=1;
count1<=times-8'h30; //主干道时间显示count2<= times-8'h30; //支干道计数显示
end
state2:
begin
m_ledg<=0; //状态二,主干道红灯亮,绿灯灭。
支干道红灯灭,绿灯亮。
m_ledr<=1;
s_ledg<=1;
s_ledr<=0;
count1<=times; //主干道计数显示
count2<=times; //支干道时间显示
end
state3:
begin
m_ledg<=0; //状态三,主干道红灯亮,绿灯灭。
支干道红灯灭,绿灯闪烁。
m_ledr<=1;
s_ledg<=~s_ledg;
s_ledr<=0;
count2<=times; //支干道时间显示
count1<=times; //主干道计数显示
end
endcase
end
end
endmodul
注释:
四种状态分别对应题设要求的四种状态,之所以设一个70进制的递减计数器是因为主干道的40秒和支干道的30秒是循环显示的,可以放在一起递减。
各模块功能仿真波形显示的结果
主干道count1从40递减到00,支干道count2从40递减到00,主干道绿灯m_ledg在最后五秒闪烁,支干道红灯s_ledr亮之后转为支干道绿灯s_ledg亮,主干道红灯m_ledr亮。
支干道count2从30递减到00,主干道count1从30递减到00,支干道绿灯s_ledg在最后五秒闪烁,主干道红灯m_ledr亮之后转为主干道绿灯m_ledg亮,支干道红灯s_ledr亮。
设计中遇到问题及解决方法
在设计过程中,之前打算是分开计数,后来发现太麻烦,问过同学后决定采用他的方法,在程序中放一个计数器,使得计数变得简单,后来在四种状态设置时,我参考书上的用状态机的方法,使得四种状态变得清楚明朗,让我出现错误的概率变小了,由于题设木有说明当主干道显示时,支干道显示什么,我觉得也要让支干道的人知道还有多久可以通车,于是将主干道的时间也给了支干道,同样在支干道倒计时时主干道也在倒计时,这样可以让司机估计好时间。
闪烁的灯开始时不知道怎么设置,后来问同学了知道改为灯等于灯的非就好了,这是我收获到的。
心得体会
从这次的设计红绿灯的实验中,我感到了很大的压力,感觉平时看着红绿灯在街上倒计时蛮简单的,什么事情都是想的很简单,真正要自己上手去做的时候才会发现很多自己不懂的知识,例如控制主干道和支干道的循环,跳变,如何让绿灯在特定的时间闪烁,都是设计者需要去考虑的问题,以及自己的作品在实际生活中应用,会不会有什么问题,如何让其更加简单明朗,让人们一看就明白,我更加明白了自己的责任,和更多应该注意的问题。
设计课题3:
多功能数字钟系统(层次化设计),要求用DE2-115开发板下载。
(1)基本功能:
60秒—60分—24小时。
(2)扩展功能:
①报时;每小时59分51,53,55,57秒低频报时,59秒高频报时。
②校时校分; ③时段控制;6点—18点 输出灯不亮,其它时间灯亮。
④闹钟功能:
能自己预设一个时间,到预设时间时,闹钟响起,持续一分钟。
设计步骤
第一步:
设计60进制的加法计数器,带进位,用时15分钟; 第二步:
设计24进制的加法计数器,用时30分钟;
第三步:
将两个60和一个24的计数器组合成一个数字钟,实现其基本功能,用时120分钟;
第四步:
设计时段控制,6-18点输出灯不亮,其他时间亮,用时30分钟; 第五步:
设计报时功能,由于缺少蜂鸣器,用指示灯代替,每小时59分51,53,55,57秒时红灯亮,59秒时红灯亮,用时60分钟;
第六步:
另外设置一个计数器,通过使能端控制,作为校时校分的预设数,通过使能端将预设数送入数字钟内,用时两周;
第七步:
通过使能端将另外的计数器作为闹钟,预设一个时间,由于缺少蜂鸣器,用显示灯代替,当时钟走到预设的时间时,预设的红灯闪烁,持续一分钟,用时120分钟。
关键词
数字钟;校时校分;整点转换提示;时段控制;闹钟。
内容摘要
该数字钟可实现普通时钟的计时功能,为24进制,可实现手动校时校分,方便更改时间,该数字钟可实现时段控制的功能,在深夜时开灯照明,在白天时关闭照明,省电;整点转换时会有相应的提示,方便提示用户,在老师要求的基础下,我给这个数字钟设计了一个闹钟的功能,用户可以手动设定闹钟的时间,方便用户的起床和事项安排。
总体方案
顶层逻辑电路图
注释:
上图为数字钟的封装图,图中,sw[0]控制暂停,sw[1]控制脉冲频率,sw[2]控制复位端,sw[3]控制另一计数器的分钟部分,sw[4]控制校分,sw[5]控制另一计数器的小时部分,sw[6]控制校时,sw[7]sw[8]控制最后两个数码管显示另一计数器的小时还是分钟部分,sw[9]为闹钟控制端,hex7hex6显示数字钟的小时部分,hex5hex4显示数字钟的分钟部分,hex3hex2显示数字钟的秒钟部分,hex1hex0显示另一计数器的小时或者分钟部分,ledr[0]为控制端的亮灯,ledg[0]为每小时59分59秒时的绿灯,ledr[1]为每小时59分51、53、55、57的亮灯,ledr[2]为闹钟的亮灯。
底层功能模块设计
程序代码:
module shizhong(qout,//数字钟秒钟
reset,//复位端
clk,//脉冲
qout1,//数字钟分钟
qout2,//数字钟小时
data,//置数显示
data1,//置数的分钟
data2,//置数的小时
led,//控制端的灯
leg,//每小时59分59秒的绿灯
ler,//每小时59分51、53、55、57秒的红灯
ler1,//闹钟亮灯
h,//校时
m,// 校分
a,//控制置数分钟的变化
b,//控制显示置数的分钟
c,//控制置数小时的变化
d,//控制显示置数的小时
e);//闹钟控制端
input clk,reset,h,m,a,b,c,d,e;
output reg[7:
0] qout,data;
output reg[7:
0] qout1,data1;
output reg[7:
0] qout2,data2;
output reg led;
output reg leg,ler,ler1;
always @(posedge clk)
begin
begin
if(a==1)//调整置数的分钟部分
begin
if(data1[3:
0]==9)
begin data1[3:
0]<=0;
if(data1[7:
4]==5)
begin
data1[7:
4]<=0;
end
else data1[7:
4]<=data1[7:
4]+1;
end
else data1[3:
0]<=data1[3:
0]+1; end
end
begin
if(b==1)//控制置数分钟的显示
data<=data1;
end
begin
if(c==1)//控制置数小时的变化
begin
begin
if(data2[3:
0]==9)
begin data2[3:
0]<=0;
begin
data2[7:
4]<=data2[7:
4]+1;
end
end
else data2[3:
0]<=data2[3:
0]+1;
end
if(data2[7:
4]==2&data2[3:
0]==3) data2<=0; end
end
begin
if(d==1)//控制置数小时的显示
data<=data2;
end
begin
if(reset) //复位
begin
qout<=0;
qout1<=0;
qout2<=0;
end
else if(h)//校时
begin
qout2<=data;
end
else if(m)//校分
begin
qout1<=data;
end
else //正常计数部分
begin
if(qout[3:
0]==9)
begin qout[3:
0]<=0;
begin
if(qout[7:
4]==5)
begin
qout[7:
4]<=0;
begin
if(qout1[3:
0]==9)
begin qout1[3:
0]<=0;
if(qout1[7:
4]==5)
begin
qout1[7:
4]<=0;
begin
if(qout2[3:
0]==9)
begin qout2[3:
0]<=0;
begin
qout2[7:
4]<=qout2[7:
4]+1;
end
end
else qout2[3:
0]<=qout2[3:
0]+1;
end
if(qout2[7:
4]==2&qout2[3:
0]==3) qout2<=0; end
else qout1[7:
4]<=qout1[7:
4]+1;
end
else qout1[3:
0]<=qout1[3:
0]+1;
end
end
always @(qout2)//时段控制亮灯,6-18时不亮,其他时刻亮
begin
if(qout2>8'h5&qout2<8'h19)
led<=0;
else
led<=1;
end
always @(qout)//报时部分
begin
leg<=0;
ler<=0;
if(qout1==8'h59)
begin
if(qout==8'h59)//每小时59分59秒时
leg<=1;
if(qout==8'h51||qout==8'h53||qout==8'h55||qout==8'h57) ler<=1;
end
end
endmodule
各模块功能仿真波形显示的结果
当时钟走到23小时59分59秒时leg灯亮,为51、53、55、57秒时ler灯亮。
时段控制,6-18点时led灯不亮,其他时段亮灯。
当a为1时,data1自动递增,为0时暂停,当b为1时把data1的数给data显示,当m为1时把置好的data1给qout1,校分功能实现。
当c为1时,data2自动递增,为0时暂停,当d为1时把data2的数给data显示,当h为1时把置好的data给qout2,校时功能实现。
当时钟走到预设的时间,闹钟开关e打开时ler1灯开始闪烁,提示闹钟时间到。
心得体会
在最后一个实验完成的时候我的心情真是无比的开心啊,从最初的一无所知到最后一直坚持着实验的做完,感觉自己像是完成了一项伟大的任务,内心无比的激动与自豪。
同时,在此过程中我也遇到了不少问题,同学们也都热情的给与了帮助,这也让我感觉到了团队的智慧终究不是