3.VHDL的基本结构和语法(二)


目录

1.顺序语句

1.1赋值语句:

1.2 .流程控制语句

IF语句

CASE语句

LOOP语句

NEXT语句

EXIT语句

NULL语句

WAIT语句

2.配置语句


1.顺序语句

顺序语句仅出现在进程和子程序中。顺序语句综合后 , 映射为实际的门电路,系统一上电, 门电路开始工作 。电路可实现逻辑上 的顺序执行,实际上所有门电路是并行工作的。

赋值语句要点:

  • 赋值语句
  • 流程控制语句
  • 空操作语句
  • 等待语句
  • 子程序调用语句
  • 返回语句

1.1赋值语句:

例子:

程序如下所示:

library ieee;
use ieee.std_logic_1164.all;
entity test_signal is
port
(Reset,Clock :in std_logic;
 NumA,NumB   :out integer range 0 to 255);
end test_signal;
architecture test of test_signal is
	signal A,B:integer range 0 to 255;
	begin 
		process(Reset,Clock)
		variable C: integer range 0 to 255;
	begin
		if Reset='1' THEN
			A<=0;B<=2;C:=0;
		elsif rising_edge(Clock) THEN
			C:=C+1;A<=C+1;B<=A+2;
		end if;
		end process;
		NumA<=A;NumB<=B;
end test;

进行仿真测试:


1.2 .流程控制语句

  • IF语句

方式一:

IF 条件式 THEN
     顺序语句
END IF; 

方式二:

IF 条件式  THEN
     顺序语句
ELSE
顺序语句
END IF

方式三:有优先级

IF 条件式 THEN
    顺序语句
ELSEIF 条件式2   THEN
     顺序语句
ELSE
     顺序语句
END IF; 

注意:用 IF 语句描述组合逻辑电路时 , 务必涵盖所有的情况 , 否则综合后将引入锁存器 !

例子1:使用IF语句实现8-3译码器

代码如下:

library ieee;
use ieee.std_logic_1164.all;
entity Encoder8_3 is
port
(En :in std_logic;
 I  :in std_logic_vector(7 downto 0);
 A  :out std_logic_vector(2 downto 0);
 Idel:out std_logic
);
end Encoder8_3;
architecture EncoderBhv of Encoder8_3 is
begin
	process(En,I)
begin
	if En='1' THEN
	   if    I="10000000" THEN
		A<="111";Idel<='0';
	   elsif I="01000000" THEN
	    A<="110";Idel<='0';
	   elsif I="00100000" THEN
	    A<="101";Idel<='0';
	   elsif I="00010000" THEN
	    A<="100";Idel<='0';
	   elsif I="00001000" THEN
	    A<="011";Idel<='0';
	   elsif I="00000100" THEN
	    A<="010";Idel<='0';
	   elsif I="00000010" THEN
	    A<="001";Idel<='0';
	   elsif I="00000001" THEN
	    A<="000";Idel<='0';
	   else
	    A<="000";Idel<='1';
	   end if;
	 end if;
	 end process;
end EncoderBhv;	    	    

解释:En为使能位,只有当使能位为1时,才会根据输入改变输出的值,I是输入的为,宽度为8为,Idel检测状态是否正确,如果输入不正确,Idel位置1.

仿真波形如下:


例子2:不完整条件语句时序电路

程序如下:

library ieee;
use ieee.std_logic_1164.all;
entity comp_bad is
port
(a1 :in bit;
 b1 :in bit;
 q1 :out bit
);
end comp_bad;
architecture oneBhv of comp_bad is
begin
	process(a1,b1)
begin
	if    a1>b1 THEN q1<='1';
	elsif a1<b1 THEN q1<='0';   --这里少了一种情况,a1 = b1
	end if;
	end process;
end oneBhv;

那么综合的结果就会有锁存器:


例子三:完整条件语句

程序如下:

library ieee;
use ieee.std_logic_1164.all;
entity comp_bad is
port
(a1 :in bit;
 b1 :in bit;
 q1 :out bit
);
end comp_bad;
architecture oneBhv of comp_bad is
begin
	process(a1,b1)
begin
	if    a1>b1 THEN q1<='1';
	else  
          q1<='0';   --涵盖所有的情况
	end if;
	end process;
end oneBhv;

综合结果是:


  • CASE语句

语法

CASE  表达式 IS
           WHEN   选择值 [ 选择值 ]=>顺序语句;
           WHEN   选择值 [ 选择值 ]=>顺序语句;
           WHEN OTHERS=>顺序语句;
END CASE;

注意:

1.选择值不可重复或重叠; 

2.当CASE 语句的选择值无法覆盖所有的情况时情况时,要用OTHERS指定未能列出的其他所有情况的输出值。

例子:使用CASE实现4选1四路选择器

代码如下:

library ieee;
use ieee.std_logic_1164.all;
entity mux is
port
(Data0,Data1,Data2,Data3 :in std_logic_vector(7 downto 0);
 Sel :in std_logic_vector(1 downto 0);
 Dout :out std_logic_vector(7 downto 0)
);
end mux;
architecture DataFlow of mux is
begin
	process(Sel)
begin
	case Sel is
		WHEN"00"=>Dout<=Data0;
		WHEN"01"=>Dout<=Data1;
		WHEN"10"=>Dout<=Data2;
		WHEN"11"=>Dout<=Data3;
		WHEN OTHERS=>Dout<="00000000";
	end case;
	end process;	
end DataFlow;

仿真结果如下:


  • LOOP语句

语法:

[LOOP 标号:] FOR 循环变量  IN 循环次数范围 LOOP
                                顺序语句
END LOOP [LOOP 标号];

注意:

1.循环变量是一个临时变量。

2.….TO….….DOWNTO…..从初值开始 , 每执行完一次后递增(递减),  直到终值为止 。

例子1:

Sum:=0;
    FOR i IN 0 TO 9 LOOP
         Sum:=Sum+i;
    END LOOP;

例子2:

VARIABLE Length :Integer RANGE 0 TO 15;

               .

               .
FOR i IN 0 TO Length LOOP

               .

               .
END LOOP;


  • NEXT语句

NEXT语句主要用在LOOP 语句执行中有条件或无条件转向控制, 跳向LOOP语句的起点。

使用方式:

NEXT [循环标号] [WHEN 条件];

NEXT ;                    --无条件终止当前循环 , 跳回到本次循环LOOP语句处 , 开始下一次循环 。
NEXT LOOP 标号; --当有多重LOOP 语句嵌套时 , 跳转到指定标号LOOP 语句处 , 重新开始执行循环操作 。
NEXT LOOP 标号 WHEN 条件表达式; --条件表达式为TRUE, 执行NEXT 语句,进入跳转操作 , 否则向下执行。


  • EXIT语句

EXIT语句主要用在LOOP 语句执行中有条件或无条件内部转向控制, 跳向LOOP 语句的终点,用于退 出循环 。 当程序需要
处理保护 、 出错和警告状态时 ,语句能提供 一个快捷 、 简便的方法 。

使用方法:

EXIT [循环标号] [WHEN 条件];

①  EXIT ; -- 无条件从当前循环中退 出 。
②  EXIT LOOP 标号;  --程序执行退出动作无条件从循环标号所标明的循环中退出 。
③  EXIT LOOP 标号 WHEN 条件表达式; --条件表达式为TRUE,程序从当前循环中退出 


  • NULL语句

NULL为空操作语句,一 般用于CASE中, 表示在某些情况下对输出不作任何改 变 , 隐含锁存信号 。不能用于纯组合逻辑电路。

例子:


  • WAIT语句

在进程或过程中执行到WAIT语句时 ,程序将被挂起 , 并设置好再次执行的条件 。

语法:

WAIT [ON  信号表][UNTIL 条件表达式][FOR  时间表达式];

①  WAIT; --未设置停止挂起的条件 , 表示永远挂 起 。
 WAIT ON  信号表;  --敏感信号等待语句, 敏感信号的变化将结束挂 起 , 再次启动进程。
③  WAIT UNTIL 条表达式;  --条件表达式为中所含的信号发生变化 , 且满足WAIT 语句所设条件 , 则结束挂起 , 再次启 动进程。
④  WAIT FOR  时间表达式;  --超时等待语句, 从执行当前的WAIT语句开始 ,在此时间段 内 ,进程处于挂起状态, 超过 这一时间段后 ,程序自动恢复执行。



2.配置语句

功能:配置主要为顶层设计实体指定结构体 ,或为参与例化的元件实体指定所希望的结构体  ,以层次方式来对元件例化做结构
配置。

方式:

Configuration 配置名 of  实体名  is
                      配 置 说明
End 配置名;

 

 

 

 

 

 

 

 

 

 

 

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于设计和开发数字系统。VHDL编程的基本方法包括以下几个方面。 首先,了解VHDL语言的基本语法和语义。掌握关键字、数据类型、运算符和控制结构基本语法元素,了解信号的声明和赋值、过程的定义和调用等语义规则。 其次,进行模块化设计。将系统划分为若干个模块,每个模块对应一个框图,通过输入输出接口和内部信号进行连接。模块化设计方便测试和维护,提高系统的可重用性。 然后,编写实体描述。使用VHDL语言描述系统中的各个模块,包括输入输出端口、内部信号和子模块的实例化。实体描述还包括各个模块的功能和行为,可以利用逻辑表达式、状态图或状态转换表等方式进行描述。 接着,进行行为描述。使用过程语句、条件语句和循环语句等语法,实现需要的功能和操作。行为描述可以描述模块的数据流、状态转换和控制逻辑等。 最后,进行仿真和综合。使用仿真工具验证系统设计的正确性和功能性,并进行性能分析和优化。综合工具将VHDL代码转换为硬件电路,生成对应的门级网表,进行布线和布局。 总之,VHDL编程的基本方法包括掌握语法和语义、进行模块化设计、编写实体描述、进行行为描述,以及进行仿真和综合。掌握这些基本方法可以帮助设计和开发高性能、可靠的数字系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值