4.2顺序语句只能出现在进程、过程和函数中,用以定义在进程、过程和函数中所执行的算法;
按照程序中语句出现的顺序来执行各条语句。
主要顺序语句:
( 1)顺序赋值语句;
( 2) wait语句;
( 3) if语句;
( 4) case语句;
( 5) loop语句;
( 6) next语句;
( 7) exit语句;
( 8) null语句;
( 9) return语句;
( 10)顺序断言语句;
( 11) report语句;
( 12)顺序过程调用语句。
4.2.1顺序赋值语句赋值语句:就是将一个值或一个表达式的运算结果传递给某一个数据对象;
作用:实现设计实体内的数据传递;对端口界面外部数据的读写;
分类:变量赋值语句;信号赋值语句
4.2.2 wait语句进程的工作状态:等待状态;执行状态取决于敏感信号表中的信号或者是否有敏感信号激励;
敏感信号的激励:
由 wait,wait for,wait until和 wait on后面的条件表达式和时间表达式激励
wait语句的 4中基本格式:
wait --无限等待;
wait on --敏感信号变化;
wait until --条件表达式;
wait for --时间表达式
wait on 语句书写格式:
wait on 敏感信号 [,敏感信号 ……] ;
如,wait on a,b; --等待 a,b信号发生变化
(2)wait until语句书写格式:
wait until 条件表达式;
条件表达式为布尔表达式,当返回值为真时才能再次启动进程。
如,wait until a’event and a=‘1’;
(3)wait for 语句书写格式:
wait for 时间表达式;
当时间表达式规定的时间到时进程才脱离等待状态而进入执行状态如,wait for 10ns;
例,RS触发器触发器:是构成时序逻辑电路的基本单元,常用于数据暂存、延时、计数、
分频和波形产生电路输入 输出
R S Q
0 1 0 1
1 0 1 0
1 1 保持 保持
0 0 不定 不定
RS触发器的真值表
RS触发器的电路符号
RS
r
s
qn
q Q
S
R
Q
Q
低电平输入有效的 RS触发器波形图
S –set 置位端
R – reset 复位端
Q,Qn –输出端
原理图输入法
N A N D 2
in s t
N A N D 2
in s t 1
V C C
S IN P U T
V C C
R IN P U T
QO U T P U T
QnO U T P U TRS触发器原理图
文本编辑法
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity RS is
port(r,s:in std_logic;
q,qn,out std_logic);
end RS;
architecture one of RS is
signal q1,qn1,std_logic;
begin
q1<=s nand qn1;
qn1 <= r nand q1;
q<=q1;
qn <= qn1;
end one;
例,J-K触发器(边沿触发)
输入 输出
CP R S J K Q Qn
X 0 1 X X 0 1
X 1 0 X X 1 0
X 0 0 X X 状态不可用
↑ 1 1 0 0 保持 保持
↑ 1 1 0 1 0 1
↑ 1 1 1 0 1 0
↑ 1 1 1 1 翻转 翻转
↓ 1 1 X X 保持 保持
J-K触发器的真值表
JK触发器的电路符号
JK
j
k
r
s
cp
qn
q
S –set 置位端
R – reset 复位端
Q,Qn –输出端
j,k –信号输入端
cp –时钟信号
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity JK is
port(j,k,r,s,cp:in std_logic;
q,qn:out std_logic);
end JK;
architecture one of JK is
signal q_temp,qn_temp,std_logic;
begin
process(r,s,j,k,cp)
begin
if r=‘0’ and s=‘1’ then
q_temp<=‘0’;
qn_temp<=‘1’;
elsif r=‘1’ and s=‘0’ then
q_temp<=‘1’;
qn_temp<=‘0’;
elsif r=‘0’ and s=‘0’ then
q_temp<=q_temp;
qn_temp<=qn_temp;
elsif cp’event and cp=‘1’ then
if j=‘0’ and k=‘1’ then
q_temp<=‘0’;
qn_temp<=‘1’;
elsif j=‘1’ and k=‘0’ then
q_temp<=‘1’;
qn_temp<=‘0’;
elsif j=‘1’ and k=‘1’ then
q_temp<=not q_temp;
qn_temp<=not qn_temp;
end if;
end if;
end process;
q<=q_temp;
qn<=qn_temp;
end one;
4.2.3 if 语句书写格式:
[if标号,]if <条件 > then
<顺序语句 >;
[elsif <条件 > then
<顺序语句 >; ]
[elsif <条件 > then
<顺序语句 >; ]
……
[else
<顺序语句 >; ]
end if [if标号 ];
三种常用形式:
(1) if then 形式的 if语句
[if标号,]if <条件 > then
<顺序语句 >;
end if [if标号 ];
(2) if_then_else形式的 if语句
[if标号,]if <条件 > then
<顺序语句 >;
else
<顺序语句 >;
end if [if标号 ];
( 3) if_then_elsif_else形式的 if语句
[if标号,]if <条件 > then
<顺序语句 >;
[elsif <条件 > then
<顺序语句 >; ]
[elsif <条件 > then
<顺序语句 >; ]
……
[else
<顺序语句 >; ]
end if [if标号 ];
4.2.4 case语句书写格式:
case <表达式 > is
when <条件选择值 1> => <顺序语句 1>;
when <条件选择值 2> => <顺序语句 2>;
when <条件选择值 3> => <顺序语句 3>;
……
when <条件选择值 n> => <顺序语句 n>;
end case;
例,D触发器输入 输出
CP R S D Q Qn
X 0 1 X 0 1
X 1 0 X 1 0
↓ 1 1 X 保持 保持
↑ 1 1 0 0 1
↑ 1 1 1 1 0
D触发器的真值表
D触发器的电路符号
d
d
cp
r
s qn
q
S –set 置位端
R – reset 复位端
Q,Qn –输出端
d –信号输入端
cp –时钟信号
图像编辑法
CLRN
D
PRN
Q
D FF
ins t
prn-置数端
d –数据输入端
clk –时钟信号
Q –输出端
clrn –清零端
CLRN
D
PRN
Q
D F F
in s t
V C C
p rn IN P U T
V C C
d IN P U T
V C C
c lk IN P U T
V C C
c lr n IN P U T
qO U T P U T
输入 输出
CP R(CLRN) S(PRN) D Q Qn
X 0 1 X 0 1
X 1 0 X 1 0
↓ 1 1 X 保持 保持
↑ 1 1 0 0 1
↑ 1 1 1 1 0
D触发器的真值表
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity d is
port(d,r,s,cp:in std_logic;
q,qn:out std_logic);
end d;
architecture one of d is
signal q_temp,qn_temp,std_logic;
begin
process(r,s,d,cp)
begin
if r=‘0’ and s=‘1’ then
q_temp<=‘0’;
qn_temp<=‘1’;
elsif r=‘1’ and s=‘0’ then
q_temp<=‘1’;
qn_temp<=‘0’;
elsif r=‘0’ and s=‘0’ then
q_temp<=q_temp;
qn_temp<=qn_temp;
elsif cp’event and cp=‘1’ then
q_temp<=d;
qn_temp<=not d;
end if;
end process;
q<=q_temp;
qn<=qn_temp;
end one;
例,T触发器输入 输出
T cp Q
0 X 保持
1 ↓ 保持
1 ↑ 反转
T触发器的真值表
T触发器的电路符号
t
t
cp
qt-输入信号
cp-时钟
library ieee;
use ieee.std_logic_1164.all;
entity t is
port(t,cp:in std_logic;
q,out std_logic);
end t;
architecture one of t is
signal q_temp,std_logic
begin
process(cp);
if cp’event and cp=‘1’ then
q_temp<= not q_temp;
else
q_temp<=q_temp;
end if;
end process;
q<=q_temp;
end one;
4.2.5 loop语句功能:使程序进行有规则的循环。
形式,for 循环语句; while 循环语句。
1,for循环语句书写格式:
[循环标号,]for 循环变量 in 离散范围 loop
<顺序处理语句 >;
end loop [循环标号 ];
例,8位奇偶校验电路
library ieee;
use ieee.std_logic_1164.all;
entity parity_check is
port(input:in std_logic_vector(7 downto 0);
y,out std_logic);
end parity_check;
architecture one of parity_check is
begin
p1,process(input)
variable tmp,std_logic;
begin
tmp:=‘0’;
loop1,for i in 0 to 7 loop
tmp:=tmp xor input(i);
end loop loop1;
y<=tmp;
end process p1;
end one;
2,while 循环语句书写格式:
[循环标号,]while <条件 > loop
<顺序处理语句 >;
end loop [循环标号 ];
例:采用 while循环语句描述 8位奇偶校验电路
library ieee;
use ieee.std_logic_1164.all;
entity parity_check is
port(input:in std_logic_vector(7 downto 0);
y,out std_logic);
end parity_check;
architecture one of parity_check is
begin
p1,process(input)
variable tmp,std_logic;
variable i,integer;
begin
tmp:=‘0’;
i:=0;
loop1,while (i<8) loop
tmp:=tmp xor input(i);
i:=i+1;
end loop loop1;
y<=tmp;
end process p1;
end one;
4.2.6 next语句跳出本次循环的语句;
书写格式:
next [循环标号 ] [when 条件 ];
4.2.7 exit语句跳出整个循环的语句;
书写格式:
exit [循环标号 ] [when 条件 ];
4.2.8 null语句空操作,不发生任何操作;
书写格式:
null;
4.2.9 return语句只能用在函数和过程体中,并用来结束当前最内层的函数或者过程体的执行;
书写格式:
(1) return 表达式;
(2) return;
例,function max(a,b:integer) return integer is
begin
if(a>b) then
return a;
else
return b;
end if;
end max;
例:同步计数器功能:对时钟脉冲计数、可用于时钟分频、信号定时、地址发生器和数字运算分类:
按计数方向分:加法计数器、减法计数器和可逆计数器按计数器中各个触发器的时钟是否同步分:
同步计数器和异步计数器
同步 4位二进制计数器同步 4位二进制计数器的电路符号
cnt16
clk
r
s
en
d[3…0]
q[3…0]
co
clk R S EN 工作状态
X 1 X X 置零
↑ 0 1 X 预置数
↑ 0 0 1 计数
X 0 0 0 保持不变同步 4位二进制计数器的状态表
clk –时钟信号输入端;
s - 置数端;
r - 清零端;
en - 使能端;
d[3…0] –预置数数据端;
co –进位信号输出端。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt16 is
port(d:in std_logic_vector(3 downto 0);
clk,r,s,en:in std_logic;
q:buffer std_logic_vector(3 downto 0);
co,out std_logic);
end cnt16;
architecture one of cnt16 is
begin
process (rst,clk)
begin
ifr=‘1’ then
q<=(others=>’0’); --清零
elsif clk’event and clk=‘1’ then
ifs=‘1’ then --置数
q <= d;
elsifen=‘1’ then
q<=q+1; --计数
else
q<=q; --保持
end if;
end if;
end process;
co<=‘1’ when q=?1111? and en=‘1’ else ‘0’; --进位
end cnt16;
例:减法计数器在时钟脉冲作用下,进行减 1操作的一种计数器。
同步十进制减法计数器同步十进制减法计数器的电路符号
jian_cnt10
clk
rstq[3…0]
clk –时钟信号输入端;
rst - 复位端; (高电平有效 )
q[3…0] –计数输出端;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jian_cnt10 is
port(clk,rst,in std_logic;
q:out std_logic_vector(3 downto 0));
end jian_cnt10;
architecture one of jian_cnt10 is
signal q_temp,std_logic_vector(3 downto 0);
begin
process (rst,clk)
begin
ifrst=‘1’ then
q_temp<=?0000?; --清零
elsif clk’event and clk=‘1’ then
ifq_temp=?0000? then q_temp<=?1001?; --置数
else
q_temp<=q_temp-1; --计数
end if;
end if;
end process;
q<=q_temp;
end one;
例:可逆计数器根据计数器控制信号的不同,在时钟脉冲作用下,可以进行加 1操作或者减 1操作的计数器。
同步 4位 2进制可逆计数器
clr S EN CLK UPDN 工作状态
1 X X X X 置零
0 1 1 ↑ X 预置数
0 0 1 ↑ 1 加法计数
0 0 1 ↑ 0 减法计数
0 0 0 X X 保持同步 4位二进制可逆计数器的状态表
4位二进制可逆计数器的电路符号
Kn_cnt16clk
clr
s
en
updn
d[3…0]
q[3…0]
clk –时钟信号输入端;
clr –清零端;
s - 置数端;
d[3…0] –预置数数据端;
en –使能端;
updn –计数方向控制端;
co –进位端;
q[3…0] –计数输出端;
co
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity kn_cnt16 is
port(d:in std_logic_vector(3 downto 0);
clk,s,en,clr,updn:in std_logic;
q:out std_logic_vector(3 downto 0);
co,out std_logic);
end kn_cnt16;
architecture one of kn_cnt16 is
begin
process (clk,clr)
begin
if clr=‘1’then q<=?0000?; co<=‘0’; --清零
elsif clk’event and clk=‘1’ then
if s=‘1’then q<=d;
elsif en=‘1’ then
if updn=‘1’ then
if q=?1111? then q<=?0000?; co<=‘1’;
else q<=q+1; co<=‘0’;
end if ;
elsif updn=‘0’ then
if q=?0000? then q<=?1111?; co<=‘1’;
else q<=q-1; co<=‘0’;
end if;
end if;
else q<=q; co<=co;
end if;
end if;
end if;
end process;
end one;