4.1.3并行信号赋值语句信号赋值语句,目标信号 <= 表达式;
三种形式:并发信号赋值语句;条件信号赋值语句;选择信号赋值语句
1,并发信号赋值语句又称基本信号赋值语句。
一个结构体中多条并发信号赋值语句是并行执行的,与书写顺序无关。
例:加法器包括:半加器、全加器和多位全加器
(1) 半加器将两个输入的二进制数字相加,输出结果为和 (sum)和进位 (carry)。
半加器:只考虑了两个加数本身,没有考虑从低位来的进位输入 输出被加数 A 加数 B 和数 S 进位 C
0 0 0 0
0 1 1 0
1 0 0 0
1 1 0 1
半加器的真值表半加器的电路符号
half_add
a
b
c
s
半加器的原理图编辑
X O R
in s t
A N D 2
in s t 1
V C C
A IN P U T
V C C
B IN P U T
SO U T P U T
CO U T P U T半加器的原理图编辑
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity half_add is
port(a,b:in std_logic;
s,c,out std_logic);
end half_add;
architecture one of half_add is
begin
s<=a xor b;
c<=a and b;
end one;
或 library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity half_add is
port(a,b:in std_logic;
s,c,out std_logic);
end half_add;
architecture one of half_add is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a )+b;
s<=temp(0);
c<=temp(1);
end one;
(2) 全加器输入 输出被加数 A 加数 B 低位进 位 ci 和数 s 进位 co
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
全加器的真值表全加器的电路符号
add
a
b
co
s
全加器执行加数、被加数和低位来的进位信号,并根据求和结果给出该进位的信号。
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity add1 is
port(a,b,ci:in std_logic;
s,co,out std_logic);
end add1;
architecture one of add1 is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a )+b+ci;
s<=temp(0);
co<=temp(1);
end one;
(3) 4位全加器
A,B分别为 4位二进制,ci为低位进位输入信号
4位全加器的电路符号
add4
a[3…0]
b[3…0]
co
s[3…0]
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity add4 is
port(a,b:in std_logic_vector(3 downto 0);
co,out std_logic;
ci,in std_logic;
s,out std_logic_vector(3 downto 0));
end add4;
architecture one of add4 is
signal temp,std_logic_vector(4 downto 0);
begin
temp<=(‘0’&a )+b+ci;
s<=temp(3 downto 0);
co<=temp(4);
end one;
例:减法器包括半减器、全减器和多位全减器
(1)半减器只考虑了减数和被减数,而没有考虑由低位来的借位输入 输出被减数 A 减数 B 差 dout 借位 cout
0 0 0 0
0 1 1 1
1 0 1 0
1 1 0 0
半加器的真值表半加器的电路符号
half_sub
b
a
cout
dout
无符号位二进制减法:
0-0=0; 1-0=1; 1-1=0; 0-1=1 (从高位借位 1)
借位规则,(a)如果从某一位借 1后,则该位变为 0;
(b)如果借位的位本来是 0,则要继续向更高一位借位,直到值为 1
的位,原位上值为 0的都转为 1,而最后借位的位转为 0.
例:计算 1110 - 1101
1 1 1 0
- 1 0 0 1
向次高位的借位新的次高位
0 1 0 1
例:计算 10000-101
0 1
1 0 0 0 0
-1 0 1
1 1 1 1
向高位借位后
1 0 1 1
思考:求,10101-10010;
答,00011
求,10000-1111;
答,0001
采用原理图输入法 X O R
in s t
N O T
in s t 1
A N D 2
ins t 2
V C C
a IN P U T
V C C
b IN P U T
doutO U T P U T
c o u tO U T P U T
半减器原理图编辑
采用文本编辑法
library ieee;
use ieee.std_logic_1164.all;
entity half_sub is
port(a,b:in std_logic;
dout,cout,out std_logic);
end half_sub;
architecture one of half_sub is
begin
dout<=a xor b;
cout<=not a and b;
end one;
或 library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity half_sub is
port(a,b:in std_logic;
dout,cout,out std_logic);
end half_sub;
architecture one of half_sub is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a ) -b;
dout<=temp(0);
cout<=temp(1);
end one;
( 2)全减器不但要进行 A – B的减法操作还要考虑低位的借位信号 ci。
输入 输出被加数 A 加数 B 低位借 位 ci dout cout
0 0 0 0 0
0 0 1 1 1
0 1 0 1 1
0 1 1 0 1
1 0 0 1 0
1 0 1 0 0
1 1 0 0 0
1 1 1 1 1
全减器的真值表全减器的电路符号
sub
b
a
cout
dout
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sub is
port(a,b,ci:in std_logic;
dout,cout,out std_logic);
end sub;
architecture one of sub is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a ) -b-ci;
dout<=temp(0);
cout<=temp(1);
end one;
(3)4位全减器
4位全减器的电路符号
sub4
a[3…0]
b[3…0]
cout
dout[3…0]
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sub4 is
port(a,b:in std_logic_vector(3 downto 0);
ci,in std_logic;
cout,out std_logic;
dout,out std_logic_vector(3 downto 0));
end sub4;
architecture one of sub4 is
signal temp,std_logic_vector(4 downto 0);
begin
temp<=(‘0’&a ) -b-ci;
dout<=temp(3 downto 0);
cout<=temp(4);
end one;
2,条件信号赋值语句也是一种并行信号赋值语句,可以根据不同的条件将不同的表达式的值赋给目标。
基本书写格式:
目标信号 <= 表达式 1 when 条件 1 else
表达式 2 when 条件 2 else
表达式 3 when 条件 3 else
…
表达式 n-1 when 条件 n-1 else
表达式 n;
注意,( 1)只有当条件满足时,才能将该条件前面的表达式的值赋给目标信号;
( 2)对条件进行判断是有顺序的,位置靠前的条件具有较高的优先级,只有不满足本条件的时候,才会去判断下一个条件;
( 3)条件表达式的结果应为布尔型数值;
( 4)最后一个表达式后面不含有 when子句;
( 5)条件信号赋值语句允许条件重叠。
例,4选 1数据选择器输入 输出
A1 A0 Y
0 0 D0
0 1 D1
1 0 D2
1 1 D3
4选 1数据选择器真值表
4选 1数据选择器的电路符号
mux4
d0
d1
d2
d3
a[1…0]
y
library ieee;
use ieee.std_logic_1164.all;
entity mux4 is
port(d0,d1,d2,d3:in std_logic;
a0,a1,in std_logic;
y,out std_logic);
end mux4;
architecture one of mux4 is
begin
y<= d0 when a0=‘0’ and a1=‘0’else
d1 when a0=‘0’ and a1=‘1’else
d2 when a0=‘1’ and a1=‘0’else
d3 when a0=‘1’ and a1=‘1’else
‘Z’;
end one;
3,选择信号赋值语句选择信号赋值语句对选择条件表达式进行测试,当选择条件表达式取值不同时,
将使信号表达式不同的值赋给目标信号。
基本书写格式:
with 选择条件表达式 select
目标信号 <= 信号表达式 1 when 选择条件 1,
信号表达式 2 when 选择条件 2,
…
信号表达式 n when 选择条件 n;
注意,(1)只有当选择条件表达式的值符合某一选择条件时,才将该选择条件前面的信号表达式赋给目标信号;
( 2)每一个信号表达式后面都含有 when子句;
( 3)由于选择信号赋值语句是并发执行的,所以不能够在进程中使用;
( 4)选择信号赋值语句对选择条件的测试是同时的,因此不允许有选择条件重叠的情况;
( 5)选择条件不允许出现涵盖不全的情况。
例,4选 1数据选择器
library ieee;
use ieee.std_logic_1164.all;
entity mux4 is
port(d0,d1,d2,d3:in std_logic;
a0,a1,in std_logic;
y,out std_logic);
end mux4;
architecture one of mux4 is
signal comb,std_logic_vector(1 downto 0);
begin
comb <= a1 & a0;
with comb select
y <= d0 when?00?,
d1 when?01?,
d2 when?10?,
d3 when?11?,
‘Z’ when others;
end one;
4.1.4 并行过程调用语句过程调用语句的形式:
顺序过程调用语句 —位于进程语句或另一个子程序的内部;
并行过程调用语句 —位于其它子程序或进程语句的外部。
并行过程调用语句在结构体或块语句中是并发执行的,与书写顺序无关。
书写格式,过程名(参数表);
注意,( 1)并行过程调用语句是一个完整的语句,在它的前面可加标号;
( 2)并行过程调用语句应带有 in,out或者 input参数,它们应列于过程名后跟的括号内;
( 3)被并行过程调用的过程的形式参数必须是常量或信号,而不能是变量;
( 4)并行过程调用语句可以有多个返回值,但是这些返回值必须通过过程中所定义的输出参数带回。
例:求输入位矢量最大值。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity max_value is
port(a1:in std_logic_vector(3 downto 0);
a2:in std_logic_vector(3 downto 0);
a3:in std_logic_vector(3 downto 0);
q:out std_logic_vector(3 downto 0)
);
end max_value;
architecture one of max_value is
procedure max(a,b,in std_logic_vector;
signal c,out std_logic_vector) is
variable temp,std_logic_vector(a’range);
begin
if(a>b) then
temp:=a;
else
temp:=b;
end if;
c<=temp;
end max;
signal tmp1,tmp2:std_logic_vector(3 downto 0);
begin
max(a1,a2,tmp1);
max(tmp1,a3,tmp2);
q<=tmp2;
end one;
例:数值比较器输入 输出
A,B Y1 Y2 Y3
A>B 1 0 0
A=B 0 1 0
A<B 0 0 1
4位数值比较器真值表
4位数值比较器的电路符号
comparator_4
y1
y2
y3
a[3…0]
b[3…0]
library ieee;
use ieee.std_logic_1164.all;
entity comp4 is
port(a,b:in std_logic_vector(3 downto 0);
y1,y2,y3,out std_logic);
end comp4;
architecture one of comp4 is
begin
if a>b then y1<=‘1’; y2<=‘0’;y3<=‘0’;
elsif a=b then y1<=‘0’; y2<=‘1’;y3<=‘0’;
elsif a<b then y1<=‘0’; y2<=‘0’;y3<=‘1’;
end if;
end one;
4.1.5 并行断言语句用于程序的仿真、调试书写格式,assert 条件
report 输出信息
severity 出错信息;
条件 —布尔表达式,如果为? false‖,断言语句将输出字符串到终端;
输出信息 ——字符串,如果 report子句缺省,则默认报告信息为:
―Assertion violation‖
出错信息 —如果缺省,默认错误级别为 error.
错误级别可分为四类:
note,warning,error,failure
断言语句分类:顺序断言语句;并行断言语句顺序断言语句:只能用于进程、函数和过程中并行断言语句:可在实体说明、结构体和块语句中使用,可放在任何观察点和调试点上例:
library ieee;
use ieee.std_logic_1164.all;
entity example is
end example;
architecture one of example is
begin
assert false
report?This entity is a example to descript assert statement?
severity note;
end one;
三种形式:并发信号赋值语句;条件信号赋值语句;选择信号赋值语句
1,并发信号赋值语句又称基本信号赋值语句。
一个结构体中多条并发信号赋值语句是并行执行的,与书写顺序无关。
例:加法器包括:半加器、全加器和多位全加器
(1) 半加器将两个输入的二进制数字相加,输出结果为和 (sum)和进位 (carry)。
半加器:只考虑了两个加数本身,没有考虑从低位来的进位输入 输出被加数 A 加数 B 和数 S 进位 C
0 0 0 0
0 1 1 0
1 0 0 0
1 1 0 1
半加器的真值表半加器的电路符号
half_add
a
b
c
s
半加器的原理图编辑
X O R
in s t
A N D 2
in s t 1
V C C
A IN P U T
V C C
B IN P U T
SO U T P U T
CO U T P U T半加器的原理图编辑
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity half_add is
port(a,b:in std_logic;
s,c,out std_logic);
end half_add;
architecture one of half_add is
begin
s<=a xor b;
c<=a and b;
end one;
或 library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity half_add is
port(a,b:in std_logic;
s,c,out std_logic);
end half_add;
architecture one of half_add is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a )+b;
s<=temp(0);
c<=temp(1);
end one;
(2) 全加器输入 输出被加数 A 加数 B 低位进 位 ci 和数 s 进位 co
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
全加器的真值表全加器的电路符号
add
a
b
co
s
全加器执行加数、被加数和低位来的进位信号,并根据求和结果给出该进位的信号。
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity add1 is
port(a,b,ci:in std_logic;
s,co,out std_logic);
end add1;
architecture one of add1 is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a )+b+ci;
s<=temp(0);
co<=temp(1);
end one;
(3) 4位全加器
A,B分别为 4位二进制,ci为低位进位输入信号
4位全加器的电路符号
add4
a[3…0]
b[3…0]
co
s[3…0]
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity add4 is
port(a,b:in std_logic_vector(3 downto 0);
co,out std_logic;
ci,in std_logic;
s,out std_logic_vector(3 downto 0));
end add4;
architecture one of add4 is
signal temp,std_logic_vector(4 downto 0);
begin
temp<=(‘0’&a )+b+ci;
s<=temp(3 downto 0);
co<=temp(4);
end one;
例:减法器包括半减器、全减器和多位全减器
(1)半减器只考虑了减数和被减数,而没有考虑由低位来的借位输入 输出被减数 A 减数 B 差 dout 借位 cout
0 0 0 0
0 1 1 1
1 0 1 0
1 1 0 0
半加器的真值表半加器的电路符号
half_sub
b
a
cout
dout
无符号位二进制减法:
0-0=0; 1-0=1; 1-1=0; 0-1=1 (从高位借位 1)
借位规则,(a)如果从某一位借 1后,则该位变为 0;
(b)如果借位的位本来是 0,则要继续向更高一位借位,直到值为 1
的位,原位上值为 0的都转为 1,而最后借位的位转为 0.
例:计算 1110 - 1101
1 1 1 0
- 1 0 0 1
向次高位的借位新的次高位
0 1 0 1
例:计算 10000-101
0 1
1 0 0 0 0
-1 0 1
1 1 1 1
向高位借位后
1 0 1 1
思考:求,10101-10010;
答,00011
求,10000-1111;
答,0001
采用原理图输入法 X O R
in s t
N O T
in s t 1
A N D 2
ins t 2
V C C
a IN P U T
V C C
b IN P U T
doutO U T P U T
c o u tO U T P U T
半减器原理图编辑
采用文本编辑法
library ieee;
use ieee.std_logic_1164.all;
entity half_sub is
port(a,b:in std_logic;
dout,cout,out std_logic);
end half_sub;
architecture one of half_sub is
begin
dout<=a xor b;
cout<=not a and b;
end one;
或 library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity half_sub is
port(a,b:in std_logic;
dout,cout,out std_logic);
end half_sub;
architecture one of half_sub is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a ) -b;
dout<=temp(0);
cout<=temp(1);
end one;
( 2)全减器不但要进行 A – B的减法操作还要考虑低位的借位信号 ci。
输入 输出被加数 A 加数 B 低位借 位 ci dout cout
0 0 0 0 0
0 0 1 1 1
0 1 0 1 1
0 1 1 0 1
1 0 0 1 0
1 0 1 0 0
1 1 0 0 0
1 1 1 1 1
全减器的真值表全减器的电路符号
sub
b
a
cout
dout
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sub is
port(a,b,ci:in std_logic;
dout,cout,out std_logic);
end sub;
architecture one of sub is
signal temp,std_logic_vector(1 downto 0);
begin
temp<=(‘0’&a ) -b-ci;
dout<=temp(0);
cout<=temp(1);
end one;
(3)4位全减器
4位全减器的电路符号
sub4
a[3…0]
b[3…0]
cout
dout[3…0]
ci
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sub4 is
port(a,b:in std_logic_vector(3 downto 0);
ci,in std_logic;
cout,out std_logic;
dout,out std_logic_vector(3 downto 0));
end sub4;
architecture one of sub4 is
signal temp,std_logic_vector(4 downto 0);
begin
temp<=(‘0’&a ) -b-ci;
dout<=temp(3 downto 0);
cout<=temp(4);
end one;
2,条件信号赋值语句也是一种并行信号赋值语句,可以根据不同的条件将不同的表达式的值赋给目标。
基本书写格式:
目标信号 <= 表达式 1 when 条件 1 else
表达式 2 when 条件 2 else
表达式 3 when 条件 3 else
…
表达式 n-1 when 条件 n-1 else
表达式 n;
注意,( 1)只有当条件满足时,才能将该条件前面的表达式的值赋给目标信号;
( 2)对条件进行判断是有顺序的,位置靠前的条件具有较高的优先级,只有不满足本条件的时候,才会去判断下一个条件;
( 3)条件表达式的结果应为布尔型数值;
( 4)最后一个表达式后面不含有 when子句;
( 5)条件信号赋值语句允许条件重叠。
例,4选 1数据选择器输入 输出
A1 A0 Y
0 0 D0
0 1 D1
1 0 D2
1 1 D3
4选 1数据选择器真值表
4选 1数据选择器的电路符号
mux4
d0
d1
d2
d3
a[1…0]
y
library ieee;
use ieee.std_logic_1164.all;
entity mux4 is
port(d0,d1,d2,d3:in std_logic;
a0,a1,in std_logic;
y,out std_logic);
end mux4;
architecture one of mux4 is
begin
y<= d0 when a0=‘0’ and a1=‘0’else
d1 when a0=‘0’ and a1=‘1’else
d2 when a0=‘1’ and a1=‘0’else
d3 when a0=‘1’ and a1=‘1’else
‘Z’;
end one;
3,选择信号赋值语句选择信号赋值语句对选择条件表达式进行测试,当选择条件表达式取值不同时,
将使信号表达式不同的值赋给目标信号。
基本书写格式:
with 选择条件表达式 select
目标信号 <= 信号表达式 1 when 选择条件 1,
信号表达式 2 when 选择条件 2,
…
信号表达式 n when 选择条件 n;
注意,(1)只有当选择条件表达式的值符合某一选择条件时,才将该选择条件前面的信号表达式赋给目标信号;
( 2)每一个信号表达式后面都含有 when子句;
( 3)由于选择信号赋值语句是并发执行的,所以不能够在进程中使用;
( 4)选择信号赋值语句对选择条件的测试是同时的,因此不允许有选择条件重叠的情况;
( 5)选择条件不允许出现涵盖不全的情况。
例,4选 1数据选择器
library ieee;
use ieee.std_logic_1164.all;
entity mux4 is
port(d0,d1,d2,d3:in std_logic;
a0,a1,in std_logic;
y,out std_logic);
end mux4;
architecture one of mux4 is
signal comb,std_logic_vector(1 downto 0);
begin
comb <= a1 & a0;
with comb select
y <= d0 when?00?,
d1 when?01?,
d2 when?10?,
d3 when?11?,
‘Z’ when others;
end one;
4.1.4 并行过程调用语句过程调用语句的形式:
顺序过程调用语句 —位于进程语句或另一个子程序的内部;
并行过程调用语句 —位于其它子程序或进程语句的外部。
并行过程调用语句在结构体或块语句中是并发执行的,与书写顺序无关。
书写格式,过程名(参数表);
注意,( 1)并行过程调用语句是一个完整的语句,在它的前面可加标号;
( 2)并行过程调用语句应带有 in,out或者 input参数,它们应列于过程名后跟的括号内;
( 3)被并行过程调用的过程的形式参数必须是常量或信号,而不能是变量;
( 4)并行过程调用语句可以有多个返回值,但是这些返回值必须通过过程中所定义的输出参数带回。
例:求输入位矢量最大值。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity max_value is
port(a1:in std_logic_vector(3 downto 0);
a2:in std_logic_vector(3 downto 0);
a3:in std_logic_vector(3 downto 0);
q:out std_logic_vector(3 downto 0)
);
end max_value;
architecture one of max_value is
procedure max(a,b,in std_logic_vector;
signal c,out std_logic_vector) is
variable temp,std_logic_vector(a’range);
begin
if(a>b) then
temp:=a;
else
temp:=b;
end if;
c<=temp;
end max;
signal tmp1,tmp2:std_logic_vector(3 downto 0);
begin
max(a1,a2,tmp1);
max(tmp1,a3,tmp2);
q<=tmp2;
end one;
例:数值比较器输入 输出
A,B Y1 Y2 Y3
A>B 1 0 0
A=B 0 1 0
A<B 0 0 1
4位数值比较器真值表
4位数值比较器的电路符号
comparator_4
y1
y2
y3
a[3…0]
b[3…0]
library ieee;
use ieee.std_logic_1164.all;
entity comp4 is
port(a,b:in std_logic_vector(3 downto 0);
y1,y2,y3,out std_logic);
end comp4;
architecture one of comp4 is
begin
if a>b then y1<=‘1’; y2<=‘0’;y3<=‘0’;
elsif a=b then y1<=‘0’; y2<=‘1’;y3<=‘0’;
elsif a<b then y1<=‘0’; y2<=‘0’;y3<=‘1’;
end if;
end one;
4.1.5 并行断言语句用于程序的仿真、调试书写格式,assert 条件
report 输出信息
severity 出错信息;
条件 —布尔表达式,如果为? false‖,断言语句将输出字符串到终端;
输出信息 ——字符串,如果 report子句缺省,则默认报告信息为:
―Assertion violation‖
出错信息 —如果缺省,默认错误级别为 error.
错误级别可分为四类:
note,warning,error,failure
断言语句分类:顺序断言语句;并行断言语句顺序断言语句:只能用于进程、函数和过程中并行断言语句:可在实体说明、结构体和块语句中使用,可放在任何观察点和调试点上例:
library ieee;
use ieee.std_logic_1164.all;
entity example is
end example;
architecture one of example is
begin
assert false
report?This entity is a example to descript assert statement?
severity note;
end one;