通信课程-eda课件第四部分_第1页
通信课程-eda课件第四部分_第2页
通信课程-eda课件第四部分_第3页
通信课程-eda课件第四部分_第4页
通信课程-eda课件第四部分_第5页
免费预览已结束,剩余72页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

&&≥1&abcyinzindouteoutfoutVHDL语言的描述语句分为两种:顺序处理语句和并发处理语句。Ut

Eq

jIXd

Ut

Eq

jIXd4.1顺序处理语句4.2并发处理语句4.3其他语句和说明顺序处理语句描述系统的顺序行为,只能用在进程和子程序中,按照语句出现的顺序加以执行。可以实现算术运算、逻辑运算、信号和变量的赋值、子程序调用等。顺序处理语句的种类(10种):Wait

语句断言语句信号赋值语句变量赋值语句If语句Case语句Loop

语句Next语句Exit语句过程调用语句NULL语句常用顺序处理语句:信号赋值语句变量赋值语句If语句Case语句重点掌握其功能是将进程挂起或激活。Wait语句有5种形式:4种基本形式,1种多条件组合形式。4种基本形式:Wait

无限等待并行分布处理Wait

on

信号名;信号发生变化结束等待Wait

untill

布尔表达式;直到布尔表达式为真时结束等待。Wait

for

时间表达式;当时间表达式的时间到时结束等待例如:wait

on

A,

B;--敏感信号A

或B

变化时,结束等待,进程激活wait

until

Enable=‘1’;

--满足条件时,结束等待,进程激活wait

for

5

ns;--过5

ns后,结束等待,进程激活Ut

Eq

jIXd

Ut

Eq

jIXd多条件wait语句wait

on

A,B

until

En=‘1’;--A或B变化,且En=‘1’wait

on

A,B

for

5ns;

--A或B变化,或到达5

nswait

until

En=‘1’for

5ns;--En=‘1’时,或到达5

nswait

on

nmi,

interrupt

until

(nmi

=ture)or(interrupt=true)

for

5

ns;该等待有三个条件:第一,信号nmi和interrupt

任何一个有变化第二,信号nmi和interrupt

任何一个为真(ture)第三,等待5

ns规则:(‘on’

‘until’

)

‘for’,多个条件至少包含一个信号量的值,否则为无限等待语句(

wait

)。LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

CLOCK

ISPORT(D,CLK:IN

STD_LOGIC;Q:OUT

STD_LOGIC);END

CLOCK;ARCHITECTURE

STL

OF

CLOCK

ISBEGINPROCESSBEGINWAIT

on CLK

until

CLK='1';(WAIT

until

CLK‘event

and

CLK='1';)Q<=D;END

PROCESS;END

STL;B:processBeginWait

until

senda=‘1’;Sendb<=‘1’

after

10

ns;Wait

until

senda=‘0’;Sendb<=‘0’

after

10

ns;End

process

B;End

example;不能启动,为防止进若在程序中所设置的等待条件 不会满足,则进程就入无限等待情况,应做一些处理.加入超时等待项。例4-3:4-4:Architecture

example

of

wait_example

isSignal

sendb,senda:std_logic;Beginsenda<=‘0’;A:processBeginAssert(sendb=‘1’)Report

“sendb

timed

out

at

‘1’”Severity

error;for

1

nsWaituntil

sendb=‘1’;Senda<=‘1’

after

10

ns;Waituntil

sendb=‘0’;Senda<=‘0’

after

10

ns;End

process

A;断言语超时等待项[v,v2

,v

3

,v4,v5

]。对电路本身的功能并信息,实现仿真和调试中的人机没有任何影响。不能实现逻辑综合。例如:Assert

(sendb=‘1’)Report

“sendb

timed

out

at

‘1’”Severity

error;type

Severity

_Level

is

(Note,

Warning,

Error,

Failure);当不满足条件时,输出文字串和错误级别信息。断言语句的执行,不会引起任何事件的发生,只是报告错误ASSERT

条件[REPORT

输出信息][SEVERITY

级别];格式:书写格式:目的信号量<=表达式;1)将右边表达式的值赋予左边的目的信号量注意:a)右边的表达式可以是变量、信号或者字符;可以是常数、算术运算表达式、逻辑运算表达式或者关系运算表达式;b)代入符号两边的量、类型和位长应该是一致的。2)信号赋值可以带延时条件,VHDL有2种延迟模式:

transport:传输延迟inertial:

惯性延迟(默认)惯性延时:用于器件延时行为的建模。如果不特别指明延时类型,那就默认采用了惯性延时。它可以防止信号的干扰。只在仿真时有意义,逻辑综合时被忽略,必须将惯性延时去掉,才可实现逻辑综合传输延时:用于对引线的延时的建模。表示连线的延时,必须在VHDL中指定。不管多么小的脉冲都按指定的延时值传给输出。常用于总线延时、连线延时和ASIC的通道延时建模。用于仿真。惯性延时b<=

a

AFTER

20

ns;传输延时b<=

TRANSPORT

a

AFTER

20

ns;aa0

10

20

30

40bba0

10

20

30

40b信号只能在进程外部定义,不能在进程或子程序实体中定义。端口信号。预定义属性:P90表4-2常用的属性:事件发生属性(

Event)格式:

目的变量:=表达式右边的表达式可以是变量、信号或者字符;可以是常数、算术运算表达式、逻辑运算表达式或者关系运算表达式;无延迟特性,直接赋值变量为局部变量不能在实体和结构体

中定义只能在进程

或子程序中定义有三种书写形式:1)单条件控制:If

条件then顺序处理语句;End

if;2)两条件控制:If

条件then顺序处理语句;Else顺序处理语句;End

if;3)多条件控制:If

条件then顺序处理语句;Elsif

条件then顺序处理语句;∶Elsif

条件then顺序处理语句;Else顺序处理语句;End

if;典型应用:选择器、比较器及译设计等凡是可以进行逻辑控制的电路。LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

dff1

ISENDdff1;ARCHITECTURE

rtl

OF

dff1

ISBEGINEnd

rtl;PORT(d,clk:IN

STD_LOGIC;q:OUT

STD_LOGIC);;Process(clk)Beginif(clk’event

and

clk=‘1’)

thenq<=d;End

if;Endprocess;单条件控制if语句门闩控制LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;END

mux2;ARCHITECTURE

behav

OF

mux2

ISBEGINEnd

rtl;PORT(a,b,sel:IN

STD_LOGIC;c:OUT

STD_LOGIC);Process(a,b,sel)Beginif(sel=‘1’)

thenc<=a;elsec<=b;End

if;End

process;两条件控制if语句二选择控制LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

mux4

ISEND

mux4;ARCHITECTURE

behav

OF

mux4

ISBEGINEndrtl;多条件控制if语句多选择控制PORT(input:IN

STD_LOGIC_VECTOR(3

DOWNTO

0);sel:IN

STD_LOGIC_VECTOR(1

DOWNTO0);y:OUT

STD_LOGIC);Process(input,sel)Beginif

(sel=“00”)

then

y<=input(0);elsif(sel=“01”)

then

y<=input(1);elsif(sel=“10”)

then

y<=input(2);y<=input(3);elseend

if;End

process;LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;BEGINY<=cnt;End

rtl;USE

IEEE.STD_LOGIC_unsigned.ALL;ENTITY

counter

ISPORT(clk:IN

STD_LOGIC;y:IN

STD_LOGIC_VECTOR(3

DOWNTO

0));END

counter;ARCHITECTURE

behav

OF

counter

ISSignal

cnt:std_logic_vector(3

doento

0);Process(clk)Beginif(clk’event

and

clk=‘1’)

thenif(cnt=“1111”)then

cnt<=“0000”;elsecnt<=cnt+’1’;Endif;End

if;End

process;注意:嵌套的if语句中,有几个if就对应几个end

if;位及位失量的算术运算Case语句一般用于描述总线、编码和译码的行为。Case语句和if语句功能类似,case语句的可读性强一些,if语句的可逻辑综合性比case语句好。书写格式:CASE

表达式ISWHEN

条件表达式1=>顺序处理语句;WH

EN

条件表达式2=>顺序处理语句;∶END

CASE;WHEN

值=>顺序处理语句;WHEN

值1|值2|值3|…|值n=>顺序处理语句;WHEN值1

TO

值n=>顺序处理语句;

WHEN

OTHERS=>顺序处理语句;End

case;值1、值2…值n是或的关系值1到值n中的任何一个所有其它可能的取值注意:1、所有when条件表达式各条件没有优先级,OTHERS必须放在最后一个分支上;2、必须将表达式的所有取值都用条件表达式列出,覆盖全集;3、条件表达式的值只能出现一次,否则也是语法错误;4、条件表达式中不能出现多个状态值混合。When

01”

--不允许Case语句中条件表达式有四种表示形式:signal

C:

Integer

range

1

to

20;signal

Out1:

integer

range

0

to

3;process

(

C

)case

Ciswhen

1

=>when

2

|

4

|

8=>Out1

<=

0;Out1

<=1;when

3

|

5

to

7|

10

to

15

=>

Out1

<=

2;when

others

=> Out1<=3;--9,

16

to20end

case;endprocessEnd

mux4_behav;LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

mux4

ISEND

mux4;ARCHITECTURE

mux4_behav

OF

mux4

ISBEGINPORT(a,b,i0,i1,i2,i3:IN

STD_LOGIC;q:OUT

STD_LOGIC);B:Process(a,b,i0,i1,i2,i3)Varible sel

:integer

range

0

to

3;Beginsel:=0;if(a=‘1’)

thensel:=sel+1;End

if;if(b=‘1’)

thensel:=sel+2;End

if;Case

sel

isWhen0=>q<=i0;When

1=>q<=i1;When

2=>q<=i2;When

3=>q<=i3;End

case;End

process;i0qa

bi1i2i3MUX4ARCHITECTURE

ART

OF MUX4

ISSIGNAL S

:STD_LOGIC_VECTOR(1

DOWNTO

0);BEGINS<=b&

a;PROCESS(a,b,i0,i1,i2,i3)BEGINCASE

S

ISWHEN

"00"=>q<=i0;WHEN

"01"=>q<=i1;WHEN

"10"=>q<=i2;WHEN

"11"=>q<=i3;WHEN

OTHERS

=>q<='X';END

CASE;ENDPROCESS;END

ART;LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

decode 3to8

ISEND

rtl;PORT(a,b,c,G1,G2A,G2B,SEL:IN

STD_LOGIC;q:OUT

STD_LOGIC_VECTOR(7

DOWNTO

0));indata<=a&b&c;Process(indata,G1,G2A,G2B)BeginIf(G1=‘1’and

G2A=‘1’and

Case

indata

isWhen”000”=>y<=“11111110”;When”001”=>y<=“11111101”;∶END

decode_3to8;ARCHITECTURE

rtl

OF

decode_3to8

ISSignal

indata:

STD_LOGIC_VECTOR(2

DOWNTO

0);BEGINWhen”111”=>y<=“01111111”;When

others=>

y<=“

XX”;End

case;Else

y<=“11111111”;Endif;End

process;LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

encode

ISEND

encode;ARCHITECTURE

encode8_3

OF

encode

ISBEGINENDrtl;PORT(input:IN

STD_LOGIC_VECTOR(7

DOWNTO

0);y:OUT

STD_LOGIC_VECTOR(2

DOWNTO

0));process(input)begincase

input

isWhen”01111111”=>y<=“111”;When”10111111”=>y<=“110”;∶when”11111110”=>y<=“000”;”;when

others=>y<=“End

case;End

process;WITH

input

SELECTy<=“111”WHEN

“01111111”,”110”WHEN

“10111111”,∶

,“000”WHEN

“11111110”,“

”when

others;输入输出b7b6b5b4b3b2b1b0y2y1y0-------0111------01110-----011101----0111100---01111011--011111010-011111100101111111000必须用if语句描述用if语句描述还是用case语句描述?END

rtl;LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

prioprtyencode

ISPORT(input:IN

STD_LOGIC_VECTOR(7

DOWNTO

0);y:OUT

STD_LOGIC_VECTOR(2

DOWNTO

0));END

prioprtyencode;ARCHITECTURE

rtl

OF

prioprtyencode

ISBEGINprocess(input)beginif

(input(0)=‘0’)theny<=“111”;elsif(input(1)=‘0’)theny<=“110”;:elsif(input(6)=‘0’)theny<=“001”;ElseY<=“000”;End

if;End

process;二进制码BCD码000000000000100001001000010001100011010000100010100101011000110011100111100001000100101001101010000101110001110010010110110011111010100111110101其他ZZZZZLIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

bin2bcd

ISEND

bin2bcd

;ARCHITECTURE

rtl

OF

bin2bcdISBEGINEND

rtl;PORT(din:IN

STD_LOGIC_VECTOR(3

DOWNTO

0);bcd:OUT

STD_LOGIC_VECTOR(4

DOWNTO

0));Process(din)BeginCase

din

isWhen”0000”=>bcd<=“00000”;When”0001”=>

bcd

<=“00001”;∶When”1001”=>

bcd

<=“01001”;When”1010”=>

bcd

<=“10000”;When”1011”=>

bcd

<=“10001”;When”1100”=>

bcd

<=“10010”;∶∶When”1111”=>y<=“10101”;When

others=>y<=“ZZZZZ”;End

case;End

process;1、if语句中多条件是顺序执行的,顺序颠倒可能使逻辑综合功能变化。case语句中多条件是并列处理的,前后位置颠倒没关系。2、if语句的条件个数随需要而定。case语句中条件必须包含条件表达式的所有

取值。end

loop;顺序处理语句;循环变量的取值范围,循环变量有几个取值,顺续处理语句就重复执行几次。每循环一次则改变一次循环变量:局部的、临时的,不需要事先定义,不能作为被赋值对象;每一次的改变都是自动完成。Loop语句是循环语句,它和其他高级语言中的循环语句一样。使一组顺序描述语句被循环执行。Loop语句有两种方式:for-------loop方式、while-------loop方式。注意:for---loop语句可以实现逻辑综合,while—loop语句 不能实现逻辑综合;一般编程用for---loop语句。Loop语句可以互相嵌套。1、for-------loop方式:书写格式:[标号:]for

循环变量in

离散范围loopLIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

parity_check

ISEND

parity_check

;ARCHITECTURE

behave

OF

parity_check

ISBEGINEND

behave;cbc:

PROCESS(a)VARIABLE

tmp:

STD_LOGIC;BEGINtmp:='0';FOR

i

IN

0

TO

7

LOOPtmp:=tmp

XOR

a(i);END

LOOP;y<=tmp;END

PROCESS

cbc;PORT(a

:

IN

STD_LOGIC_VECTOR(7

DOWNTO

0);y :

OUT

STD_LOGIC);实现当输入8位数据有偶数个‘0’和‘1’时y<=‘0’,否则y<=‘1’不能定义成信号LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;USE

IEEE.STD_LOGIC_unsigned.ALL;ENTITY

select

ISPORT(d:

IN

STD_LOGIC_VECTOR(2DOWNTO

0);q

:

out

STD_LOGIC_VECTOR(1

DOWNTO

0));END

select

;ARCHITECTURE

behave

OF

select

ISBEGINPROCESS(d)variable

cnt:

STD_LOGIC_VECTOR(1

DOWNTO

0);BEGINcnt:=“00";FOR

i

IN

d’range

LOOP1’then

不能定义成信号t+’1’;END

LOOP;q<=cnt;ENDPROCESS;END

behave;位及位失量的算术运算书写格式:[标号]:WHILE

条件LOOP顺序处理语句;END

LOOP[标号];执行过程:如果条件为真,则执行循环语句中的顺序执行语句;ARCHITECTUREbehave

OF

select

ISBEGINcbc:

PROCESS(a)VARIABLE

tmp:

STD_LOGIC;BEGINtmp:='0';WHILE

i

<8

LOOPtmp:=tmp

XOR

a(i);END

LOOP;y<=tmp;END

PROCESS

cbc;END

behave;i:=0;i:=i+1;使用while---loop时要注意:循环变量必须定义。要在循环体外对循环变量i赋初值;在循环体内实现循环控制变量的递增;variable

i:integer

range

0

to

7;loop1

:

for

i

in

10

downto

1

looploop2

:for

jin

0

to

iloopmatrix(i,j)

:=i*j

+1;end

loop

loop2;end

loop

loop1;Next语句与loop语句一起使用,实现循环的 控制。有条件地或无条件地终止本次循环并开始下一次循环。next[标号][when

条件];1、nextwhen条件;--则当when条件为真,执行到该条语句处则跳出本次循环,从loop语句的起始位置重新开始下一次的循环。2、next;--则执行到该条语句就立即跳出本次循环。3、next

标号;

--则执行到该条语句就立即跳出本次循环跳转到标号指定的循环语句执行。4、next

标号when

条件;当when条件为真,执行到该条语句处则跳出本次循环,到标号指定的循环语句执行。当条件满足时,跳出循环到标号指定的loop语句执行跳出循环的条件语法:PROCESS

(a,b)CONSTANT

max_limit:INTEGER:=255;BEGINFOR

i

IN

0

TO

max_limit

LOOPIF

(done(i)=TRUE)

THENNEXT;ELSE

done(i)<=TRUE;END

IF;q(i)<=a(i)

AND

b(i);END

LOOP;END

PROCESS;L1:WHILE

i<10

LOOPL2:WHILE

j<20

LOOP∶NEXT

L1

WHEN

i=j;∶ENDLOOP

L2;END

LOOP

L1;EXIT[标号][WHEN条件];1、exit;--执行该语句,程序从当前所属的loop语句中退出。2、exit

标号;--执行该语句,程序退出标号标注的loop语句。3、EXIT

WHEN条件;--当条件为真时执行该语句,程序退出当前的loop语句,执行loop语句下面的语句。4、EXIT标号WHEN条件;--当条件为真时执行该语句,程序退出标号标注的语句的loop语句。区别:

NEXT语句是跳向LOOP

语句的起始点;EXIT语句则是跳向LOOP语句的终点。格式:PROCESS(a)VARIABLE

int_a:INTEGER;BEGINint_a:=a;FOR

i

IN

0

TO

max_limit

LOOPIF

(int_a

<=0)

THENEXIT;ELSEint_a:=

int_a-1;q(i)<=3.1416/REAL’(a*i);END

IF;END

LOOP;y<=q;END

PROCESS;过程调用过程名(参数关联表);空语句──null

语句(无任何动作)case

x

iswhen

1

|

0=>

null;when

others

=>

x

:=

x

mod

2;end

case;Ut

Eq

jIXd

Ut

Eq

jIXd并发处理语句用在

architecture和block中,不能用在进程、子程序中。所有并发处理语句都可以加标号。每一个简单并发处理语句等价于一个进程。并发处理语句:行为语句或结构语句行为语句进程语句process简单并行语句结构语句块语句block元件例化语句生成语句generate进程语句(process)块语句(block)并发信号赋值语句条件信号赋值语句选择信号赋值语句并发过程赋值语句元件例化语句生成语句第三部分构造体子结构描述中涉及用于构造体的描述方法第三种结构描述中如果用于process语句和子程序描述语句中为顺序描述语句,否则为并发处理语句在子程序结构过程语句的描述与调用中讲为的最基它是一种并发描述语句,描述硬件系统并本语句。说明部分;begin语句格式:[进程名]:process

(敏感信号表)process语句使用的类型、、、属性常量、变量、子程序子程序体、属性指定等注意:不能有信号顺序处理语句;顺序描述语句;end

process

[进程名];ENTITY

muxISPORT(d0,d1,sel:in

bit;q:out

bit);END

mux;Architecture

dataflow

of

muxisBeginprocess(d0,d1,sel)variable

tmp1,tmp2,tmp3:bit;begintmp1:=d0

and

sel;tmp2:=d1

and

(not

sel);tmp3:=tmp1

or

tmp2;q<=tmp3;end

process;End

dataflow;敏感信号变量说明语句顺序处理语句ENTITY

dlock

ISPORT(d,clk:in

bit;q,nq:out

bit);END

mux;Architecture

dataflow

of

dlock

isBeginprocess(clk)beginif

clk=‘1’

thenq<=d;nq<=not

d;end

if;endprocess;Enddataflow;敏感信号顺序执行语句Process语句的敏感表中敏感信号与process语句描述硬件电路的输入信号一一对应。任何一个敏感信号发生变化都将启动process语句,从上到下顺序执行。当process语句执行完了,回到process语句的开头,等待下一次的变化。Process语句可以不带敏感表,但是要在end

process;前加入wait

on

信号1,信号2,…;process

(A,

B)beginOutput

<=

A

or

B;

=end

process;processbeginOutput

<=

A

or

B;wait

on

A,

B;end

process;注意:process语句敏感表和wait语句只能有一个。一个构造体内如果有多个process语句存在,它们并行同步执行,同时还可以进行通信。多个process语句通信是通过在构造体中定义的信号来实现。Entity

isPort(event_a:in

bit);End

;isArchitecture

catch_ball

ofSignal

to_a,to_b:bit:=‘0’;beginA:process(event_a,to_a)beginIf(event_a’event

and

event_a=‘1’)

or(to_a’event

and

to_a=‘1’)thento_b<=‘1’

after

20

ns;‘0’

after

30

ns;End

if;End

process;B:process(to_b)beginIf((to_b’event

and

to_b=‘1’)thento_a<=‘1’

after

10

ns;‘0’

after

20

ns;End

if;End

process;End

catch_ball;10nsEvent_aTo_b 20nsTo_a目的信号量<=表达式1

WHEN条件1

ELSE表达式2 WHEN

条件2

ELSE∶表达式n-1

WHEN

条件n-1

ELSE表达式n;注意:1、只有最后一个表达式后边才有“;”。2、最后一个表达式可以无条件或用when

others,表示其它列举出的条件都不满足时,将该表达式的值给目的信号量。3、条件有优先权之分,由条件1

顺序往下执行。4、与if语句类似,只是if语句只能用于process或子程序描述中。目的信号量<=表达式1 WHEN

条件1

ELSE表达式2 WHEN

条件2

ELSE∶表达式n-1 WHEN

条件n-1

ELSE表达式n;process(敏感信号表)beginif

条件1

then信号<=表达式1;:elsif条件n-1 then信号

<=表达式n-1

;else信号<=表达式n;end

if;end

process;注意:IF语句替换条件信号赋值语句时必须用在PROCESS语句中LIBRARY

IEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITY

mux4

ISPORT(i0,i1,i2,i3,a,b:IN

STD_LOGIC;q:OUT

STD_LOGIC);END

mux4;ARCHITECTURE

rtl

OF

mux4

ISSIGNAL

sel:

STD_LOGIC_VECTOR(1

DOWNTO

0);BEGINsel<=b

&

a;q<=

i0

WHENsel="00"

ELSEi1

WHEN

sel="01"

ELSEi2

WHEN

sel="10"

ELSEi3

WHEN

sel="11"

ELSE‘X’;END

rtl;LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITY

decoder

ISPORT(SEL:IN

STD_LOGIC_VECTOR(2

DOWNTO

0);q:OUT

STD_LOGIC_VECTOR(7

DOWNTO

0));END

decoder;ARCHITECTURE

decoder3_8

OF

decoder

ISBEGINq<=“11111110”

WHEN

sel=“000"

ELSE“11111101”

WHENsel=“001"ELSE∶“01111111”

WHEN

sel=“111"

ELSE“11111111”

;ENDrtl;process(input)beginif

sel=”000”then

q<=“11111110”;elsif

sel=”001”thenq<=“11111101”;∶elsif

sel=”111”then

q<=“01111111”;else

q<=“11111111”;End

if;End

process;WITH

条件表达式SELECT目的信号量<=表达式1

WHEN

条件1,表达式2

WHEN

条件2,∶表达式n

WHEN

条件n;注意:1、条件无优先权之分;2、最后一个表达式必须有条件;3、最后一个条件后加“;”,其它条件后加“,”;4、与顺序语句中的CASE语句类似;5、必须把条件表达式的所有取值都列出来。格式:process(敏感信号表)begincase

表达式iswhen

分支1=>信号

<=

选择项

波形

1;::when

分支n=>信号

<=

选择项

波形

n;end

case;end

process;WITH

条件表达式SELECT目的信号量<=表达式1

WHEN

条件1,表达式2

WHEN

条件2,∶表达式n

WHEN

条件n;注意:case语句替换条件信号赋值语句时必须用在PROCESS语句中LIBRARY

IEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITY

mux4ISPORT(i0,i1,i2,i3,a,b:IN

STD_LOGIC;q:OUT

STD_LOGIC);END

mux4;ARCHITECTURE

behav

OF

mux4

ISSIGNAL

sel:

INTEGER

range

0

to

3;BEGINWITHsel

SELECTq<=i0

WHEN

0,i1

WHEN1,i2

WHEN

2,‘X’

when

others;sel<=0

WHEN

a='0'

AND

b='0'ELSEWHEN

a='1'

AND

b='0'

ELSEWHEN

a='0'

AND

b='1'

ELSEWHEN

a='1'

AND

b='1‘;END

behav;选择信号

i3

WHEN3,赋值语句条件信号赋值语句注意:两条信号赋值语句执行无先后形式与顺序调用语句相同可加标号。等价于一个进程,敏感信号为输入参数的信号。输入输出参数中不能有变量。元件例化语句与元件(定义)说明语句一起使用称为元件例化,用于实现构造体说明的结构描述。次的设计模块调用低层次结构描述:多层次的设计中,的设计模块。元件例化由两部分组成:元件定义(说明)语句:将一个现成的设计实体定义为一个元件的语句元件例化语句:是此元件与当前设计实体中的连接说明功能:指定构造体中从库中调用的是哪一个编译过的逻辑描述模块(设计实体),或基本门电路。语法:component

元件名generic(说明);port(说明);endcomponent;该元件类属参数的说明元件端口说明在调用该元件的设计实体中构造体的说明(定义)语句部分说明。同该元件设计实体的实体说明部分功能:将调用元件(模块)的端口和类属参数它的设计实体的相关参数和信号。成调用标号:元件名

generic

map(类属参数值

)port

map

(端口信号

);方式有两种:位置

和名称只列出当前系统中的连接实体端口名或定义的信号名,Port

map()中指定的实际信号的书写顺序与元件端口说明中的信号书写顺序一一对应。语法:元件端口名和连接符号“=>”必须存在的。在PORTMAP句中的位置可以是任意的。1.位置 :port

map

(X,

Y,Out1,

Out2)其中X,Y,Out1,

Out2分别为调用元件设计实体中定义的端口或信号。2.名称

:port

map

(a=>X, c=>

Out1,

b=>Y,

d=>Out2)其中=>前面为component(元件说明语句)中指定的端口信号,=>后面为调用元件设计实体中定义的端口或信号。元件and2的实体说明如下:ENTITY

AND2

ISPort(a,b:inbit;c:outbit);END

AND2;U2:and2

port

m

el,d1,ab);U2:and2

port

map(a=>nsel,b=>d1,c=>ab);U2的nsel对应a,d1对应b,ab对应c位置方式名称方式LIBRARY

ieee;use

ieee.std_logic_1164.all;entity

dff1

isport(d,clk:

instd_logic;q:

outstd_logic);end

dff1;architecture

dff1_behave

of

dff1

isbeginprocess(clk)beginif

(clk'event

and

clk='1')

thenq<=d;endif;endprocess;enddff1_behave;dqdqdqdqabclk

clk

clk

clkclk该寄存器由4个D触发器串联相接组成。用结构描述方式完成该寄存器的描述,就要把D触发器作为元件来调用,且要调用4次。首先要完成D触发器的VHDL描述。单个D触发器的VHDL语句描述如下:LIBRARY

ieee;use

ieee.std_logic_1164.all;entity

shift

isend

shift;architecture

struct

of

shift

isbeginComponent

dff1Port(d,clk:in

std_logic;q:

outstd_logic);End

component;Signal

z:std_logic_vector(0

to2);D1:dff1

port

map(a,clk,z(0));D2:dff1

port

map(z(0),clk,z(1));D3:dff1

port

map(z(1),clk,z(2));D4:dff1

port

map(z(2),clk,b);port(a,clk:

in

std_logic;b:

out

std_logic);endstruct;元件说明语句元件例化语句dqdclk

clkqdclkqdclkqaclkbZ(0)Z(1)Z(2)enclkcoclrcountslenclkcoclrshcountenableresetclk该计数器有两个计数器串接组成,其中一个是十进制计数器,一个是六进制计数器;这两个计数器功能一样,只是最大计数值不同;可以设计一个最大计数值可变的计数器----通用计数器所谓通用就是该计数器作为元件被调用时,其最大计数值可修改。定义通用计数器时将最大计数值定义为类属参数即可。en

coclk

clrcountslresetenclkcoclrshcountenableclkLIBRARY

IEEE;USEIEEE.STD_LOGIC_1164.ALL;USE

IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY

counter

ISGENERIC(

count_value:INTEGER:=9);PORT

(clk,clr,en:

IN

STD_LOGIC;co:

OUT

STD_LOGIC;count:OUT

INTEGER

RANGE

0TO

count_value);END

counter;ARCHITECTURE

a

OF

counter

ISSIGNAL

cnt:

INTEGER

RANGE

0

TOcount_value;BEGINPROCESS

(clk,clr)BEGINIF

clr

=

'1'

THENcnt

<=0;ELSIF

(clk'EVENT

ANDclk

=

'1')THENIF

en

=

'1'

THENIF

cnt

=

count_value

THENcnt

<=

0;ELSEcnt

<=

cnt

+’

1’;END

IF;END

IF;END

IF;END

PROCESS;co<=’1’

WHEN

cnt=count_valueELSE

‘0’;count

<=

cnt;END

a;LIBRARY

IEEE;USE

IEEE.

STD_LOGIC_1164.ALL;USE

IEEE.

STD_LOGIC_UNSIGNED.ALL;ENTITY

timer

ISPORT(clk

,

reset

,

enable:

IN

STD_LOGIC;sh:

OUT

INTEGERRANGE

0

to5;sl:

OUT

INTEGER

RANGE

0

to

9;);ENDtimer;ARCHITECTURE

stru

OF

timer

ISSIGNAL

sh_en:

STD_LOGIC;COMPONENT

counter

ISGENERIC(

count_value:INTEGER:=9);PORT

(clk

,

clr

,

en:

IN

STD_LOGIC;co:

OUT

STD_LOGIC;count:

OUT

INTEGER

RANGE

0TO

count_value);ENDCOMPONENT;BEGIN类属参数CNT1S:

counterGENERIC

MAP(

count_value

=>

9)PORT

MAP(clk=>clk,clr=>reset,en=>enable,co=>

sh_en,count=>sl);CNT10S:

counterGENERIC

MAP

(

count_value

=>

5)PORT

MAP

(clk=>clk,clr=>reset,en=>sh_en,

count=>sh);END

stru;enclkcoclrcountslenclkclrcoenableresetclkshSh_en

countLIBRARY

IEEE;USE

IEEE.

STD_LOGIC

_1164.ALL;USE

IEEE.

STD_LOGIC_UNSIGNED.ALL;ENTITY

timer

ISPORT(clk

,

reset

,

enable:

IN

STD_LOGIC;s:

OUT

INTEGER

RANGE

0to

59;min:

OUT

INTEGER

RANGE0

to

59;h

:

OUT

INTEGER

RANGE

0

to11);ENDtimer;ARCHITECTURE

stru

OF

timerISSIGNAL

a1,a2,a3:

STD_LOGIC;COMPONENT

counter

ISGENERIC(

count_value:INTEGER:=9);PORT

(clk

,

clr

,

en:

IN

STD_LOGIC;co:

OUT

STD_LOGIC;count:

OUT

INTEGERRANGE

0TO

count_value);ENDCOMPONENT;BEGINCNTS:

counterGENERIC

MAP(

count_value

=>59)PORT

MAP(clk=>clk,clr=>reset,en=>enable,co=>

a1,count=>s);CNTmin:

counterGENERIC

MAP

(

count_value

=>

59)PORT

MAP

(clk=>clk,clr=>reset,en=>a1,co=>a2,count=>min);CNTh:

counterGENERIC

MAP

(count_value

=>

11)PORT

MAP

(clk=>clk,clr=>reset,en=>a3,

count=>h);a3<=a1

and

a2;END

stru;hminsenclkcoclrcountresetenableclka3

countenclkcoclrcounta2a1&enclk

clr要求:最大计时11点59分59秒用于产生多个相同的结构,主要用在生成 器阵列和寄存器阵列。for……generate语句:[标号:]for

变量in

离散范围generate并发处理语句;end

generate[标号];if……generate语句:[标号:]if

条件

generate并发处理语句;end

generate[标号];书写格式:两种方式:for……generate

和if……generate方式。LIBRARY

ieee;use

ieee.std_logic_1164.all;entity

shift

isport(a,clk:

in

std_logic;b:

out

std_logic);endshift;architecture

struct

of

shift

isComponent

dff1Port(d,clk:in

std_logic;q:

out

std_logic);End

component;Signal

z:std_logic_vector(0

to

4);beginz(0)<=a;For

i

in

0

to

3

generateDx:dff1

port

map(z(i),clk,z(i+1));End

generate;b<=z(4);end

struct;z(0)<=a;D1:dff1

port

map(z(0),clk,z(1));D2:dff1

port

map(z(1),clk,z(2));D3:dff1

port

map(z(2),clk,z(3));D4:dff1

port

map(z(3),clk,z(4));b<=z(4);qd

dclk

clkaclkq

q

bZ(0)

Z(1)d

q

dclk

clkZ(2)

Z(3)

Z(4)beginFor

i

in

0

to

3

generateIf

i=0

generateDx:dff1

port

map(a,clk,z(i+1));End

generate;If

(i=/0)and(i=/3)

generateDx:dff1

port

map(z(i),clk,z(i+1));End

generate;If

i=3

generateDx:dff1

port

map(z(i),clk,b);End

generate;end

struct;LIBRARY

ieee;use

ieee.std_logic_1164.all;entity

shift

isport(a,clk:

in

std_logic;b:

out

std_logic);end

shift;architecture

struct

o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论