FPGA实验 代码分析.docx

上传人:b****5 文档编号:8356894 上传时间:2023-01-30 格式:DOCX 页数:15 大小:107.66KB
下载 相关 举报
FPGA实验 代码分析.docx_第1页
第1页 / 共15页
FPGA实验 代码分析.docx_第2页
第2页 / 共15页
FPGA实验 代码分析.docx_第3页
第3页 / 共15页
FPGA实验 代码分析.docx_第4页
第4页 / 共15页
FPGA实验 代码分析.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

FPGA实验 代码分析.docx

《FPGA实验 代码分析.docx》由会员分享,可在线阅读,更多相关《FPGA实验 代码分析.docx(15页珍藏版)》请在冰豆网上搜索。

FPGA实验 代码分析.docx

FPGA实验代码分析

2014年EDA实验

第一次实验:

实验1:

QII软件及实验板的使用;用图形输入法和语言输入法完成点灯实验(用两个按键控制两个灯的亮灭:

灯的状态随按键状态改变而改变)。

完成软件仿真。

modulesimple_lightcon(inputwire[1:

0]key,outputwire[1:

0]led);

assignled=key;

endmodule

实验2:

联控点灯实验:

用两个按键独立控制同一个灯亮灭,第三个按键同时控制该灯和另一个灯亮灭。

modulecom_lightcon(inputwire[2:

0]key,outputwire[1:

0]led);

assignled[0]=key[0];

assignled[1]=key[0]&(key[2]^key[1]);

endmodule

实验3:

流水灯实验:

完成一个8路流水灯控制实验,要求有以下3种花型:

1)8路灯同时亮灭;

2)从左至右再从右至左逐个亮(每次只有1路亮);

3)8路灯每次4路灯亮,4路灯灭,且亮灭相间,交替亮灭。

用3个按键控制3种花型。

按下花型按键就一直显示相应花型,再按该键可暂停。

可设置1个复位键关闭显示。

/*-------------------------------------------------------------------------------------------------

Filename:

waterlight.v

Author:

Basson

Data:

2014-11-21

Version:

V1.0

Description:

ThisfilehasthemoduleofHDLtop.

ModificationHistory:

DatabyVersionChangeDescription

=========================================================

14/11/21BassonV1.0Original

---------------------------------------------------------------------------------------------------*/

modulewater_light(

inputwiresys_sclk,//时钟信号(输入信号)

inputwiresrst_n,//复位信号(输入信号)

inputwire[2:

0]key,//按键信号(输入信号)

outputreg[3:

0]ledlight//输出接8个led灯(输出信号)

);

//消抖动------------------------------------------------------------------

reg[2:

0]key_reg;//用于存储现有按键

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)key_reg<=3'b111;

elsekey_reg<=key;

end

reg[2:

0]key_reg_r;//用于存储前一按键

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)key_reg_r<=3'b111;

elsekey_reg_r<=key_reg;//用于存储前一按键

end

wire[2:

0]key_an=key_reg_r&(~key_reg);//用于存储按键下降沿

//消抖时间设定为20ms左右-------------------------------------------------------------------

parameterCCNTWITHD=20;

reg[CCNTWITHD-1:

0]ccnt;

reg[2:

0]keyout;

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)ccnt<=20'b0;

elseif(key_an)ccnt<=20'b0;//按键有抖动就清零--消除抖动的计数器

elseccnt<=ccnt+1'b1;//没有抖动,消除抖动的计数器开始加1,延时20ms。

end

reg[2:

0]low_key;//用于记录消除抖动后的现有按键状态

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)low_key<=3'b111;

elseif(ccnt==20'hfffff)

low_key<=key;

end

/*消抖动结束*/

/*流水灯控制部分程序--------------------------------------------------------------------------*/

//可按键标志位------------------------------------------------------------------

reg[2:

0]low_key_r;//用于记录消除抖动后的下一按键状态

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)low_key_r<=3'b111;

else

low_key_r<=low_key;

end

wire[2:

0]key_flag11=low_key_r&(~low_key);//消逗后按键下降沿个数,作为标志位

//标志位------------------------------------------------------------------

reg[2:

0]key_flag1;

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)

begin

key_flag1<=3'b000;

end

else

//花型按键显示相应花型---有优先级电路设计代码

begin

case(key_flag11)

3'b001:

begin

key_flag1={2'b00,~key_flag1[0]};//奇数显示相应花型,偶数暂停

end

3'b010:

begin

key_flag1={1'b0,~key_flag1[1],1'b0};//奇数显示相应花型,偶数暂停

end

3'b100:

begin

key_flag1={~key_flag1[2],2'b00};//奇数显示相应花型,偶数暂停

end

endcase

end

end

wire[2:

0]key_flag=key_flag1;

//50MHZdiv_frequenceto1Hz---------------------------------------------

parameterCOUNTWIDTH=24;

reg[COUNTWIDTH-1:

0]ccount;

//regsclk;

wiressclk;

always@(posedgesys_sclk,negedgesrst_n)

begin

if(srst_n==1'b0)beginccount[COUNTWIDTH-1:

0]<='d0;end

elseccount<=ccount+1'b1;

end

assignssclk=ccount[COUNTWIDTH-1];

//流水灯显示控制程序--------------------------------------------------------

reg[7:

0]s0;

reg[7:

0]s1;

reg[7:

0]s2;

reg[3:

0]count;

always@(posedgessclk,negedgesrst_n)

begin

if(srst_n==1'b0)

begin

s0=4'b0000;s1=4'b1000;s2=4'b1010;count=4'b0;

end

else

//花型按键显示相应花型---有优先级电路设计代码

begin

case(key_flag)

3'b001:

begin

ledlight<=s0;//奇数显示相应花型,偶数暂停

s0<=~s0;

end

3'b010:

begin

if(count<=4'b0111)

begin

ledlight<=s1;

s1<={s1[0],s1[3:

1]};//奇数显示相应花型,偶数暂停

count<=count+1;

end

elseif(count>4'b0111)

begin

ledlight<=s1;

s1<={s1[2:

0],s1[3]};

count<=count+1;

end

end

3'b100:

begin

ledlight<=s2;//奇数显示相应花型,偶数暂停

s2<=~s2;

end

endcase

end

end

endmodule

第二次实验:

实验4:

数据分配器实验:

用2个按键代表输入数据in(2位),用2个按键代表选择控制数据位s1s0,用四组发光管(每组2位)代表四路数据输出out0-out3。

当输入数据或控制数据改变时,要求输出数据进行相应变化(原理和真值表如下)。

s1

s0

out0

out1

out2

out3

0

0

in

z

z

z

0

1

z

in

z

z

1

0

z

z

in

z

1

1

z

z

z

in

modulemux_4(in,out0,out1,out2,out3,sel);

input[1:

0]sel;

input[1:

0]in;

outputreg[1:

0]out0;//

outputreg[1:

0]out1;//

outputreg[1:

0]out2;//

outputreg[1:

0]out3;//

always@(inorsel)

case(sel)

2'b00:

begin

out0=in;

out1=2'bz;

out2=2'bz;

out3=2'bz;

end

2'b01:

begin

out0=2'bz;

out1=in;

out2=2'bz;

out3=2'bz;

end

2'b10:

begin

out0=2'bz;

out1=2'bz;

out2=in;

out3=2'bz;

end

2'b11:

begin

out0=2'bz;

out1=2'bz;

out2=2'bz;

out3=in;

end

default:

begin

out0=2'bz;

out1=2'bz;

out2=2'bz;

out3=2'bz;

end

endcase

endmodule

实验5:

七段译码器实验:

用一个按键代表数据输入,每按一次数据加一,从0开始到F,再到0,依次循环,相应数字在数码管上显示。

moduleseg7_decode(a,b,c,d,e,f,g,dp,sel,out,keyin,clk);

parameterCOUNTWIDTH=16;

regkeyout;

reg[COUNTWIDTH-1:

0]counter;

wireclk_use;

inputkeyin,clk;

reg[3:

0]T;

input[2:

0]sel;

output[2:

0]out;

outputrega,b,c,d,e,f,g,dp;

assignclk_use=counter[COUNTWIDTH-1];

always@(posedgeclk)

counter<=counter+1'b1;

always@(posedgeclk_use)

keyout<=keyin;

always@(posedgekeyout)

begin

T<=T+1'b1;

end

always@(T)

begin

case(T)

4'd0:

{a,b,c,d,e,f,g,dp}=8'b11111100;//0

4'd1:

{a,b,c,d,e,f,g,dp}=8'b01100000;//1

4'd2:

{a,b,c,d,e,f,g,dp}=8'b11011010;//2

4'd3:

{a,b,c,d,e,f,g,dp}=8'b11110010;//3

4'd4:

{a,b,c,d,e,f,g,dp}=8'b01100110;//4

4'd5:

{a,b,c,d,e,f,g,dp}=8'b10110110;//5

4'd6:

{a,b,c,d,e,f,g,dp}=8'b10111110;//6

4'd7:

{a,b,c,d,e,f,g,dp}=8'b11100000;//7

4'd8:

{a,b,c,d,e,f,g,dp}=8'b11111110;//8

4'd9:

{a,b,c,d,e,f,g,dp}=8'b11110110;//9

4'd10:

{a,b,c,d,e,f,g,dp}=8'b11101110;//a

4'd11:

{a,b,c,d,e,f,g,dp}=8'b00111110;//b

4'd12:

{a,b,c,d,e,f,g,dp}=8'b10011100;//c

4'd13:

{a,b,c,d,e,f,g,dp}=8'b01111010;//d

4'd14:

{a,b,c,d,e,f,g,dp}=8'b10011110;//e

4'd15:

{a,b,c,d,e,f,g,dp}=8'b10001110;//f

default:

{a,b,c,d,e,f,g,dp}=8'b11111100;

endcase

end

assignout=sel;

endmodule

第三次实验:

实验6:

数控分频器实验:

用24MHz时钟分频,通过不同按键控制输出不同的频率信号,输出信号用LED指示。

1)1Hz频率信号;

2)0.5Hz频率信号。

3)10Hz频率信号;

modulefreque_div(inputwiresys_clk,

inputwiresys_rst,

outputregs_clkout_1Hz,

outputregs_clkout_10Hz,

outputregs_clkout_01Hz

);

reg[30:

0]count1;

reg[30:

0]count10;

reg[30:

0]count_01;

always@(posedgesys_clk,negedgesys_rst)

begin

if(sys_rst==1'b0)begincount1<=30'd0;count10<=30'd0;count_01<=30'd0;s_clkout_1Hz<=1'b0;s_clkout_10Hz<=1'b0;s_clkout_01Hz<=1'b0;end

elsebegin

if(count==25'd25000000)begins_clkout_1Hz<=~s_clkout_1Hz;count1<=0;end//1Hz

if(count==25'd2500000)begins_clkout_10Hz<=~s_clkout_10Hz;count10<=0;end//10Hz

if(count==25'd2*******0)begins_clkout_01Hz<=~s_clkout_01Hz;count_01<=0;end//0.1Hz

end

end

endmodule

实验7:

加法计数器实验

在时钟信号(选择1Hz)作用下,通过使能端和复位信号完成加法计数器的计数。

用2个按键分别表示使能和复位,用4个发光管表示计数的二进制结果。

第四次实验:

实验8:

动态扫描实验:

用4个按键分别代表加、减、暂停、复位,四位数码管代表四位十进制数,从0000开始到9999循环,自动计数,数据显示时间不大于1秒。

moduledscnt(key,clk,sels,segs);//动态扫描代码模板

input[3:

0]key;//按键

inputclk;//系统时钟

outputreg[2:

0]sels;//位选,即选择某个数码管

reg[1:

0]sels0;//位选中间寄存器变量,4个数码被用动态扫描

outputreg[6:

0]segs;//段选,即七段数码管

reg[2:

0]vkey;//记录按键被按下

regdataclk,bitclk;//段显示时钟和位扫描时钟

reg[3:

0]disdata;//送入段显示数据。

reg[15:

0]data;//四位十进制数据。

reg[30:

0]cnt;//分频时钟计数器

//按键部分代码------------------------------------------------

always@(key)

beginif(!

key[3])vkey<=1;

if(!

key[2])vkey<=2;

if(!

key[1])vkey<=3;

if(!

key[0])vkey<=4;

end

//分频部分代码------------------------------------------------

always@(posedgeclk)

begin

cnt<=cnt+1;

end

//段显示时钟

assigndataclk=cnt[?

];//?

表示根据系统时钟,设计者自行选取合适的值

//位扫描时钟

assignbitclk=cnt[?

];

//用于段显示的计算部分代码(加,减计数,暂停,复位)-----------

always@(posedgedataclk)

begin

if(vkey==1)

:

data[3:

0]

if(vkey==2)

:

if(vkey==3)

:

if(vkey==4)

:

//位选---------------------------------------------------------

always@(posedgebitclk)

beginsels0<=sels0+1;

sels<=sels0;

end

//动态显示---------------------------------------------------------

always@(selsordata)

begin

case(sels)

2'b00:

disdata<=data[15:

12];

2'b01:

disdata<=data[11:

8];

2'b10:

disdata<=data[7:

4];

2'b11:

disdata<=data[3:

0];

endcase

end

always@(disdata)

begin

case(disdata)

4'b0000:

segs<=7'b1111110;

4'b0001:

segs<=7'b1111110;

:

:

endcase

end

第五次实验:

实验9:

序列检测实验:

用一个按键代表时钟,一个按键代表输入数据,(时钟和数据要用LED显示其电平或数值,)当检测到1101序列时,蜂鸣器响动,指示灯点亮。

实验10:

表决器实验

利用按键、指示灯和数码管完成一个7人表决器实验。

用7个按键代表7个人(高电平表示同意,低电平表示反对),用1个指示灯代表表决结果(点亮表示通过),1位数码管显示通过的票数。

第六次实验:

实验11:

交通灯实验:

完成一个简单是交通灯控制器实验,交通灯显示用实验箱的交通灯模块和2个数码管显示。

具体要求

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1