VHDL主要描述语句――CASE语句
- 格式:ppt
- 大小:152.00 KB
- 文档页数:8
VHDL语言的主要描述语句按照语句的执行顺序对VHDL语言进行分类,包含两类语句:●并行描述语句该语句的执行与书写顺序无关,总是同时被执行●顺序描述语句从仿真的角度,该语句是顺序执行的进程语句(PROCESS)是最典型的并行语句,一个构造体可以有几个进程语句同时存在,而且并发执行。
但是进程部的所有语句都是顺序语句。
一、顺序描述语句顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。
如下分别介绍有关的顺序描述语句.1.WAIT语句进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程.等待语句的格式:*WAIT 无限等待*WAIT ON 敏感信号变化*WAIT UNTIL 条件满足*WAIT FOR 时间到(1)WAIT ON格式:WAIT ON 信号[,信号]例5-1PROCESS(a,b)BEGINy<=a AND b;END PROCESS;该例中的进程与下例中进程相同:例5-1PROCESSBEGINy<=a AND b;WAIT ON a,b;END PROCESS;例5-2PROCESS(a,b)BEGINy<=a AND b;WAIT ON a,b;END PROCESS;(2)WAIT UNTIL 直到条件满足格式: WAIT UNTIL 布尔表达式当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.例: WAIT UNTIL ((x*10)<100)(3)WAIT FOR 等到时间到格式: WAIT FOR 时间表达式当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.例: WAIT FOR 20 ns;WAIT FOR (a*(b+c);(4)多条件WAIT 语句例: WAIT ON nmi,interrupt UNTIL ((nmi=TRUE) OR (interrupt=TRUE)) FOR 5 us 该等待有三个条件:第一,信号nmi和interrupt 任何一个有一次刷新动作第二, 信号nmi和interrupt 任何一个为真第三, 已等待5 us只要一个以上的条件被满足,进程就被启动.*注意:多条件等待时,表达式的值至少应包含一个信号量的值。
VHDL语言的主要描述语句按照语句的执行顺序对VHDL语言进行分类,包含两类语句:并行描述语句该语句的执行与书写顺序无关,总是同时被执行顺序描述语句从仿真的角度,该语句是顺序执行的进程语句(PROCESS)是最典型的并行语句,一个构造体内可以有几个进程语句同时存在,而且并发执行。
但是进程内部的所有语句都是顺序语句。
一、顺序描述语句顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。
如下分别介绍有关的顺序描述语句.1.WAIT语句进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程.等待语句的格式:*WAIT 无限等待*WAIT ON 敏感信号变化*WAIT UNTIL 条件满足*WAIT FOR 时间到(1)WAIT ON格式:WAIT ON 信号[,信号]例5-1PROCESS(a,b)BEGINy<=a AND b;END PROCESS;该例中的进程与下例中进程相同:例5-1PROCESSBEGINy<=a AND b;WAIT ON a,b;END PROCESS;例5-2PROCESS(a,b)BEGINy<=a AND b;WAIT ON a,b;END PROCESS;(2)WAIT UNTIL 直到条件满足格式: WAIT UNTIL 布尔表达式当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.例: WAIT UNTIL ((x*10)<100)(3)WAIT FOR等到时间到格式: WAIT FOR 时间表达式当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.例: WAIT FOR 20 ns;WAIT FOR (a*(b+c);(4)多条件WAIT 语句例: WAIT ON nmi,interrupt UNTIL ((nmi=TRUE) OR (interrupt=TRUE)) FOR 5 us 该等待有三个条件:第一,信号nmi和interrupt 任何一个有一次刷新动作第二, 信号nmi和interrupt 任何一个为真第三, 已等待5 us只要一个以上的条件被满足,进程就被启动.*注意:多条件等待时,表达式的值至少应包含一个信号量的值。
VHDL中 If语句和Case语句的综合If 和case语句是VHDL里边两个非常重要的语句,如何用好她们来描述逻辑电路和时序电路是学会VHDL编程重要的一步。
if 和case语句有一定的相关性,也有一定的区别。
相同的地方是他们可以实现几乎一样的功能。
下面主要介绍一下她们之间的区别。
If 语句每个分支之间是有优先级的,综合得到的电路是类似级联的结构。
Case语句每个分支是平等的,综合得到的电路则是一个多路选择器。
因此,多个if elseif语句综合得到的逻辑电路延时往往比case语句要大。
一些初学者在一开始往往喜欢用if elsif语句,因为这种语法表达起来更加直接,但是在运行速度比较关键的项目中,使用case语句的效果会更好。
下面的例子给出了if语句和case语句的综合结果If 语句综合结果Case语句综合结果有关if, case语句另外一个值得一提的东西是在用if或者case语句做逻辑电路的时候,必须为信号设置默认值。
有两种方法,第一种方法是在if, case 语句之前对目标信号进行赋值,采用这种方法,就不必专门写else或者when others语句对信号进行默认赋值。
第二种方法就是在else或者when others语句中对信号进行默认条件下的赋值。
如果违反了上述规则,那么会在综合电路的时候形成一个transparent latch(锁存器),也就是电平触发的锁存器,这对电路的时序分析等会造成很大的麻烦。
在时序电路中,如果没有在else语句或者when others语句中对信号赋值,那么综合工具会认为寄存器保持当前输入。
从电路图上看,即把寄存器的输出接回寄存器的输入。
有兴趣的朋友可以用综合工具试一下面的代码,鉴于篇幅,时序电路部分的代码就不贴了,有需要的朋友可以给我留言。
library ieee;useuse CaseComb isport(aSel : in std_logic_vector(3 downto 0);aDin : in std_logic_vector(3 downto 0);aDout : out std_logic);end CaseComb;architecture rtl of CaseComb isbeginprocess(aSel, aDin)begincase aSel iswhen "1000" =>aDout <= aDin(3);when "0100" =>aDout <= aDin(2);when "0010" =>aDout <= aDin(1);when "0001" =>aDout <= aDin(0);when others =>--aDout <= '0';end case;end process;end rtl;library ieee;useuse IfComb isport(aSel : in std_logic_vector(3 downto 0);aDin : in std_logic_vector(3 downto 0);aDout : out std_logic);end IfComb;architecture rtl of IfComb isbeginprocess(aSel, aDin)beginif aSel(3)='1' thenaDout <= aDin(3);elsif aSel(2)='1' thenaDout <= aDin(2);elsif aSel(1)='1' thenaDout <= aDin(1);elsif aSel(0)='1' thenaDout <= aDin(0);--else-- aDout <= '0';end if;end process;end rtl;。