VHDL基本语法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VHDL的层次结构设计 的层次结构设计
层次结构设计是设计较大规模硬件 的重要优点 的必要手段 , 也是 VHDL 的重要优点. .层次结构的设计方法是把一个大的系 层次结构的设计 层次结构的设计方法是把一个大的系 统划分为若干子系统 , 顶层描述各子系 之间的关系 的关系. 统的接口条件和各子系统 之间的关系. 各子系统的具体实现放在低层描述. 各子系统的具体实现放在低层描述. 同样 , 一个子系统也可以划分为若干更 小的子系统 小的子系统 , 一直划分下去 , 直到最基 本的子系统为止. 本的子系统为止.
进程语句的特点: 进程语句的特点: 1.进程的启动由敏感信号表中所标明的 进程的启动由敏感信号表中所标明的 信号来触发. 信号来触发. 2.每个PROCESS语句内部语句顺序执行; 语句内部语句顺序执行; 每个 3.多个PROCESS语句同时并行执行; 语句同时并行执行; 多个
例4: :
D 触发器 触发器: SIGNAL d ,clk,q:STD_LOGIC; PROCESS(clk) BEGIN IF clk'event AND clk='1' THEN q <=d; END IF; END PROCESS;
语句设计的锁存器. 例2 用 IF 语句设计的锁存器. ( 程序片断) 程序片断) SIGNAL d,clk q :STD_LOGIC; ; IF clk = '1' THEN q <= d; END IF;
2.用于二选一控制的 语句 用于二选一控制的IF语句 用于二选一控制的 格式: 格式: IF 条件 THEN 若干顺序执行语句 ELSE 若干顺序执行语句 END IF;
例3 二选一电路
( 程序片断) 程序片断) SIGNAL sel:STD_LOGIC; ; SIGNAL a,b,c: STD_LOGIC_VECTOR(15 DOWNTO 0); IF sel = '0' THEN c <= a; ELSE c <= b; END IF;
3. 用于多选择控制的 if 语旬
2. 变量赋值语旬
格式 : 变量名 := 表达式 ; 由于在电路设计中 , 变量不与某一物理 量一一对应 , 它只起到设计的辅助作用 , 用 于保存中间结果, 于保存中间结果,做数组的下标等 , 因此变 量的赋值没有时间延迟. 量的赋值没有时间延迟.
例:
VARIABLE x,y,z: INTEGER RANGE 0 TO 255; x:=0; y:=132; z:=x;
(5)赋值语句 赋值语句
赋值语句的作用是给信号或者变量 赋值 , 它将赋值符号右边表达式的值 它将赋值符号右边表达式的值 赋给左边的信号或者变量. 赋给左边的信号或者变量. 赋值语句分为信号赋值语句和变量 赋值语句. 赋值语句.
1. 信号赋值语句 信号赋值语句 格式 : 信号名 <= 表达式 ; 由于信号是个真正的物理量 , 它对 应着电子电路的某一条连线 std_logic 或者一组连线 (std_logic_vector ) , 因此它的赋值一定有时间延迟. 因此它的赋值一定有时间延迟.
变量不是真正的物理量 , 因此不能 出现在敏感信号表中. 出现在敏感信号表中. 在 process 语句中只作为输出存在的 信号 ( 出现在信号赋值符 " < =" 的左 边 ) 不能作为敏感信 号. 既出现在信号赋值符 "<=" 的左边 , 又出现在信号赋值符 "<=" 右边的信 号 , 可以出现在敏感信号表中 , 这是因 为这些信号既作为这块电路的输出 , 又 是电路内部的反馈信号. 是电路内部的反馈信号.
例7 2 与非门. 与非门. 参见程序' (参见程序'例7') ) 说明: 说明: 本例中 , 首先将与非门输入信号 a 和 b 并置 , 生成一个 2 位的 std_logic_vector 信号 sel .信号 C 是与非门的输出. 是与非门的输出.第一个 when 中的 "|" 代表或者 , 即 3 个条件中的任何一 语句. 个满足 , 执行 C <='1' 语句.
SIGNAL a,b: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL c: STD_LOGIC_VECTOR(2 DOWNTO 0); a AND ('1' & c); c & a; --结果生成 4 位的 结果生成 std_logic_vector --结果生成 7 位的 结果生成 std_logic_vector
VHDL基本语法 基本语法
(4)常用运算符 常用运算符
1. 逻辑运算符 逻辑运算符有 6 种:NOT ,OR , AND , NAND , NOR 和 XOR .常 用的是前 3 种. 参加逻辑运算的 变量或者信号必须 有相同的数据类型和数据长度. 有相同的数据类型和数据长度.逻辑 运算符适用的数据类型为 std_ logic bit std_logic_vector .
除了 not 运算符的优先级最高外 , 其余逻辑 运算从左到右展开. 运算符的优先级相同 , 运算从左到右展开. 因此要注意加括号 , 如 : (a AND b) OR (e AND f) 不能写成 a AND b OR e AND f
2. 并置运算符 并置运算符 "&" 用于位的连接 , 形成矢 也可连接矢量生成更大的矢量. 量.也可连接矢量生成更大的矢量.
例:
SIGANL a,b,e,f:STD_LOGIC; SIGANL c,d: STD_LOGIC_VECTOR(7 DOWNTO 0); a AND b; a OR b; NOT a --正确 正确 c AND d; c XOR d; NOT C --正确 正确 a AND c; --错误 , 因为数据类型不同 ; 错
(6) IF 语句
IF语句属于描述硬件行为的语句.共有 语句属于描述硬件行为的语句. 语句属于描述硬件行为的语句 三种用法. 三种用法. 1.用于门闩控制的语句. 用于门闩控制的语句. 用于门闩控制的语句 格式: 格式: IF 条件 THEN 若干顺序执行语句 END IF;
触发器. 例1: 用 if 语句设计的 D 触发器. : ( 程序片断) 程序片断)
SIGNAL d,clk,q;
IF clk'event AND cIk = '1' THEN Q q <= d; END IF;
Qd
D
Clk
对于描述触发器来说 , 经常要用到时钟的 上升沿和下降沿 . 下面是描述它们的 4 种 方法 : clock'event AND clock ='1' clock'event AND clock ='0' rising_edge(clock)' falling_edge(clock)' --上升沿 上升沿 --下降沿 下降沿 --上升沿 上升沿 --下降沿 下降沿
例5: : 语句描述 用PROCESS语句描述 位寄存器. 语句描述16 位寄存器. 参见程序' (参见程序'例5') ) 说明: 说明:
Register_16bits 是实体名 ,behave 是结 构体名. 构体名. reset 是异步复位信号 , 当为 '0' 位寄存器复位. 时 , 将 16 位寄存器复位.当时钟 clk 的上 如果写允许信号wen为 升沿到来时 , 如果写允许信号 为 如果wen '1',16 位输入信号 d 送输出 q; 如果 保持不变. 为'0', 输出 q 保持不变.
格式 : IF 条件 1 THEN 若干顺序执行语句 1 ELSIF 条件 2 THEN 若干顺序执行语句 2 … ELSIF 条件 n-1 THEN 若干顺序执行语句 n-1 ELSE 若干顺序执行语句 n END IF;
(5) 进源自文库语句 进程语句(PROCESS)
进程语句是一个十分重要的语句 进程语句是一个十分重要的语句 , 本质上它描述了一个功能独立的电路 本质上它描述了一个功能独立的电路 块.
关系运算有如下规则 : (1) 在进行关系运算时 , 两个对象的数 据类型必须相同. 据类型必须相同. (2) 等于,不等于运算适用于所有数据 等于, 类型. 类型. (3) 大于,小于,大于等于和小于等于 大于,小于, 适用于整数,实数, 适用于整数,实数,位,位矢量的比 较.
4. 运算符的优先级 各运算符优先级从最高到最低的顺序 ( 同一行运算符优先级相同 ) 如下 : ** ( 乘方 );abs( 取绝对值 ); ; ; * ( 乘 )/( 除 );mod( 取模 ); ; ; +( 正号 ); - ( 负号 ); ; ; +( 加 );- ( 减 );&( 并置 ); ; ; ; sll( 逻辑左移 ); srl( 逻辑右移 ); ; ; rol( 逻辑循环左移 ) ; 逻辑循环左 ror( 逻辑循环右移 ); ;
3. 算术运算符 算术运算符有 14 种 ,最常用的算术 最常用的算术 运算符是 + 和 -. . 例:
SIGNAL a,b: STD_LOGIC_VECTOR(3 DOWNTO 0); a+b; a+'1';
a+"01";
关系运算符关系运算符有下列几种 : =等于 等于; /=不等于 ; <小于; 等于 不等于 小 >大于 <=小于等于; 大于; 小于等于; 大于 小于等于 >=大于等于; 大于等于; 大于等于 关系运算的结果为 " 真 " 或者 "假".
CASE语句与 语句一样也是个顺序执 语句与IF语句一样也是个顺序执 语句与 行语句,但使用上有区别. 行语句,但使用上有区别. CASE语句执行时是无序的,所有表达 语句执行时是无序的, 语句执行时是无序的 式是并行处理; 语句是有序的, 式是并行处理;而IF语句是有序的, 语句是有序的 先处理最优先的条件, 先处理最优先的条件,后处理次优先 条件. 条件. 在某种情况下,两种语句都可以使用, 在某种情况下,两种语句都可以使用, 语句比IF语句描述更简捷 但 CASE语句比 语句描述更简捷, 语句比 语句描述更简捷, 更清晰.故应优先选用CASE语句. 语句. 更清晰.故应优先选用 语句
举例 : SIGNAL t1,clk,clk1:STD_LOGIC; ; SIGNAL r0,r1: STD_LOGIC_VECTOR(15 DOWNTO 0); t1 <= '1'; clk1 <= NOT clk; r0 <= x" 0000"; rl <="0000000000000000";
例6 运算器设计 参见程序例6) (参见程序例 ) 说明: 说明: 一个有加, 一个有加,减,与,或功能的 16 位运 算器. 算器.其中 ,cin 是原来的进位 ,cout 是运 算后的 三位值 ,q 是运算的结果 ,a 和 b 是 2 个操作数 ,sel 是个 2 位的运算选择码. 位的运算选择码. 本例中result是个 位的 是个17位的 本例中 是个 STD_LOGIC_VECTOR信号,它是为了产 信号, 信号 生进位信号而设置的. 生进位信号而设置的.
Q15
Q0
………………………..
Reset Clock
16位寄存器
Wen
………………………..
D15 D0
(6) CASE语句 语句
CASE语句常用来描述总线的行为,编 语句常用来描述总线的行为, 语句常用来描述总线的行为 码器和译码器的结构以及状态机等. 码器和译码器的结构以及状态机等.
格式: 格式: CASE 条件表达式 IS WHEN 条件表达式值 => 条件表达式值1 若干顺序执行语句 … WHEN 条件表达式值 => 条件表达式值n 若干顺序执行语句 WHEN OTHERS => 若干顺序执行语句 END CASE;
process 语句有许多变种 , 这里只介绍 最基本的形式.
格式 : [ 进程名 :] PROCESS ( 敏感信号 1, 敏感信 号 2, … , 敏感信号 n) [ 若干变量说明语句 ] BEGIN 若干顺序执行语句 END PROCESS [ 进程名 ];
process 语句中有个敏感信号表 , 各敏感信号之间用逗号分开. 各敏感信号之间用逗号分开. 所谓敏感信号就是指当它的状态发 语句执行. 生变化时 , 启动 process 语句执行. 由于 process 语句代表一块功能独立 的电路 , 它的某些输入信号的状态 变 化 , 势必引起电路输出的变化 , 这些立 即引起 ( 当然要经过短暂的时间延迟 ) 输出信号状态 变化的信号就是敏感信 号.
相关文档
最新文档