北航FPGA实验报告Word格式.docx
《北航FPGA实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《北航FPGA实验报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
instd_logic;
q:
outstd_logic_vector(3downto0));
endentityerjinzhi;
architecturebhvoferjinzhiis
signalq1:
std_logic_vector(3downto0);
begin
process(rst,clk)
begin
if(rst='
0'
)then
q1<
="
0000"
;
elsif(clk'
eventandclk='
1'
=q1+1;
endif;
endprocess;
q<
=q1;
endarchitecturebhv;
(2)管脚分配
(3)实验操作
①输入信号clk时钟→把FPGA_EA2_P6(Pin_P20)用导线与(FRQ_Q211Hz)连接、rst清零→N18(SW-1)、输出信号q3→U12(LED1)、q2→V12(LED2);
q1→V15(LED3);
q0→W13(LED4)。
②把输入信号rst设为“1”、clk时钟(FRQ_Q211Hz)用导线与(FRQ_Q211Hz)连接。
(4)实验现象
输出结果信息为第一、二、三、四个发光二极管按照0000→0001→……→1111循环显示,符合实验要求。
(该实验板上低电平为“1”)
2、半加器
(1)实验原理图
逻辑分析:
输入信号a、b;
输出信号分别为sum(和)、carry(进位)。
逻辑方程:
sum=a⊕b;
carry=a*b。
输入信号a→N18(SW-1)、b→M20(SW-2)、输出信号sum(和)→U12(LED1)、carry(进位)→V12(LED2)
ⅰ输入信号a、b都为“0”,输出结果信息为两个发光二极管均为“灭”,说明和和进位都为0;
ⅱ输入信号a为“1”,b为“0”,输出结果信息为第一个发光二极管“灭”,第二个发光二极管“亮”,说明和为“1”,进位为0;
ⅲ输入信号a为“0”,b为“1”,输出结果信息为第一个发光二极管“灭”,第二个发光二极管“亮”。
说明和为“1”,进位为“0”;
ⅳ输入信号a、b都为“1”,输出结果信息为第一个发光二极管“亮”第二个发光二极管“灭”,说明和为“0”,进位为“1”.均符合设计要求
3、RS触发器
(1)实验代码
entityrs_clkis
port(s,r,res:
q,not_q:
outstd_logic);
endrs_clk;
architecturebehavofrs_clkis
signalsel1,sel2:
std_logic;
begin
process(res,sel1,sel2)
ifres='
thensel1<
='
sel2<
elsif(S='
andR='
)thensel1<
=sel1;
=sel2;
endif;
Q<
not_q<
endprocess;
endbehav;
(3)实验现象
将实验现象总结为RS触发器特性表,其中X指0或1均可;
输入为”1”指SW输入为高,输入为”0”指SW输入为低;
输出为”1”指对应LED灯灭(实验台的LED灯为高电平灭),输出为”0”指对应LED灯亮。
CLK触发
输入S
输入R
原来的Q
新的输出Q*
1
X
保持原状
不定状态
4、数码管十六进制计数器
entitymotoris
port(
clk:
rst:
sel:
outstd_logic;
q:
outstd_logic_vector(3downto0);
d:
outstd_logic_vector(7downto0)
);
endentity;
architectureb1ofmotoris
signalq1,q2:
process(clk,rst)
ifclk'
then
q1<
q2<
0010"
q<
=q2;
process(q1)
if(rst='
)thensel<
caseq1is
when
when"
0001"
=>
d<
01100000"
0100"
01100110"
1011"
00111110"
1101"
01111010"
endcase;
end;
将CLK接入较低频率,这样可以清晰地观察数码管从0—F(16进制数)的转变,完成一个循环之后,自动重新从0开始显示,进入下一个循环
5、跑马灯
entityledis
port(clk:
outstd_logic_vector(7downto0));
architectureledofledis
constants0:
std_logic_vector(1downto0):
00"
constants1:
01"
constants2:
10"
constants3:
11"
signalpresent:
std_logic_vector(1downto0);
std_logic_vector(7downto0);
signalcount:
process(rst,clk)
present<
=s0;
=(others=>
'
elsif(clk'
casepresentis
whens0=>
if(q1="
00000000"
elseif(count="
0111"
count<
00000001"
=s1;
elseq1<
=q1(0)&
q1(7downto1);
=count+1;
whens1=>
if(count="
=s2;
=q1(6downto0)&
q1(7);
whens2=>
0011"
00011000"
=s3;
elseq1(7downto4)<
=q1(4)&
q1(7downto5);
q1(3downto0)<
=q1(2downto0)&
q1(3);
whens3=>
=q1(6downto4)&
q1(3downto1);
实验开始,除了最左边的LED灯,其余实验箱上一排LED显示器全都点亮;
然后随着接入CLK触发信号的频率,每一个触发脉冲,灭的灯往右移动一位(原来灭的灯的右边一位灯灭),而原来灭的灯重新点亮;
当最右边一个灯灭了之后,下一个触发脉冲会重置循环,即又开始最左边的灯灭,其余的灯亮。
这样从视觉上就是一个黑点从左侧往右侧不断平移,一次移动一位,到达右侧终端后,黑点再次回到左侧,进入下一个周期。
6、键盘电路
useieee.std_logic_arith.all;
entitykeyboardis
start:
KBCol:
instd_logic_vector(3downto0);
KBRow:
seg7:
outstd_logic_vector(6downto0);
scan:
endkeyboard;
architecturebevofkeyboardis
signalsta:
scan<
a:
process(clk)
if(clk'
endprocessa;
b:
casecount(1downto0)is
KBRow<
sta<
1110"
whenothers=>
1111"
endprocessb;
process(clk,start)
ifstart='
seg7<
0000000"
elseif(clk'
casestais
caseKBColis
1001110"
When"
0111101"
1001111"
1000111"
Whenothers=>
1111111"
1110011"
1110111"
0011111"
0110011"
1011011"
1011111"
1110000"
1111110"
0110000"
1101101"
1111001"
endprocessc;
endbev;
将SW1拨到1,按下键盘上相应的按键,如按下5
LED显示按下键位对应的数字
7、LED点阵显示
useieee.std_logic_Unsigned.all;
useieee.std_logic_ARITH.all;
ENTITYdianzhenis
en:
hang:
outstd_logic_vector(15downto0);
count:
Enddianzhen;
Architecturedianzhenofdianzhenis
signalosc:
signalx:
std_logic_vector(0downto0);
signaly:
signalcount1:
signalcount2:
std_logic_vector(25downto0);
signaldata:
std_logic_vector(15downto0);
signald0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15:
signala0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15:
signalc0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15:
signalb0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15:
Begin
hang<
=data;
a0<
0000000000000000"
a1<
a13<
a14<
a15<
c0<
c1<
c15<
b0<
b14<
process(osc,en,clk,x,y,count2)
osc<
=notclk;
x<
1"
if(osc='
andosc'
event)then
count2<
=count2+1;
if(count2=100000)then
y<
=y+1;
IF(y="
if(x="
0"
if(en='
ifcount1<
data<
=d0;
count1<
elsifcount1<
=d1;
=d2;
=d3;
=d4;
0101"
=d5;
0110"
=d6;
=d7;
1000"
=d8;
1001"
=d9;
1010"
=d10;
=d11;
1100"
=d12;
=d13;
=d14;
=d15;
elsif(x="
if(y="
=c0;
=c1;
=c2;
=c3;
=c4;
=c5;
=c6;
=c7;
=c8;
=c9;
=c10;
=c11;
=c12;
dat