FPGA实验 代码分析.docx
- 文档编号:8356894
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:15
- 大小:107.66KB
FPGA实验 代码分析.docx
《FPGA实验 代码分析.docx》由会员分享,可在线阅读,更多相关《FPGA实验 代码分析.docx(15页珍藏版)》请在冰豆网上搜索。
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个数码管显示。
具体要求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA实验 代码分析 FPGA 实验 代码 分析