VHDL考试要点Word文档格式.docx
《VHDL考试要点Word文档格式.docx》由会员分享,可在线阅读,更多相关《VHDL考试要点Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
在元件之间起互联,代表电路内部各元件之间的连接线,可以赋值给外部信号。
信号的描述格式:
SIGNAL信号名:
数据类型[:
SIGNALsys_clk:
BIT:
=’0’;
SIGNALground:
=’0’
signalaa:
std_logic_vector(7downto0);
std_logic_vector(3downto0):
=“1010”;
信号赋值语句语法格式:
目标信号名<
=表达式;
q<
=count;
irq<
='
0'
aa<
=dx1;
bb<
=dx2;
s1<
=s2AFTER10ns
indata<
=bb(7downto0)&
aa(7downto0);
建议在结构体中用赋值语句完成对信号赋初值的任务,因为综合器往往会忽略信号声明时所赋初值。
信号与变量区别
信号赋值可以有延迟时间,变量赋值无时间延迟
信号除当前值外还有许多相关值,如历史信息等,变量只有当前值
进程对信号敏感,对变量不敏感
信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见
信号可以看作硬件的一根连线,但变量无此对应关系
赋值的形式不同;
声明的位置不同
CASE语句
格式:
CASE表达式IS
WHEN条件表达式=>
顺序处理语句
…
END CASE;
用CASE语句设计四选一数据选择器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL
ENTITYmux41IS
PORT(s1,s2:
instd_logic;
a,,b,c,d:
z:
outstd_logic);
ENDENTITYmux41;
ARCHITECTUREactivOFmux41IS
SIGNALs:
std_logic_vector(1downto0);
BEGIN
S<
=s1&
s2
PROCESS(s1,s2,a,b,c,d)
CASEsIS
WHEN“00”=>
z<
=a;
WHEN“01”=>
=b;
WHEN“10”=>
=c;
WHEN“11”=>
=d;
WHENOTHERS=>
=‘x’;
ENDCASE;
ENDPROCESS;
ENDactiv;
IF(s=“00”)thenz<
ELSIF(s=“01”)thenz<
ELSIF(s=“10”)thenz<
ELSEz<
ENDIF;
ENDARCHITECTUREactiv;
IF与CASE比较
1.IF语句中条件句之间是相与的关系,CASE语句中条件句之间是相或的关系。
2.CASE条件语句必须将所有情况列出
顺序语句
1、顺序语句的特点:
每一条顺序语句的执行顺序都和它们的书写顺序基本一致。
2、出现的位置:
只能出现在进程和子程序中,子程序包括函数(Function)和过程(Procedure)
赋值语句
IF语句
CASE语句
FOR-LOOP语句
NEXT-LOOP语句
EXIT-LOOP语句
NULL语句
ASSERT语句
赋值语句包括变量赋值语句和信号赋值语句,前者的赋值是立刻发生的
后者的赋值发生在一个进程结束的时刻,并延时进行。
变量赋值目标:
=赋值源
信号赋值目标<
在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获
得的是最后一个赋值源的值,其前面相同的赋值目标不做任何变化
Signals1,s2:
std_logic;
Signalsec:
std_logic_vector(0to7);
Process(s1,s2)
Variablev1,v2:
std_logic;
Begin
v1:
=‘1’;
v2:
=‘1’;
s1<
s2<
sec(0)<
=v1;
sec
(1)<
=v2;
sec
(2)<
=s1;
sec(3)<
=s2;
=‘0’;
=‘0’;
sec(4)<
=v1;
sec(5)<
=v2;
sec(6)<
=s1;
sec(7)<
=s2;
ENDPROCESS
结果:
01000111
并行语句
并行语句一般处于进程(PROCESS)的外部。
所有并行语句都是并行执行的,
并行语句特点
a.所有语句的执行是并行的;
b.每条语句的执行和其所在的位置无关;
c.并行语句的输出仅仅依赖于输入,没有其它的限制条件
libraryieee;
useieee.std_logic_1164.all;
Entityexam1is
port(a,b:
c,d:
Endexam1;
Begin
c<
=aandb;
--并行语句的输出仅仅依赖于输入,没有其它的限制条件。
d<
=aorb;
--每条语句的执行和其所在的位置无关。
ENDm1;
3-8译码器
entityymqis
port(
Y:
instd_logic_vector(2downto0);
EN:
A:
outstd_logic_vector(7downto0));
endymq;
architecturem1ofymqis
begin
process(y)
ifen='
1'
then
caseyis
when"
000"
=>
A<
00000001"
001"
A<
00000010"
010"
00000100"
011"
="
00001000"
100"
00010000"
101"
00100000"
110"
01000000"
111"
10000000"
whenothers=>
11111111"
endcase;
else
Endif;
8-3编码器
Useieee.std_logic_1164.all;
Entitybmqis
Port(A:
instd_logic_vector(7downto0);
EN:
instd_logic;
Y:
outstd_logic_vector(2downto0);
Endbmq;
--结构体1
architecturem2ofbmqis
process(a)
caseais
when"
=>
Y<
;
whenothers=>
y<
elsey<
endif;
endprocess;
数据选择器
entitymux41is
port(A,B,C,D:
in
std_logic_vector(15downto0);
Sel:
td_logic_vector(1downto0);
out
std_logic_vector(15downto0));
endmux41;
architectureFofmux41is
begin
withselselect
=Awhen"
00"
Bwhen"
01"
Cwhen"
10"
Dwhenothers;
endF;
二-十进制编码器
entitybmqis
port(A:
std_logic_vector(9downto0);
B:
std_logic_vector(3downto0));
endbmq;
architecturem1ofbmqis
B<
0000"
whenA="
0000000001"
else
"
0001"
0000000010"
“0010"
0000000100"
“0011"
0000001000"
“0100"
0000010000"
“0101"
0000100000"
“0110"
0001000000"
“0111"
whenA=“0010000000"
“1000"
whenA=“0100000000"
“1001"
whenA=“1000000000"
“1111"
endm1;
七段显示码译码器
Libraryieee;
Useieee.std_logic_unsigned.all;
Entityxianis
Port(C:
instd_logic_vector(3
downto0);
D:
outstd_logic_vector(6downto
0));
Endxian;
Architecturea1ofxianis
Begin
D<
0111111"
whenC="
else--0
0000110"
else--1
1011011"
0010"
else--2
1001111"
0011"
else--3
1100110"
0100"
else--4
1101101"
0101"
else--5
1111101"
0110"
else--6
0000111"
0111"
else--7
1111111"
1000"
else--8
1101111"
1001"
else--9
0000000"
Enda1;
8位二进制同步计数器
useieee.std_logic_unsigned.all;
entitycounter8is
port
(
clk:
q:
outstd_logic_vector(7downto0)
);
endcounter8;
architecturecjofcounter8is
signalt:
process(clk)
if(clk'
eventandclk='
)then
t<
=t+1;
q<
=t;
endcj;
可预置保持的两位十进制加法计数器
entitycnt10is
clk,clr,ena,prn,hold:
dah,dal:
inintegerrange0downto15;
qh,ql:
outintegerrange0downto15
endcnt10;
architecturecjofcnt10is
signaltemph:
integerrange0downto15;
signaltempl:
process(clr,clk,ena)
if(clr='
temph<
=0;
templ<
elsif(clk'
if(prn='
=dah;
=dal;
elsif(hold='
=temph;
=templ;
elsif(ena='
if(templ<
9)then
=templ+1;
else
if(temph<
=temph+1;
endif;
qh<
ql<
本程序解释:
ifclk'
eventandclk='
就是检测上升沿的
clk置数
clr清零
ena计数
prn
hold保持
四位二进制异步计数器
entitycounter4is
clr,ld:
d:
instd_logic_vector(3downto0);
outstd_logic_vector(3downto0)
endcounter4;
architecturecjofcounter4is
std_logic_vector(3downto0);
process(clk,clr)
if(clr='
)then
elsif(clk'
if(ld='
t<
if(t="
elset<
counter10
1111"