FPGA课程设计报告.docx

上传人:b****1 文档编号:768481 上传时间:2023-04-30 格式:DOCX 页数:23 大小:1.46MB
下载 相关 举报
FPGA课程设计报告.docx_第1页
第1页 / 共23页
FPGA课程设计报告.docx_第2页
第2页 / 共23页
FPGA课程设计报告.docx_第3页
第3页 / 共23页
FPGA课程设计报告.docx_第4页
第4页 / 共23页
FPGA课程设计报告.docx_第5页
第5页 / 共23页
FPGA课程设计报告.docx_第6页
第6页 / 共23页
FPGA课程设计报告.docx_第7页
第7页 / 共23页
FPGA课程设计报告.docx_第8页
第8页 / 共23页
FPGA课程设计报告.docx_第9页
第9页 / 共23页
FPGA课程设计报告.docx_第10页
第10页 / 共23页
FPGA课程设计报告.docx_第11页
第11页 / 共23页
FPGA课程设计报告.docx_第12页
第12页 / 共23页
FPGA课程设计报告.docx_第13页
第13页 / 共23页
FPGA课程设计报告.docx_第14页
第14页 / 共23页
FPGA课程设计报告.docx_第15页
第15页 / 共23页
FPGA课程设计报告.docx_第16页
第16页 / 共23页
FPGA课程设计报告.docx_第17页
第17页 / 共23页
FPGA课程设计报告.docx_第18页
第18页 / 共23页
FPGA课程设计报告.docx_第19页
第19页 / 共23页
FPGA课程设计报告.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

FPGA课程设计报告.docx

《FPGA课程设计报告.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计报告.docx(23页珍藏版)》请在冰点文库上搜索。

FPGA课程设计报告.docx

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灯开始闪烁,提示闹钟时间到。

心得体会

在最后一个实验完成的时候我的心情真是无比的开心啊,从最初的一无所知到最后一直坚持着实验的做完,感觉自己像是完成了一项伟大的任务,内心无比的激动与自豪。

同时,在此过程中我也遇到了不少问题,同学们也都热情的给与了帮助,这也让我感觉到了团队的智慧终究不是

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2