EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【菜鸟FPGA VHDL学习帖】第7帖 基本知识(二) 0 L6 c* E( ]8 c8 X8 e$ D
第一步,我们先来看看原理图
6 q# Y* n+ j# t1 o8 v! h/ X
: U D) F# [$ Y; i3 VLED2 接的是3脚, LED3接的是2脚 LED4接的是1脚
) U3 H. S3 I( y4 m) D+ n# ^( l而软件里对应配置是 dout[7]对应 1脚 LED4 dout[6]对应2脚 LED3 dout[5]对应3脚 LED2 8 [/ L4 `2 _- A5 f
第二步,基本知识(所有例子都在实验板上测试过) (1)。OTHERS省略赋值操作符 短语(OTHERS=> X )是一省略赋值操作符 它可以在较多位的位矢量赋值中作省略化的赋值 (A)。 例子一 begin dout <= (OTHERS => '0' ); end behave; dout <= (OTHERS => '0' ); 这条语句等同于 dout < = "000000000" 但其优点是在给大的位矢量赋值时,简化了表述,明确了含义,这种表述与位矢量长度无关
$ Y( Q* r" m+ e+ I* O(B)。 例子二 begin dout <= (7 => '1', 6=> '1', othERS=> '0'); end behave; 此赋值语句的意义是给位矢量 dout 的第 7 位和第 6位赋值为'1',而其余位赋值为'0' ,dout5为0,即LED2灯亮。
2 i" c. t; F Q$ X+ e# \(2)。移位操作符 VHDL提供了6种预定义的运算操作符,分别是:赋值运算符,逻辑运算符,算术运算符,关系运算符,移位运算符,并置运算符。 赋值运算符:在VHDL中,赋值运算符用来给信号、变量和常数赋值。 逻辑运算符:! [# k0 S$ o* o5 ~2 z# r
在VHDL中,逻辑运算符用来执行逻辑运算操作。操作数必须是BIT,STD_LOGIC或 STD_ULOGIC类型的数据(或者是这些数
7 T6 j4 L8 x) s据类型的扩展,即BIT_VECTOR,STD_LOGIC_VECTOR或STD_ULOGIC_VECTOR)。/ D% G( s# B9 [6 m
VHDL的逻辑运算符有以下几种:NOT--取反AND--与OR--或-NAND--与非
. M( |- Z/ } @2 h0 v) ?-NOR--或非 -XOR--异或 算术运算符: X+ {9 U" T# k2 ]
在VHDL中,算术运算符用来执行算术运算操作。操作数可以是INTEGER,SIGNED,UNSIGNED或REAL数据类型,其中REAL类型是不可综合的。如果声明了ieee库中的包集std_logic_signed和std_logic_unsigned,即可对STD_LOGIC_VECTOR类型的数据进行加法和减法运算。9 O @% G- i' |8 Q
VHDL语言有以下8种算术运算符:+ 加- 减 * 乘 / 除 ** 指数运算MOD 取模REM 取余 ABS 取绝对值
/ A5 h0 d6 e/ g1 `+ B. |上述运算符中,加法、减法和乘法运算符是可以综合成逻辑电路的, 对于除法运算,只有在除数为2的n次幕时才有可能进行综合,此时除法操作对应的是将被除数向右进行n次移位。 对于指数运算,只有当底数和指数都是静态数值(常量或GENERIC参数)时 j' ~6 S+ F2 j6 B9 T: x
才是可综合的。在算术运算符的使用中, 要注意MOD和REM的区别: y MOD x运算的结果是y除以x所得的余数,运算结果通过信号x返回; y REM x运算的结果是y除以x所得的余数,结果通过信号y返回。 ABS运算返回操作数的绝对值。上述后3个运算符 (MOD,REM和ABS)通常是不可综合的。 并置运算符:
! E& ~( }/ z) p& C在VHDL中,提供了一种并置操作符 , 它的符号如下所示 :& -用来进行位和位矢量的连接运算" f' Q" _" U4 V( Q* x3 `( W
所谓位和位矢量的连接运算是指将并置操作符右边的内容接在左边的内容之后以形成一个新的位矢量. 移位运算符:
7 n3 v- Z# w4 @( ?, b6 Q0 [/ d在VHDL中,移位操作符用来对数据进行移位操作,它们是在VHDL93中引入4 x+ q6 ^( q- S
的。其语法结构为:<左操作数><移位操作符><右操作数>( e' }- @0 u- a, N; u
其中,左操作数必须是BIT_VECTOR类型的,右操作数必须是INTEGER类型(前面可以加正负号)的。
4 K3 }: `1 I/ a' }$ VVHDL中的移位操作符有以下几种:4 E0 z: i5 ?# N9 t
sll 逻辑左移------数据左移,右端空出来的位置填充'0'5 C( H4 c3 O( G" d! j& `$ ~
srl 逻辑右移------数据右移,左端空出来的位置填充'0'
' O8 ^* ]6 D# v C! tsla 算术左移-------数据左移,同时复制最右端的位,在数据左移操作后填充在右端空出的位置上2 K7 n8 A/ W2 l( ^
sra 算术右移-------数据右移,同时复制最左端的位,在数据右移操作后填充在左端空出的位置上* a/ i8 G9 A2 t' G+ l
rol 循环逻辑左移-----数据左移,同时从左端移出的位依次填充到右端空出的位置上4 A1 U2 I( S$ X" M* d% d
ror 循环逻辑右移------数据右移,同时从右端移出的位依次填充到左端空出的位置上 例子: VHDL的类型限定过于强,以至于很多时候出问题都是类型错误…… VHDL语言本身的这几个运算符是对bitvector定义的,而我们一般都 std_logic_vector,这样就很导致一般不能编译通过。
7 t9 q2 v5 t6 O. \. i% c0 P- O而更不爽的是ieee.numeric_bit或者numeric_std包中都有重载sll之类,但是很讨厌的是他们都是对signed/unsigned定义,没办法,要是想给std_logic_vector用这几个移位运算符(sll, srl, sla, sra,rol, ror)
/ c0 b- T3 p% w! ]3 w
% ~+ z# v& c4 D0 X$ J0 G! W; Iarchitecturebehave of ledd is signal i: std_logic_vector(7downto 0) := "00100001"; begin dout <= to_stdlogicvector(to_bitvector(i) sll 1); X- ?. H0 Q; k3 j- ] I) g9 J1 f
* \2 m0 W9 I1 Y0 h+ E
|