FPGA实验+代码Word文档格式.docx
- 文档编号:17450879
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:14
- 大小:18.99KB
FPGA实验+代码Word文档格式.docx
《FPGA实验+代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《FPGA实验+代码Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
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
0]key_reg_r;
//用于存储前一按键
b0)key_reg_r<
elsekey_reg_r<
=key_reg;
//用于存储前一按键
wire[2:
0]key_an=key_reg_r&
(~key_reg);
//用于存储按键下降沿
//消抖时间设定为20ms左右-------------------------------------------------------------------
parameterCCNTWITHD=20;
reg[CCNTWITHD-1:
0]ccnt;
reg[2:
0]keyout;
b0)ccnt<
=20'
b0;
elseif(key_an)ccnt<
//按键有抖动就清零--消除抖动的计数器
elseccnt<
=ccnt+1'
b1;
//没有抖动,消除抖动的计数器开始加1,延时20ms。
0]low_key;
//用于记录消除抖动后的现有按键状态
b0)low_key<
elseif(ccnt==20'
hfffff)
low_key<
/*消抖动结束*/
/*流水灯控制部分程序--------------------------------------------------------------------------*/
//可按键标志位------------------------------------------------------------------
0]low_key_r;
//用于记录消除抖动后的下一按键状态
b0)low_key_r<
else
low_key_r<
=low_key;
wire[2:
0]key_flag11=low_key_r&
(~low_key);
//消逗后按键下降沿个数,作为标志位
//标志位------------------------------------------------------------------
0]key_flag1;
if(srst_n==1'
b0)
begin
key_flag1<
b000;
end
else
//花型按键显示相应花型---有优先级电路设计代码
begin
case(key_flag11)
3'
b001:
begin
key_flag1={2'
b00,~key_flag1[0]};
//奇数显示相应花型,偶数暂停
end
b010:
key_flag1={1'
b0,~key_flag1[1],1'
b0};
//奇数显示相应花型,偶数暂停
b100:
key_flag1={~key_flag1[2],2'
b00};
//奇数显示相应花型,偶数暂停
endcase
end
wire[2:
0]key_flag=key_flag1;
//50MHZdiv_frequenceto1Hz---------------------------------------------
parameterCOUNTWIDTH=24;
reg[COUNTWIDTH-1:
0]ccount;
//regsclk;
wiressclk;
if(srst_n==1'
b0)beginccount[COUNTWIDTH-1:
0]<
='
d0;
elseccount<
=ccount+1'
assignssclk=ccount[COUNTWIDTH-1];
//流水灯显示控制程序--------------------------------------------------------
reg[7:
0]s0;
0]s1;
0]s2;
reg[3:
0]count;
always@(posedgessclk,negedgesrst_n)
s0=4'
b0000;
s1=4'
b1000;
s2=4'
b1010;
count=4'
case(key_flag)
ledlight<
=s0;
s0<
=~s0;
if(count<
=4'
b0111)
begin
ledlight<
=s1;
s1<
={s1[0],s1[3:
1]};
//奇数显示相应花型,偶数暂停
count<
=count+1;
end
elseif(count>
4'
={s1[2:
0],s1[3]};
=s2;
s2<
=~s2;
第二次实验:
实验4:
数据分配器实验:
用2个按键代表输入数据in(2位),用2个按键代表选择控制数据位s1s0,用四组发光管(每组2位)代表四路数据输出out0-out3。
当输入数据或控制数据改变时,要求输出数据进行相应变化(原理和真值表如下)。
s1
s0
out0
out1
out2
out3
in
z
1
modulemux_4(in,out0,out1,out2,out3,sel);
input[1:
0]sel;
0]in;
outputreg[1:
0]out0;
//
0]out1;
0]out2;
0]out3;
always@(inorsel)
case(sel)
2'
b00:
begin
out0=in;
out1=2'
bz;
out2=2'
out3=2'
end
b01:
out0=2'
out1=in;
b10:
out2=in;
b11:
out3=in;
default:
endcase
实验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:
output[2:
0]out;
outputrega,b,c,d,e,f,g,dp;
assignclk_use=counter[COUNTWIDTH-1];
always@(posedgeclk)
counter<
=counter+1'
always@(posedgeclk_use)
keyout<
=keyin;
always@(posedgekeyout)
begin
T<
=T+1'
end
always@(T)
case(T)
4'
d0:
{a,b,c,d,e,f,g,dp}=
d1:
{a,b,c,d,e,f,g,dp}=8'
b01100000;
//1
d2:
d3:
d4:
b01100110;
//4
d5:
d6:
d7:
d8:
d9:
d10:
d11:
b00111110;
//b
d12:
d13:
b01111010;
//d
d14:
d15:
{a,b,c,d,e,f,g,dp}=
endcase
assignout=sel;
第三次实验:
实验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;
0]count_01;
always@(posedgesys_clk,negedgesys_rst)
if(sys_rst==1'
b0)begincount1<
=30'
count10<
count_01<
s_clkout_1Hz<
=1'
s_clkout_10Hz<
s_clkout_01Hz<
elsebegin
begins_clkout_1Hz<
=~s_clkout_1Hz;
count1<
=0;
end//1Hz
if(count==25'
d2500000)begins_clkout_10Hz<
=~s_clkout_10Hz;
end//10Hz
0)begins_clkout_01Hz<
=~s_clkout_01Hz;
end//0.1Hz
end
实验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;
//段选,即七段数码管
0]vkey;
//记录按键被按下
regdataclk,bitclk;
//段显示时钟和位扫描时钟
reg[3:
0]disdata;
//送入段显示数据。
reg[15:
0]data;
//四位十进制数据。
0]cnt;
//分频时钟计数器
//按键部分代码------------------------------------------------
always@(key)
beginif(!
key[3])vkey<
=1;
if(!
key[2])vkey<
=2;
if(!
key[1])vkey<
=3;
if(!
key[0])vkey<
=4;
//分频部分代码------------------------------------------------
always@(posedgeclk)
cnt<
=cnt+1;
//段显示时钟
assigndataclk=cnt[?
];
//?
表示根据系统时钟,设计者自行选取合适的值
//位扫描时钟
assignbitclk=cnt[?
//用于段显示的计算部分代码(加,减计数,暂停,复位)-----------
always@(posedgedataclk)
if(vkey==1)
:
data[3:
0]
if(vkey==2)
if(vkey==3)
if(vkey==4)
//位选---------------------------------------------------------
always@(posedgebitclk)
beginsels0<
=sels0+1;
sels<
=sels0;
//动态显示---------------------------------------------------------
always@(selsordata)
case(sels)
2'
disdata<
=data[15:
12];
=data[11:
8];
=data[7:
4];
=data[3:
0];
endcase
always@(disdata)
case(disdata)
4'
b0000:
segs<
=7'
b1111110;
b0001:
第五次实验:
实验9:
序列检测实验:
用一个按键代表时钟,一个按键代表输入数据,(时钟和数据要用LED显示其电平或数值,)当检测到1101序列时,蜂鸣器响动,指示灯点亮。
实验10:
表决器实验
利用按键、指示灯和数码管完成一个7人表决器实验。
用7个按键代表7个人(高电平表示同意,低电平表示反对),用1个指示灯代表表决结果(点亮表示通过),1位数码管显示通过的票数。
第六次实验:
实验11:
交通灯实验:
完成一个简单是交通灯控制器实验,交通灯显示用实验箱的交通灯模块和2个数码管显示。
具体要求见教材275页9.10题,各个信号显示灯显示时间设为:
主干道绿灯60秒,红灯20秒,黄灯5秒。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 实验 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)