fpgakj4.ppt

上传人:本田雅阁 文档编号:2892102 上传时间:2019-06-02 格式:PPT 页数:64 大小:274.52KB
返回 下载 相关 举报
fpgakj4.ppt_第1页
第1页 / 共64页
fpgakj4.ppt_第2页
第2页 / 共64页
fpgakj4.ppt_第3页
第3页 / 共64页
fpgakj4.ppt_第4页
第4页 / 共64页
fpgakj4.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《fpgakj4.ppt》由会员分享,可在线阅读,更多相关《fpgakj4.ppt(64页珍藏版)》请在三一文库上搜索。

1、VHDL语言的数据类型,在VHDL语言中信号、变量、常数都要指定数据类型,为此,VHDL语言提供了多种标准的数据类型。另外,为使用户设计方便,还可以由用户自定义数据类型。,VHDL语言的数据类型的定义相当严格,不同类型之间的数据不能直接代入,而且,即使数据类型相同,而位长不同时也不能直接代入。,标准的数据类型,整数(Integer),整数与数学中的定义相同。在VHDL中,整数的表示范围为-2 147 483 647 2 147 483 647,既-(231-1) (231-1) 。 注意千万不要把一个实数赋予一个整数变量,因为VHDL是一个强类型语言。 对整数不能用逻辑操作符,当需要进行位操作

2、时,可以用转换函数,将整数转转成位矢量。,实数(Real),在进行算法研究或者实验时,做为对硬件的抽象手段,常常采用实数四则运算,实数的定义值范围为-1.0e+38 +1.0e+38 ,实数有正有负,书写时要有小数点,例如: -1.0,+2.5,-1.0e38,注意实数类型不能综合,位(Bit),在数字系统中,信号值通常用一个位来表示。位值的表示方法是,用字符0或者1表示。,位矢量(bit_vector),位矢量是用双引号括起来的一组位数据,例如:“001100” X”00BB” 在这里,位矢量最前面的X表示十六进制,用位矢量数据表示总线状态最形象也最方便。,布尔量(boolean),一个布尔

3、量具有两种状态,“真(ture)”或者“假(false)”。虽然布尔量也是二值枚举量,但它和位不同,没有数值的含义,也不能进行算术运算。,字符character,字符也是一种数据类型,所定义的字符量通常用单引号括起来,如A。一般情况下VHDL对大小写不敏感,但是对字符量中的大、小写字符则认为是不一样的。例如,B不同于b。 字符量中的字符可以是a-z中的任一个字母,0-9中的任一个数以及空白或者特殊字符,如$,%等等。,字符串(string),字符串是由双引号括起来的一个字符序列,它也称字符矢量或字符串数组。例如:“integer range”。字符串常用于程序的提示和说明。,时间(time),

4、时间是一个物理量数据。完整的时间量数据应包含整数和单位部分,而且整数和单位之间至少应留一个空格的位置。例如,55 sec, 2 min等。在包集合STNADARD中给出了时间的预定义,其单位为fs,ps,ns,us,ms,sec,min,hr。,错误等级(severity level),错误等级类型数据用来表征系统的状态,它共有4种:NOTE,WARNING,ERROR,FAILURE。在系统仿真过程中可以用这4种状态来提示系统当前的工作情况。这样可以使操作人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。,大于等于零的整数(natural),正整数(positive),这两

5、类数据是整数的子类,natural类型只能取值0和0以上的正整数;而positive则只能为正整数。,用户定义的数据类型,枚举(enumerated)类型 整数(integer)类型 数据(real)类型、浮点数(floating)类型 数组(array)类型 存取(access)类型 文件(file)类型 记录(recode)类型 时间time类型(物理类型),IEEE标准STD_LOGIC, STD_LOGIC_VECTOR,在VHDL的标准数据类型“BIT”,它是一个逻辑的数据类型。这个类型取值只能是“0”和“1”,由于该类型数据不存在不定状态X,故不便于仿真。另外,由于它不存在高阻状态

6、,因此也很难用它来描述双向数据总线。,为此,IEEE在1993年制定出了新的标准,使得STD_LOGIC数据类型有9种不同的值: U初始值;X不定态;00;11;Z 高阻; W 弱信号不定;L 弱信号0;H 弱信号1; - 不可能情况;,数据类型转换,实例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY add5 IS PORT(num: IN STD_LOGIC_VECTOR(2 DOWNTO 0); . ); END add5; ARCHITECTURE rtl OF ad

7、d5 IS SIGNAL in_num: INTEGER RANGE 0 TO 5; . BEGIN in_num=CON_INTEGER(num); . END rtl;,VHDL语言的运算操作符,VHDL语言的运算操作符(续),逻辑运算符,AND 逻辑与 OR 逻辑或 NAND 逻辑与非 NOR 逻辑或非 XOR 逻辑异或,这六种逻辑运算符可以对“STD_LOGIC”和“BIT”数据类型、STD_LOGIC_VECTOR逻辑型数组及布尔型数据进行逻辑运算。,注意:运算符的左边和右边,以及代入的信号的数据类型必须是相同的。,逻辑运算符(续),注意:当一个语句存在两个以上的逻辑表达式时,在c语

8、言中有自左到右的优先级顺序的规定,而在VHDL语言中,左右没有优先级差别。,X=(a AND b) OR c; X=a AND b OR c;,X,逻辑运算符(续),也有例外的情况,如果一个逻辑表达式中只有“AND”,”OR”,”XOR”运算符,那么改变运算顺序将不会导致逻辑的改变。此时,括号是可以省略的。,a=b AND c AND d AND e; a=b OR c OR d OR e; a=b XOR c XOR d XOR e; a=(b NAND c) NAND d) NAND e; (必须要括号) a=(b AND c) OR (d AND e); (必须要括号),算术运算符,+

9、加 - 减 * 乘 / 除 + 正 - 负 MOD 求模 REM 取余 * 指数 ABS 取绝对值,在数据位较长的情况下,使用“*”运算符时,应特别慎重。因为对于16位的乘法运算,综合后的逻辑门电路会超过2000个门。,若对STD_LOGICC_VECTOR进行“+”、“-”运算时,两边的操作数和代入的变量位长如不同,则会产生语法错误。,关系运算符,= 等于 /= 不等于 大于 = 大于等于,ab THEN ,注意:在关系运算符中小于等于符“=”和代入符“=”是相同的。,并置运算符,1 并置运算符可用于位的连接,形成位矢量。,2 并置运算符可用两位矢量的连接构成更大的位矢量。 例:DATA_C

10、 = D0 -构成一个8位矢量,3若对STD_LOGICC_VECTOR进行“+”、“-”运算时,通过并置“0”或“1”实现两边操作长度相同。,控制语句(Control Statements) If语句、 Case语句、 Wait语句 循环语句(Looping Statements) Loop语句、 Next语句、 Exit语句 断言语句(Assertion Statement) 空语句 (Null Statement),VHDL 的顺序描述语句,Wait 语句能把一个顺序执行的进程或子程序挂起或恢复执行。 Wait 的书写格式: wait -无限等待 wait on -敏感信号量变化 wai

11、t until - 表达式成立时进程启动 wait for - 时间到,进程启动,Wait语句,wait on 信号1名称,信号2名称; 例 process begin wait on c; a= b; end process; 例 process begin IF (reset=1) THEN q = 0; ELSEIF clockevent AND clock =1 THEN q = d; ENDIF; wait on reset ,clock; end process;,Wait on 语句,注:wait on 语法不能被综合成电路。 wait on 语句常用于写仿真平台中: proce

12、ss begin wait on reset out1 = not out1 after 5 ns; end process; 当PROCESS 语句已有敏感变量列表,则在进程中将不能再使用WAIT ON 语句。 wait on a,b;与process(a,b)等效,书P150,Wait until语句后面跟的是布尔表达式,当进程执行到该语句时将被挂起,直到表达式返回一个“真”值,进程才被再次启动。 Wait until的书写格式 wait until (条件表达式) 例: process begin wait until a b; o = c; end process;,Wait unti

13、l语句,Wait for 的书写格式 wait for 时间数量 时间单位; 例 process begin wait for 20 ns; a = b; end process;,Wait for语句,例 :产生一个20 ns 为周期的时钟波形。 entity model is port(clkout : out std_logic); end model; architecture a_clk of model is signal clk_int : std_logic := 0; begin process begin wait for 10 ns; clk_int = not clk_

14、int; end process; clk_out = clk_int; end a_clk;,例 生成的时钟周期可多样化 architecture a_clk of model is signal clk_int : std_logic := 0; begin process begin wait for 10 ns; clk_int = not clk_int; wait for 15 ns; clk_int = not clk_int; end process; clk_out = clk_int; end a_clk;,在编写testbench 中使用 BEGIN - - a = 0;

15、 b = 0; c = 0; selx = 0; sely = 0; - - WAIT FOR 50 ns; - Time=50 ns - - WAIT FOR 50 ns; - Time=100 ns a = 1; - - WAIT FOR 50 ns; - Time=150 ns - - WAIT FOR 50 ns; - Time=200 ns a = 0; sely = 1; ,用于在程序仿真,调用过程中出现问题时,给出一个文字串提示信息。 一般提示信息分为4类:失败(failure)、错误(error)、警告(warning)和注意(note)。 断言语句的格式: assert 布尔

16、表达式 report “ 报告的信息” severity (出错的等级); 该语句检查表达式的值为真还是假 如果为真,不做任何操作,如果为假,将输出用户规定的字符串到标准输出终端。,断言语句(assert),例:assert (sendb= 1) report “sendb time out at 1” severity error; 如果sendb =0 ,则在相应的输出终端可以看到: error : sendb time out at 1,Entity test IS generic(setup_time: time := 5ns); port(D:in std_logic; Q:out

17、std_logic; clk : in std_logic); begin process(clk) begin if clk=1 and clkevent then assert(Dlast_event setup_time) report “ setup violation” severity error; end if ; end test;,IF语句是根据所指定的条件来确定执行哪些语句。 IF语句有三种类型 门闩控制型 二选一型 多选择控制型,IF语句,IF 条件 THEN 顺序处理语句; END IF;,门闩控制型,门闩控制型实例,例:设计D 触发器 entity dff is po

18、rt (clk,d: in std_logic; q: out std_logic); end dff; architecture text_dff of dff is begin process(clk) if (clkevent and clk =1) then q= d; end if ; end process; end text_dff;,IF 条件 THEN 语句一; ELSE 语句二; END IF;,二选择控制型,二选择控制实例,例process(a,b,sel) begin if (sel= 1) then c= a; else c= b; end if ; end proc

19、ess;,多选择控制的IF 语句书写格式 IF 条件 THEN 语句1; ELSIF 条件2 THEN 语句2; . . ELSIF 条件n THEN 语句n; ELSE 语句n+1; END IF;,多选择控制型,例,用IF 语句实现优先编码器 真值表如下:,多选择控制实例,ENTITY priority_encoder IS PORT( d : IN STD_LOGIC_VECTOR(7 DOWNTO 0; q: OUT STD_LOGIC_VECTOR(2 DOWNTO 0); END priority_encoder; ARCHITECTURE example of priority_

20、encoder IS BEGIN PROCESS(d) begin IF (d(0) 0)THEN q = “111”; ELSIF (d(1)=0) THEN q = “110”; ELSIF(d(2)=0) THEN q=“101”; ELSIF(d(6)=0) THEN q= “001”; ELSE q = “000”; END IF; END PROCESS;,IF语句的条件式是布尔量,所以IF 语句的条件表达式只能用关系运算符(=,/=,=)及逻辑运算符的组合表达式。,小结,IF语句可用于选择器、比较器、编码器和译码器等凡是可以进行条件控制的逻辑电路的设计,是VHDL的最基础、最常用

21、的语句。,IF 语句有优先级。,case (判断信号) is when 信号值1 顺序处理语句1; when 信号值2 顺序处理语句2; when others =顺序处理语句n; end case;,Case 语句,信号值有3种不同的表达式 when 值 语句; when 值|值|值|值 语句; when 值 TO 值= 语句;,Case 语句实例(优先编码器),ARCHITECTURE example of priority_encoder IS BEGIN PROCESS(d) begin CASE d IS WHEN “XXXXXXX0”=q q q q q q= “ZZZ” END

22、CASE; END PROCESS; END example;,X,注意:CASE语句无法表述优先编码器,Case 语句实例(3-8译码器),3-8译码器真值表,Libray ieee; Use ieee.std_logic_1164.all; Entity decoder_3to8 is Port (a:in std_logic_vector(2 downto 0); g1,g2a,g2b:in std_logic; Q:out std_logic_vector(7 downto 0) ); End decoder_3to8 ;,3-8译码器VHDL程序,Architecture decod

23、er_3to8 of decoder_3to8 is Begin Process(a,g1,g2a,g2b) Begin If g1=1 and g2a=0 and g2b=0 then Case a is When “000”=qqqq=“ZZZZZZZZ”; End case; Else Q=“ZZZZZZZZ”; End if; End process; End decoder_3to8,选择器的行为描述既可以用IF语句,也可以用CASE 语句。,小结,CASE语句无优先级,所有的表达式都并行处理。所以传输延迟小。,CASE 语句中的条件表达式的值必须举穷尽,但又不能重复。,不能穷尽的条

24、件表达式的值用OTHERS表示。,CASE 语句常用来描述总线行为、编码器和译码器的结构,可读性好,简洁。,通常在CASE语句中,WHEN语句可以颠倒次序而不至于发生错误,而在IF语句中,颠倒条件判断的次序往往会使综合后的逻辑功能发生变化,当需要重复操作时或实现的模块需要很强的迭代能力时,用循环语句。 LOOP 语句有两种循环形式: 1 . FOR .LOOP END LOOP; 2. WHILE . LOOP END LOOP; LOOP 语句可以嵌套 如:for i in 0 to 7 loop for j in 0 to 7 loop memroom (i)(j) =0; end loo

25、p ; end loop;,LOOP语句,FOR 循环构成的LOOP 语句。 书写格式: 标号: FOR 循环变量 IN 离散范围 LOOP END LOOP 标号; 注 :1 循环变量的值在每次循环中都会发生变化。 2 离散范围表示循环变量在循环中的取值范围。,例:LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY parity_check IS PORT (a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y:OUT STD_LOGIC); END parity_check; ARCHITECTURE rtl OF par

26、ity_check IS BEGIN PROCESS(a) VARIABLE tmp : STD_LOGIC; BEGIN tmp := 0; FOR I IN 0 TO 7 LOOP tmp := tmp XOR a(i); END LOOP; y = tmp; END PROCESS; END rtl;,While 条件下的LOOP 语句格式: 标号: while 条件 LOOP end loop 标号; 当条件为真,执行顺序处理语句,条件为假结束循环。,While 条件下的LOOP 语句,library ieee; use ieee.std_logic_1164.all; entity

27、parity_check is port( a : in std_logic_vector( 7 downto 0); y : out std_logic); end parity_check; architecture example of parity_check is begin process(a) variable tmp :std_logic; begin tmp := 0; i := 0; while (i8) loop tmp := tmp xor a(i); i := i+1; end loop; y = tmp; end process; end example;,在LOO

28、P语句中,用来跳出本次循环。 Next 语句格式: NEXT 标号 while条件; 注:1 . NEXT 语句结束本次循环迭代,进入下一次循环迭代。 2 . 标号表明下一次迭代的起始位置。 3 . when 条件 是NEXT语句的执行条件。 4 . 如NEXT语句后不跟标号,即从LOOP语句的起始位置进入下一个循环。 5 . 如NEXT语句不跟条件语句,则无条件跳出循环。 6 . NEXT主要用于LOOP 语句的内部循环控制。,Next 语句,例: while data 1 loop data := data2; next when data =3; - 条件成立跳出循环 data_t =

29、data_t * data; end loop; N1: for i in 10 downto 1 loop N2: for j in 0 to i loop next N1 when i =j; -条件成立,跳到N1处 matrix(i,j) := i*j+1; -条件不成立,继续内 层循环N2的执行 end loop N2; end loop N1;,当程序执行时遇到EXIT命令时,LOOP 循环就会立即结束。 EXIT语句格式: EXIT 标号 when 条件;,Exit 语句,EXIT 语句3种书写格式,EXIT语句没有“循环标号”或“when”条件。当条件为“真”执行EXIT语句时,

30、程序将按如下顺序执行:执行EXIT,程序将仅仅从当前所属的LOOP语句退出。如果EXIT语句位于一个内循环LOOP语句中,即该LOOP语句嵌在任何其他的一个LOOP语句中。那么执行exit,程序仅仅退出内循环,而仍然留在外循环的loop语句中。,EXIT语句后跟loop标号。此时,执行EXIT语句时,程序将跳至所说明的标号。,EXIT语句后跟”when”条件语句。当程序执行到该语句时,只有所说明的条件为“真”的情况下,才跳出循环的loop语句。,EXIT语句是一条很有用的控制语句。当程序需要处理保护、出错和警告状态时,它能提供一个快捷、简便的方法。,Process(a) Variable in

31、t_a:=integer; Begin Int_a:=a; For i in 0 to max_limit loop If int_a=0 then Exit; Else Int_a:=int_a-1; Q(i)=3.1416/real(a*i); End if ; End loop; Y=q; End process;,实例,例:当LOOP 的嵌套中,有exit指令时 loop_a: for i in 0 to 9 loop loop_b : for j in 0 to 9 loop if data(i,j) = 0 then exit loop_b; elseif data(i,j) 0

32、then exit loop_a; end if ; end loop loop_b; end loop loop_a;,NULL 语句类似于汇编的NOP语句,执行NULL只是使程序走到下一个语句。 NULL的格式是: NULL; 例: function is_x(s : std_logic_vector) return boolean is begin for i in s rang loop case s(i) is when u| x| z | w = return true; when others = null; end case; return false; end;,NULL语句,总结,上述语句有一个共同的特点是:,所有语句都是顺序执行的,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1