当前位置:文档之家› VHDL硬件描述语言

VHDL硬件描述语言


Posedge 和 negedge 关键字
对于时序电路,事件通常是由时钟边沿触发的,为表 达边沿这个概念,Verilog提供了posedge和negedge关 键字来描述。比如: 【例】同步置数、同步清零的计数器
module count(out,data,load,reset,clk); output[7:0] out; input[7:0] data; input load,clk,reset; reg[7:0] out; always @(posedge clk) //clk上升沿触发 begin if(!reset) out=8'h00; //同步清0,低电平有效 else if(load) out=data; //同步预置 else out=out+1; //计数 end endmodule
b)
有符号数和无符号数在设计中,先按无符号数进行。
4.2.2关系运算符
1. 关系运算符:>、<、>=、<=、==、!= 2. 在关系运算符的使用中,还需要注意以下3个问题
a) 关系操作符的结果为真(1)或假(0)。如果操作数中有一位为x或z,那么 结果x(未知)。 例:23>45 结果为0 52<8‘hxFF 结果为x 如果操作数长度不同,则长度较短的操作数在最重要的位方向(左方)添 0补齐。 例:‘b1000>=‘b01110 等价于 ‘b01000>=‘b01110 在逻辑相等与不等的比较中,只要一个操作数含有x或z,比较结果就为 x。 其结果不定,其值 例:Data=‘b11x0; 为x Addr=‘b11x0; Data==Addr;
举例:initial语句用于为电路仿真生成激励波形
input变量的变化情况
敏感信号表达式“event-expression”
敏感信号表达式又称事件表达式或敏感信号列表,即 当该表达式中变量的值改变时,就会引发块内语句的 执行。因此敏感信号表达式中应列出影响块内取值的 所有信号。若有两个或两个以上信号时,它们之间用 “or”连接。 例如:
1)顺序语句块(begin. . .end):语句块中的语句按给定次 序顺序执行。 2)并行语句块(fork. . .join):语句块中的语句并行执行。
b)
c)
2.4.3逻辑运算符
1. 2. 3. 逻辑运算符有3种:&&(逻辑与)、||(逻辑或)、!(逻辑非) 用法为:表达式1 逻辑运算符 表述式2 逻辑运算的结果为0或1。
例:
Crd=‘b0; Dgs=‘b1;
Crd&&Dgs; 结果为0 Crd||Dgs; 结果为1 !Dgs 结果为0
4. 逻辑与(&&)的直值关系如表2-1所示
5.2.1 initaial过程语句
1. initial语句常用于仿真中的初始化,initial过程块中的 语句仅执行一次。 2. initial语句的格式:
initial begin 语句1; 语句2; …… end
3. Initial语句是面向模拟仿真的过程语句,通常不能被逻 辑综合工具所支持。Initial语句常在仿真开始时对各变 量进行初始化,或生成激励波形作为电路的测试仿真信号。
2.
例如: 4’b1001<<1=4’b0010 4’b1001>>1=4’b0100
2.4.7缩减运算符
1.
2.
a) b)
缩减运算符是单目去处,也有与、或、非运算。
缩减运算的步骤如下:
先将操作数的第1位与第2位进行或、与、非运算; 将第一步的运算结果与第三位进行或、与、非运算,依此类推,直至最 后一位。 例如: reg[3:0] A; reg B; B=&A; 相当于 B=( ( A[0] & A[1] ) & A[2] ) & A[3];
敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式 中变量的值改变时,就会引发块内语句的执行。因此敏感信号表 达式中应列出影响块内取值的所有信号。若有两个或两个以上信 号时,它们之间用“or”连接。 例如: a) @(a) //当信号a的值发生改变 b) @(a or b) //当信号a或信号b的值发生改变 c) @(posedge clock) //当clock 的上升沿到来时 d) @(negedge clock) //当clock 的下降沿到来时 e) @(posedge clk or negedge reset) //当clk的上升沿到来或reset信号的下降沿到来
表达式Marks>18如果为真,则Grade_A赋值为Student;表达 式Marks>18如果为假,则Grade_C赋值为Student;
2.4.6移位运算符
1. 在VHDL中有两种移位运算符: << (左移位运算符) >>(右移位运算符) 使用方法: (a<<n 或 a>>n) a代表要进行移位的操作数,n 代表将移的位数。这两种移位运算都用0来填补移出的空位。
2.4.1 算术运算符
1. 2.
a)
算术运算符:+、-、×、/、% 在算术运算符的使用中,还需要注意以下2个问题
算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结 果的长度由操作符左端目标长度决定。 例: reg[3:0] Arc,Bar,Crt; 其结果长度由Bar,Crt和Arc的长度决定, // Arc,Bar,Crt为4位寄存器 其长度为4位。在这个赋值语句中,加法操 reg[5:0]; // Frx为6位寄存器 作的溢出部分被丢弃。 „„„„ Arc=Bar+Crt; 其结果长度由Frx的长度决定,其长度为 6位。在这个赋值语句中,任何溢出的位 Frx=Bar+Crt; 被存储在结果位Frx[4] 例: wire[4:1] Box,Drt; wire[5:1] Cfg; 表达式右端的操作数最长为6位, wire[6:1] Peg; 但是左端包含在内时,则最大长 wire[8:1] Adt; 度为8。所以所有的加操作使用8 assign Adt=(Box+Cfg)+(Drt+Peg) 位进行。
a) b) c) d) e) @(a) //当信号a的值发生改变 @(a or b) //当信号a或信号b的值发生改变 @(posedge clock) //当clock 的上升沿到来时 @(negedge clock) //当clock 的下降沿到来时 @(posedge clk or negedge reset) //当clk的上升沿到来或reset信号的下降沿到来
注意
在电平敏感列表中最好包括所有的输入。对 于不完整的列表,不同的综合工具处理的方 法不同:有些综合工具认为不完整列表是不 合法的,而另外一些综合工具则发出警告并 将其当作完整列表处理。因此,综合出来的 电路功能可能与程序模块的描述有所不同。
敏感信号
不完整电平敏感列表: module sens(a, q, b, sl); input a, b, sl; output q; reg q; always @(sl) begin if(!sl) q=a; else q=b; end endmodule 完整的电平敏感列表: module sens(q, a, b, sl); input a, b, sl; output q; reg q; always @(sl or a or b) begin if(!sl) q=a; else q=b; end endmodule
2.4.8拼接运算符
1. 拼接运算符:{ } 2. 作用:是将小表达式合并形成大表达式的操作。用这个 运算符可以把两个或多个运算符的某些位拼接在一起进 行算术操作。 形式:{expr1,expr2,„,exprn}
例如:wire[7:0] Dbus; assign Dbus[7:4]={Dbus[0],Dbus[1], Dbus[2], Dbus[3]}; //以反转的顺序将低端4位赋予高端4位 assign Dbus={Dbus[3:0],Dbus[7:4]}; //高4位与低4位交换
3. 由于非定长常数的长度未知,因此不允许连接非定长常 数。
{Dbus,5} //不允许连接操作非定长常数
2.5 过程块
1. 过程块的特点如下:
a) 在行为描述模块中出现的每个过程块(initial块或always块)都代 表一个独立的进程; b) 在进行仿真时,所有initial过程块和always过程块的执行都是从0 时刻开始并行的进行,initial语句只执行一次; c) always语句则是不断地重复活动,直到仿真结束;每一个过程块内 部的多条语句的执行方式可以是顺序执行的(当块定义语句为 begin-end时的情况),也可以是并行执行的(块定义语句为forkjoin时的情况); d) 在一个模块中,使用always过程块和initial过程块的次数是不受限制 的。
敏感信号分类
边沿敏感型 电平敏感型 注意:每一个always过程最好只由一种类型的敏感信 号来触发,而不要将边沿敏感型和电平敏感型信号列 在一起。
敏感信号列表举例
module mux4_1(out,in0,in1,in2,in3,sel); output out; input in0,in1,in2,in3; input[1:0] sel; reg out; always @(in0 or in1 or in2 or in3 or sel) //敏感信号列表 case(sel) 2'b00: out=in0; 2'b01: out=in1; 2'b10: out=in2; 2'b11: out=in3; default: out=2'bx; endcase endmodule
0
1
相关主题