VHDL考试必备大全备课讲稿.docx
《VHDL考试必备大全备课讲稿.docx》由会员分享,可在线阅读,更多相关《VHDL考试必备大全备课讲稿.docx(27页珍藏版)》请在冰点文库上搜索。
VHDL考试必备大全备课讲稿
一、填空题
1、三种可编程逻辑器件:
EEPROM、GAL、FPGA。
2、VHDL程序包含实体、构造体、配置、程序包、和库五部分。
3、结构体的子程序描述语句:
块BLOCK、进程PROCES、和子程序SUBPROGRAMS结构。
4、VHDL的客体包括了常数、变量和信号。
5、VHDL的数据类型:
整数、实数、位、位矢量、字符、布尔量、时间、字符串。
std_logic是决断类型。
7、构造体的描述方式包括三种,分别是结构、数据流、行为描述方式。
8、双向端口是用inout表示,构造体内部可再次使用的输出是缓冲用buffer表示。
9、VHDL的运算符优先级:
逻辑运算符<关系运算符<算术运算符。
10、定义一个信号a,数据类型为4位标准逻辑向量signala:
std_logic_vector(3downto0)定义一个变量b,数据类型为2位位向量variableb:
bit_vector(1downto0)。
11、Moore状态机输出只是当前状态的函数,Mealy为有限状态机当前值和输入值的函数
12、在VHDL的常用对象中,信号、变量可以被多次赋予不同的值,常量只能在定义时赋值。
13、进程必须位于结构体内部,变量必须定义于进程/包/子程序内部。
14、并置运算符&的功能是把多个位或位向量合并为一个位向量。
15、判断CLK信号上升沿到达的语句是ifclk’eventandclk=‘1’then.
16、任何时序电路都以时钟为驱动信号,时序电路只是在时钟信号的边沿到来时,
其状态才发生改变。
17、一个信号处于高阻(三态)时的值在VHDL中描述为Z’。
18、赋值语句是并行执行的,if语句是串行执行的。
知识点
1.信号与变量的区别:
①信号延时赋值,变量立即赋值②信号代入用<=,变量代入用:
=
③信号除当前值外还有许多相关信息,而变量只有当前值④进程对信号敏感而不对变量敏感
⑤信号可以是多个进程的全局信号,而变量只是定义他们的顺序域可见。
信号时硬件中连线的抽象描述,其功能是保存变化的数据值和连接子元件,信号在元件的端口连接元件,变量在硬件中没有类似的对应关系,主要应用于高层次的建模中
2.命名规则:
①由字母、数字、下划线组成②第一个字符必须是字母,最后一个字符不能是下划线③不能连用下划线④不能和关键字或保留字相同。
3.五类常用库:
IEEE库、STD库、WORK库、ASIC矢量库、用户自定义库,其中STD(textio包集合除外)和WORK不同预先说明。
2、编程题
下划线
1.设计一个异或门(采用行为描述方式)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYxor2_v1IS
PORT(a,b:
INSTD_LOGIC;
y:
OUTSTD_LOGIC);
ENDxor2_v1;
ARCHITECTUREbehaveOFxor2_v1IS
BEGIN
y<=aXORb;
ENDbehave;
2.编写一个8线—3线编码器的VHDL程序(采用行为描述方式)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcoder83_v1IS
PORT(I0,I1,I2,I3,I4,I5,I6,I7:
INSTD_LOGIC;
A0,A1,A2:
OUTSTD_LOGIC);
ENDcoder83_v1;
ARCHITECTUREbehaveOFcoder83_v1IS
BEGIN
A2<=I4ORI5ORI6ORI7;
A1<=I2ORI3ORI6ORI7;
A0<=I1ORI3ORI5ORI7;
ENDbehave;
3.以74148逻辑表达式为依据,编写一个8线—3线优先编码器的VHDL程序(行为)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYprioritycoder83_v1IS
PORT(I7,I6,I5,I4,I3,I2,I1,I0:
INSTD_LOGIC;
EI:
INSTD_LOGIC;
A2,A1,A0:
OUTSTD_LOGIC;
GS,EO:
OUTSTD_LOGIC);
ENDprioritycoder83_v1;
ARCHITECTUREbehaveOFprioritycoder83_v1IS
BEGIN
A2<=EIOR(I7ANDI6ANDI5ANDI4);
A1<=EIOR(I7ANDI6ANDI3ANDI2)
OR(I7ANDI6ANDNOTI5)
OR(I7ANDI6ANDNOTI4);
A0<=EIOR(I7ANDNOTI6)
OR(I7ANDI5ANDNOTI4)
OR(I7ANDI5ANDI3ANDI1)
OR(I7ANDI5ANDI3ANDNOTI2);
GS<=EIOR(I7ANDI6ANDI5ANDI4ANDI3
ANDI2ANDI1ANDI0);
EO<=EIORNOT(I7ANDI6ANDI5
ANDI4ANDI3ANDI2ANDI1ANDI0);
ENDbehave;
4.编写一个3线—8线译码器74138VHDL程序(数据流描述方式)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdecoder138_v2IS
PORT(G1,G2A,G2B:
INSTD_LOGIC;
A:
INSTD_LOGIC_VECTOR(2DOWNTO0);
Y:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDdecoder138_v2;
ARCHITECTUREdataflowOFdecoder138_v2IS
BEGIN
PROCESS(G1,G2A,G2B,A)
BEGIN
IF(G1='1'ANDG2A='0'ANDG2B='0')THEN
CASEAIS
WHEN"000"=>Y<="11111110";
WHEN"001"=>Y<="11111101";
WHEN"010"=>Y<="11111011";
WHEN"011"=>Y<="11110111";
WHEN"100"=>Y<="11101111";
WHEN"101"=>Y<="11011111";
WHEN"110"=>Y<="10111111";
WHENOTHERS=>Y<="01111111";
ENDCASE;
ELSEY<="11111111";
ENDIF;
ENDPROCESS;
ENDdataflow;
5.编写一个8选1数据选择器的VHDL程序(IF语句)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux8_v2IS
PORT(A:
INSTD_LOGIC_VECTOR(2DOWNTO0);
D0,D1,D2,D3,D4,D5,D6,D7:
INSTD_LOGIC;
G:
INSTD_LOGIC;
Y:
OUTSTD_LOGIC;
YB:
OUTSTD_LOGIC);
ENDmux8_v2;
ARCHITECTUREdataflowOFmux8_v2IS
BEGIN
PROCESS(A,D0,D1,D2,D3,D4,D5,D6,D7,G)
BEGIN
IF(G='1')THEN
Y<='0';
YB<='1';
ELSIF(G='0'ANDA="000")THEN
Y<=D0;
YB<=NOTD0;
ELSIF(G='0'ANDA="001")THEN
Y<=D1;
YB<=NOTD1;
ELSIF(G='0'ANDA="010")THEN
Y<=D2;
YB<=NOTD2;
ELSIF(G='0'ANDA="011")THEN
Y<=D3;
YB<=NOTD3;
ELSIF(G='0'ANDA="100")THEN
Y<=D4;
YB<=NOTD4;
ELSIF(G='0'ANDA="101")THEN
Y<=D5;
YB<=NOTD5;
ELSIF(G='0'ANDA="110")THEN
Y<=D6;
YB<=NOTD6;
ELSE
Y<=D7;
YB<=NOTD7;
ENDIF;
ENDPROCESS;
ENDdataflow;
6.编写一个对两个4位二进制数进行比较的程序(IF语句)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcomp4_v1IS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
B:
INSTD_LOGIC_VECTOR(3DOWNTO0);
YA,YB,YC:
OUTSTD_LOGIC);
ENDcomp4_v1;
ARCHITECTUREbehaveOFcomp4_v1IS
BEGIN
PROCESS(A,B)
BEGIN
IF(A>B)THEN
YA<='1';
YB<='0';
YC<='0';
ELSIF(A
YA<='0';
YB<='1';
YC<='0';
ELSE
YA<='0';
YB<='0';
YC<='1';
ENDIF;
ENDPROCESS;
ENDbehave;
7.编写一个用“+”实现加法运算的8位加法器的程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYadder8_vIS
PORT(A:
INSTD_LOGIC_VECTOR(7DOWNTO0);
B:
INSTD_LOGIC_VECTOR(7DOWNTO0);
Cin:
INSTD_LOGIC;
Co:
OUTSTD_LOGIC;
S:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDadder8_v;
ARCHITECTUREbehaveOFadder8_vIS
SIGNALSint:
STD_LOGIC_VECTOR(8DOWNTO0);
SIGNALAA,BB:
STD_LOGIC_VECTOR(8DOWNTO0);
BEGIN
AA<='0'&A(7DOWNTO0);
BB<='0'&B(7DOWNTO0);
Sint<=AA+BB+Cin;
S(7DOWNTO0)<=Sint(7DOWNTO0);
Co<=Sint(8);
ENDbehave;
8.编写一个8求补器的程序。
libraryieee;
useieee.std_logic_1164.all;
entityhosuuis
port(a:
instd_logic_vector(7downto0);
b:
outstd_logic_vector(7downto0));
endhosuu;
architecturertlofhosuuis
begin
b<=nota+‘1’;
endrtl;
9.编写一个三态门程序
libraryieee;
useieee.std_logic_1164.all;
entitytri_gateis
port(din,en:
instd_logic;
dout:
outstd_logic);
endtri_gate;
architecturezasoftri_gateis
begin
tri_gate:
process(din,en)
Begin
if(en=’1’)then
dout<=din;
else
dout<=’Z’;
endif;
endprocess;
endzas;
10.D触发器(带有异步置位复位功能)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYd_ffyIS
PORT(clk,d,set,reset:
INSTD_LOGIC;
q,qd:
OUTSTD_LOGIC);
ENDd_ffy;
ARCHITECTUREaOFd_ffyIS
BEGIN
PROCESS(clk,set,reset)
BEGIN
IF(set='0'ANDreset='1')THEN
q<='1';
qd<='0';
ELSIF(set='1'ANDreset='0')THEN
q<='0';
qd<='1';
ELSIF(clk'EVENTANDclk='1')THEN
q<=d;
qd<=NOTd;
ENDIF;
ENDPROCESS;
ENDa;
11.jk触发器(带有异步置位复位功能)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYjk_asr_ffIS
PORT(j,k,clk,set,res:
INSTD_LOGIC;
q,qb:
OUTSTD_LOGIC);
ENDjk_asr_ff;
ARCHITECTUREbehaveOFjk_asr_ffIS
SIGNALq_temp:
STD_LOGIC;
signaljk_temp:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
jk_temp<=j&k;
PROCESS(clk,set,res)
BEGIN
IFset='0'THENq_temp<='0';
ELSIFres='0'THENq_temp<='1';
ELSEIF(clk'EVENTANDclk='0')THEN
CASEjk_tempIS
WHEN"01"=>q_temp<='0';
WHEN"10"=>q_temp<='1';
WHEN"00"=>q_temp<=q_temp;
WHEN"11"=>q_temp<=NOTq_temp;
WHENothers=>q_temp<='X';
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
q<=q_temp;
qb<=NOTq_temp;
ENDbehave;
12.带有使能端的RS触发器
ENTITYRSlatchIS
PORT(r,s,en:
INBIT;
q,qb:
BUFFERBIT);
ENDRSlatch;
ARCHITECTURErs_archiOFRSlatchIS
SIGNALs1,r1:
BIT;
BEGIN
s1<=sNANDen;
r1<=rNANDen;
qb<=r1NANDq;
q<=s1NANDqb;
ENDrs_archi;
13.带异步置位/复位的通用寄存器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYregisternIS
GENERIC(n:
INTEGER:
=1);
PORT(d:
INSTD_LOGIC_VECTOR(nDOWNTO0);
clk,en,set,reset:
INSTD_LOGIC;
q:
BUFFERSTD_LOGIC_VECTOR(nDOWNTO0));
ENDregistern;
ARCHITECTUREaOFregisternIS
BEGIN
PROCESS(clk,set,reset)
BEGIN
IF(set='0'ANDreset='1')THEN
q<=(OTHERS=>'1');
ELSIF(set='1'ANDreset='0')THEN
q<=(OTHERS=>'0');
ELSIF(clk'EVENTANDclk='1')THEN
IF(en='1')THEN
q<=d;
ELSEq<=q;
ENDIF;
ENDIF;
ENDPROCESS;
ENDa;
14.通用串入/并出移位寄存器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYshiftbIS
GENERIC(n:
INTEGER:
=2);
PORT(d,clk:
INSTD_LOGIC;
q:
BUFFERSTD_LOGIC_VECTOR(0TOn));
ENDshiftb;
ARCHITECTUREaOFshiftbIS
COMPONENTd_ff
PORT(clk,d:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDCOMPONENT;
BEGIN
label1:
FORiIN0TOnGENERATE
g1:
IF(i=0)GENERATE
dffx:
d_ffPORTMAP(clk=>clk,d=>d,q=>q(i));
ENDGENERATE;
g2:
IF(i/=0)GENERATE
dffx:
d_ffPORTMAP(clk=>clk,d=>q(i-1),q=>q(i));
ENDGENERATE;
ENDGENERATE;
ENDa;
ARCHITECTUREaaOFshiftbIS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
q(0)<=d;
FORiIN1TOnLOOP
q(i)<=q(i-1);
ENDLOOP;
ENDIF;
ENDPROCESS;
ENDaa;
15.循环移位寄存器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYshiftxIS
PORT(clk,load:
INSTD_LOGIC;
d:
INSTD_LOGIC_VECTOR(3DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDshiftx;
ARCHITECTUREaaOFshiftxIS
SIGNALtmp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
q<=tmp;
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(load='0')THEN
tmp<=d;
ELSEtmp(0)<=tmp(3);
tmp(3downto1)<=tmp(2downto0);
ENDIF;
ENDIF;
ENDPROCESS;
ENDaa;
16.60进制递增计数器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYcntm60vIS
PORT(en:
INstd_logic;
clear:
INstd_logic;
load:
INstd_logic;
dl,dh:
INstd_logic_vector(3downto0);
clk:
INstd_logic;
cout:
outstd_logic;
ql:
bufferstd_logic_vector(3downto0);
qh:
bufferstd_logic_vector(3downto0));
ENDcntm60v;
ARCHITECTUREbehaveOFcntm60vIS
signalent2:
std_logic;
BEGIN
PROCESS(clk)
VARIABLEtmpl,tmph:
std_logic_vector(3downto0);
BEGIN
IF(clear='0')THEN
tmpl:
="0000";
tmph:
=“0000”;--异步清零
ELSIF(clk'EVENTANDclk='1')THEN
IFload='0'THEN
tmpl:
=dl;
tmph:
=dh;--同步置数
elsif(en='1')then
if(tmpl="1001")then
tmpl:
=“0000”;--个位计数器9+1=0
if(tmph="0101")then
tmph:
=“0000”;--十位计数器5+1=059+1=0
else
tmph:
=tmph+1;
endif;
else
tmpl:
=tmpl+1;
endif;
endIF;--endlf(load)
ENDIF;--endifclear
ql<=tmpl;
ent2<=tmpl(3)andtmpl(0)anden;
qh<=tmph;
cout<=tmph
(2)andtmph(0)andent2;
--计数器为59时进位信号cout输出‘1’。
ENDPROCESS;
ENDbehav