EDA笔记(5)--顺序语句

目录

一.赋值语句

 

一、赋值语句功能

二、信号和变量赋值

三.赋值目标

二.转向控制语句

一、IF条件语句

二、CASE选择语句

 

三.LOOP循环语句

扫描二维码关注公众号,回复: 11098226 查看本文章

 

三.其他顺序语句

一.等待语句

二.返回语句

三.空操作语句


一.赋值语句

 

一、赋值语句功能


就是将一个值或一个表达式的运算结果传递给某一数据对象,如信号或变量,或由此组成的数组。

二、信号和变量赋值


1.赋值语句有两种,即信号赋值语句和变量赋值语句:


(1)变量赋值目标:=赋值源;
其中冒号加等号(:=)作为一个整体,称之为变量赋值符号
(2)信号赋值目标<=赋值源;
其中指向左边的双箭头(<=)作为一个整体,称之为信号赋值符号


2.变量赋值与信号赋值的区别:


(1)变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程序中。信号具有全局性特征,它不但可以作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其他的实体进行通信。
(2)变量的赋值是立即发生的,即是一种时间延迟为零的赋值行为。而信号的赋值过程总是有某种延时的,它反映了硬件系统并不是立即发生的,它发生在一个进程结束时。


3.当在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的赋值,其前面相同的赋值目标则不作任何变化。

三.赋值目标


1.标识符赋值目标:以简单的标识符作为被赋值的信号或变量名。
2.数组单元素赋值目标:数组类信号或变量名(下标名)
3.段下标元素赋值目标

举例下标的排序示例:

VARIABLE A,B:STD_LOGIC_VECTOR(1 TO 4);
A(1 TO 2):="10"; --等效于A(1):='1',A(2):='0'
A(4 DOWNTO 1):="1011";--等效于A(4):='1',A(3):=0,A(2):='1',A(1):='1'

4.集合块赋值目标:


以一个集合的方式来赋值的。对目标中的每个元素进行赋值的方式有两种,即位置关联赋值方式和名字关联赋值方式
对元素赋值示例:

S <= ('0','1','0','0');
(A,B,C,D) <= S;
--表示将A<='0'; B<='1'; C<='0'; D<='0'; 是位置关联赋值

(3=>E, 4=>F, 2=>G(1), 1=>G(2)):= H;
--表示G(2):=H(1); G(1):=H(2); E:=H(3); F:=H(4) 是名字关联赋值

二.转向控制语句

一、IF条件语句


1.语句功能:
IF语句,是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句。

2.语句结构:

3.应用举例

--设计一个选择器
library ieee;
use ieee.std_logic_1164.all;
entity ifcode is
	port (A,B,C: in boolean;
			Y: out boolean);
end entity ifcode;
architecture art of ifcode is
	begin
	process (A,B,C) is
		variable n: boolean;
		begin
		--if语句
		if a then n:=b;
		else n:=c;
		end if;
		y<=n;
	end process;
end architecture art;

RTL图像

--设计8线-3线优先编码器
library ieee;
use ieee.std_logic_1164.all;
entity coder is
	port (sr: in std_logic_vector(0 to 7);
			sc: out std_logic_vector(0 to 2));
end entity coder;
architecture art of coder is
	begin
	process(sr) is
		begin
		if(sr(7)='0') then sc<="000";
		elsif(sr(6)='0') then sc<="100";
		elsif(sr(5)='0') then sc<="010";
		elsif(sr(4)='0') then sc<="110";
		elsif(sr(3)='0') then sc<="001";
		elsif(sr(2)='0') then sc<="101";
		elsif(sr(1)='0') then sc<="011";
		else sc<="111";
		end if;
	end process;
end architecture art;
		

二、CASE选择语句


1.CASE语句功能:
CASE语句,就是根据满足的条件直接选择多项顺序语句中的一项执行

注意:条件语句中的"=>"不是操作符,只相当于"then"的作用,俗话说"那么就是"的意思。

3.使用CASE语句的注意事项:
(1)条件句中的选择值必须在表达式的取值范围内。
(2)除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。它代表已给的所有条件句中未能列出的其他可能的取值,这样可以避免综合器插入不必要的寄存器。

(3)CASE语句中每一条语句的选择只能出现一次,不能有相同选择值的条件语句出现。
如果每一条语句的选择可能出现多次,意味着同1个值会出现不同的语句,也就是经过逻辑综合后,会出现不同的硬件,这与我们VHDL设计,必须保证硬件的唯一性是相违背的。
(4)CASE语句执行中必须选中,且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。

4.应用举例

--用case语句描述4选1多路信号选择器
library ieee;
use ieee.std_logic_1164.all;
entity mux41a is
	port (s1,s2: in std_logic;	--选择控制信号
			a,b,c,d: in std_logic;	--输入信号
			z: out std_logic);	--选择器的输出信号
end entity mux41a;
architecture art of mux41a is
	signal s: std_logic_vector(1 DOWNTO 0);
	begin
	s<=s1&s2;  --合并的目的是为了方便后续的选择控制
	process(s,a,b,c,d) is
		begin
		case s is
			when "00"=>z<=a;
			when "01"=>z<=b;
			when "10"=>z<=c;
			when "11"=>z<=d;
			when others=>z<='X';
		end case;
	end process;
end architecture art;
			

RTL

 

三.LOOP循环语句


 

1.语句功能:

LOOP语句就是循环语句,它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定,循环的方式由NEXT和EXIT语句来控制。

2.语句格式:

3.循环方式:

循环方式由NEXT和EXIT语句控制。EXIT语句格式与NEXT语句的格式和操作功能非常相似,惟一的区别是NEXT语句是跳向LOOP语句的起始点,而EXIT语句则是跳向LOOP语句的终点。

三.其他顺序语句

一.等待语句

1.WAIT语句功能
在进程中(包括过程中),当执行到WAIT等待语句时,运行程序将被挂起(Suspension),直到满足此语句设置的结束挂起条件后,才重新开始执行进程或过程中的程序。但VHDL规定,已列出敏感量的进程中不能使用任何形式的WAIT语句。

2.WAIT语句格式:

3.WAIT应用举例:

4.可综合的WAIT语句

二.返回语句

1.返回语句(RETURN)只能用于子程序体中,并用来结束当前子程序体的执行。
2.语句格式:
RETURN  [表达式];

当表达式缺省时,只能用于过程,它只是结束过程,并不返回任何值;当有表达式时,只能用于函数,并且必须返回一个值。

三.空操作语句

1.空操作语句(NULL)不完成任何操作,它惟一的功能就是使逻辑运行流程跨入下一步语句的执行。
2.NULL常用于CASE语句中,为满足所有可能的条件,利用NULL来表示剩余条件下的操作行为。
3.有的EDA工具对NULL语句的执行会出现擅自加入锁存器的情况,因此,应避免使用NULL语句,改用确定操作。

发布了11 篇原创文章 · 获赞 41 · 访问量 9794

猜你喜欢

转载自blog.csdn.net/weixin_43788952/article/details/105551840