版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
三、
VerilogHDL硬件描述语言大规模可编程器件技术课程安排一、可编程逻辑器件基础二、数字系统设计方法三、VerilogHDL硬件描述语言四、开发软件介绍五、应用实验六、考核方式三、VerilogHDL硬件描述语言1.VerilogHDL概述2.VerilogHDL建模概述3.VerilogHDL基本语法4.VerilogHDL的顺序执行与并发执行5.条件语句使用要点6.设计的可综合性7.基本电路的verilog描述-组合电路1.VerilogHDL概述1.1什么是VerilogHDL?Verilog
HDL(VerilogHardwareDiscriptionLanguage)一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。可以对硬件的并发执行过程进行建模1.VerilogHDL概述1.2Verilog的历史1983年由GatewayDesignAutomation公司(后被Cadence收购)首创1990年,Cadence公司成立OVI(Open
VerilogInternational)组织来推广VerilogHDL1995年,IEEE制定了VerilogHDL标准,即IEEEStd1364–1995(Verilog-1995)2001年,IEEE1364-2001(Verilog-2001)获得通过1.VerilogHDL概述1.3Verilog与VHDL均为硬件描述语言,应用都很普遍VHDL由美国国防部高级研究计划署开发两者的区别:VHDL侧重于系统级描述,从而更多的为系统级设计人员所采用Verilog侧重于电路级描述,从而更多的为电路级设计人员所采用1.VerilogHDL概述1.4VerilogHDL与C语言C语言:计算机程序设计语言,顺序执行VerilogHDL:语法与C语言接近,硬件描述语言,对硬件的并发执行过程进行建模利用VerilogHDL编程时,要时刻记得VerilogHDL是硬件语言,要将VerilogHDL与硬件电路对应起来1.VerilogHDL概述1.5四种抽象层次行为或算法级:Verilog所支持的最高抽象层次。设计者只注重其实现的算法,不用关心其具体的硬件实现细节。与C语言编程类似。数据流级:通过描述数据流在寄存器间如何传输以及如何处理这些数据来对设计进行建模。门级:从组成电路的逻辑门及其相互之间的互连关系的角度来设计模块。类似于使用门级逻辑简图来完成设计。开关级:Verilog所支持的最低抽象层。通过使用开关、存储节点及其互连关系来设计模块。术语RTL级(寄存器传输级):通常指能够被逻辑综合工具接受的行为级和数据流级的混合描述在一个模块中可以混合使用多个抽象层次2.VerilogHDL建模概述数字电路=线+器件线:器件管教之间的物理连接器件:组合逻辑(如与或非门等)和时序逻辑器件(如寄存器、锁存器、RAM等)VerilogHDL建模:使用HDL语言对数字电路的两种基本要素的特性及相互之间的关系进行描述。2.1建模2.VerilogHDL建模概述是Verilog的基本描述单元,用于描述某个设计的功能或结构及其与其他模块通信的外部端口概念上可等同一个器件,如通用器件(与门、三态门等)或通用宏单元(计数器、ALU、CPU)等。模块可被另一个模块调用一个电路设计可由多个模块组合而成。2.2模块(module)2.VerilogHDL建模概述例1.加法器2.2模块(module)简单实例module
adder
(a,
b,
cin,
cout,
sum);
input
[2:0]
a;
input
[2:0]
b;
input
cin;
output
cout;
output
[2:0]
sum;
assign
{cout,sum}
=
a
+b
+
cin;endmodule2.VerilogHDL建模概述例2.比较器2.2模块(module)简单实例module
compare
(equal,a,b);
input
[1:0]
a,b;
//declaretheinputsignal;
output
equal
;
//declaretheoutputsignal;
assign
equal
=
(a
==
b)
?
1:0
;
/*ifa=b,output1,otherwise0;*/endmodule2.VerilogHDL建模概述例3.三态门驱动器2.2模块(module)简单实例module
mytri
(din,
d_en,
d_out);
input
din;
input
d_en;
output
d_out;
//--Enteryourstatementshere--//
assign
d_out
=
d_en
?
din
:'bz;endmodulemodule
trist
(din,
d_en,
d_out);
input
din;
input
d_en;
output
d_out;
//--statementshere--//
mytri
u_mytri(din,d_en,d_out);endmodule2.VerilogHDL建模概述模块内容位于module和endmodule两个语句之间模块包括接口描述部分和逻辑功能描述部分。可与实际器件相类比每个模块要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述(测试模块例外)书写格式自由,一行可以写几个语句,一个语句可以分几行写。除endmodule与局外,每个语句后面需要有分号表示该语句结束2.3模块的结构2.VerilogHDL建模概述2.4模块语法module
module_name
(port1,port2,
......)
;//Declarations:input,
output,
inout,reg,
wire,
parameter,function,
task,
.
.
.//Statements:Initial
statementAlways
statementModule
instantiationGate
instantiationContinuous
assignmentendmodule2.VerilogHDL建模概述一个模块用一个文件模块名与文件名要同名一行一句语句信号方向按输入、输出、双向顺序描述尽量采用参数化,提高设计的重用2.5书写语法建议2.VerilogHDL建模概述信号在电路中传输会有传播延时,如线延时、器件延时等时延就是对延时特性的HDL描述所有时延都必须根据时间单位进行定义,定义方式为在文件头添加如下语句:是VerilogHDL提供的预编译处理命令,1ns表示时间单位是1ns,100ps表示时间精度是100ps。2.6时延2.VerilogHDL建模概述表示B信号在2个时间单位后得到A信号的值。2.6时延时延举例assign
#2
B
=
A;2.VerilogHDL建模概述结构化描述方式数据流描述方式行为描述方式2.7三种建模方式2.VerilogHDL建模概述通过对电路结构的描述来建模,即通过对器件的调用(HDL概念称为“例化”),并使用线来连接各器件的描述方式器件包括:Verilog的内置门(如与门and,异或门xor等),也可以是用户的一个设计反映了一个设计的层次结构2.7三种建模方式结构化描述方式2.VerilogHDL建模概述2.7三种建模方式结构化描述方式例1:一位全加器module
FA_struct
(A,B,Cin,Sum,Cout);
input
A;
input
B;
input
Cin;
output
Sum;
output
Cout;
wire
S1,
T1,
T2;
//--statements--//
xor
X1
(S1,
A,
B);
xor
X2
(Sum,
S1,
Cin);
and
A1
(T1,
S1,
Cin);
and
A2
(T2,A,
B);
or
O1
(Cout,
T1,
T2);endmodule2.VerilogHDL建模概述1.两个异或门、两个与门、一个或门2.S1、T1、T2是门与门之间的连线3.纯结构的建模方式4.Xor、and、or为Verilog内置的门器件xor表明调用一个内置的异或门,器件名称xor,代码实例化名X1;括号内的S1,A,B表明该器件管脚的实际连接线的名称,其中A、B是输入,S1是输出。其他相同一位全加器代码2.VerilogHDL建模概述结构化描述方式例2:两位全加器两位全加器结构示意框图module
Four_bit_FA
(FA,
FB,
FCin,
FSum,
FCout
)
;
parameter
SIZE
=
2;
input
[SIZE:1]
FA;
input
[SIZE:1]
FB;
input
FCin;
output
[SIZE:1]
FSum;
output
FCout;
wire
FTemp;
FA_struct
FA1(
.A
(FA[1]),
.B
(FB[1]),
.Cin
(FCin)
,
.Sum
(FSum[1]),
.Cout
(Ftemp)
);
2.VerilogHDL建模概述两位全加器代码注意:.A(FA[1])的含义
FA_struct
FA2(
.A
(FA[2]),
.B
(FB[2]),
.Cin
(FTemp)
,
.Sum
(FSum[2]),
.Cout
(FCout
)
);
endmodule通过对数据流在设计中的具体行为的描述来建模使用连续赋值语句。借助于Verilog提供的一些运算符,如按位逻辑运算,逻辑与(&),逻辑或(|)等assign
#delay
net_name
=
expression;如:assign
#2
A
=
B;2.VerilogHDL建模概述2.7三种建模方式数据流描述方式2.VerilogHDL建模概述2.7三种建模方式数据流描述方式例1:一位全加器`timescale
1ns/100ps
module
FA_flow(A,B,Cin,Sum,Cout)
input
A,B,Cin;
output
Sum,
Cout;
wire
S1,T1,T2;
assign
#
2
S1
=
A
^
B;
assign
#
2
Sum
=
S1
^
Cin;
assign
#
2
T1
=
S1
&
Cin;
assign
#
2
T2
=
A
&
B
;
assign
#
2
Cout
=
T1
|
T2;
endmodule2.VerilogHDL建模概述一位全加器代码注意:各assign语句之间是并行执行的,即各语句的执行与语句之间的顺序无关。如上,当A有变化时,S1、T2将同时变化,S1的变化又会造成Sum和T1的同时变化。2.VerilogHDL建模概述采用对信号行为级的描述(不是结构级的描述)的方法来建模一般采用initial块语句或always块语句通常采用行为级的运算符如加法(+),减法(-)运算符等2.7三种建模方式行为描述方式module
FA_behav1(A,
B,
Cin,
Sum,
Cout
);
input
A,B,Cin;
output
Sum,Cout;
reg
Sum,
Cout;
reg
T1,T2;
always@
(
A
or
B
or
Cin
)
begin
Sum
=
(A
^
B)
^
Cin
;
T1
=
(A
^
B)
&
Cin;
T2
=
A
&
B
;
Cout
=
T1|
T2;
end
endmodule2.VerilogHDL建模概述行为描述方式例1:一位全加器行为建模注意:只有寄存器类型的信号才可以在always和initial语句中进行赋值,类型定义通过reg语句实现always语句一直重复执行,由敏感表中的变量触发在begin和end之间的语句顺序执行,属于串行语句module
FA_behav2(A,
B,
Cin,
Sum,
Cout
);
input
A,B,Cin;
output
Sum,Cout;
reg
Sum,
Cout;
always@
(
A
or
B
or
Cin
)
begin
{Cout
,Sum}
=
A
+
B
+
Cin
;
end
endmodule2.VerilogHDL建模概述行为描述方式例2:一位全加器行为建模采用更高级(更趋于行为级)的描述方式,即直接采用“+”来描述加法{Cout,Sun}表述将两个信号拼接成一个宽度更长的信号。2.VerilogHDL建模概述实际设计中往往是多种设计模式的混合。一般,对顶层设计采用结构描述方式;对底层模块,可采用数据流、行为级或两者的结合如上面的两位全加器,对顶层模块(Four_bit_FA)采用结构描述方式进行“例化”,对底层模块(FA)可采用结构描述、数据流描述或行为描述。2.7三种建模方式混合设计描述3.VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符和表达式条件语句Case语句VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符和表达式条件语句Case语句标识符定义:标识符(identifier)用于定义模块名、端口名、信号等。可以是一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符区分大小写。例:CountCOUNT//与Count不同
R56_68FIVE$关键字,Verilog中的保留字。注意:只有小写的关键字才是保留字书写规范建议用有意义的有效的名字,如Sum、CPU_addr等用下划线区分词采用一些前缀或后缀,
时钟采用Clk前缀:Clk_50,Clk_CPU
低电平采用_n后缀:Enable_n统一一定的缩写,如全局复位信号Rst同一信号在不同层次保持一致性,如同一时钟信号必须在各模块中保持一致自定义的标识符不能与保留字同名参数采用大写,如SIZEVerilogHDL基本语法标识符注释格式数字值集合数据类型运算符和表达式条件语句Case语句Verilog中有两种注释的方式,一种是一“/*”符号开始,以“*/”符号结束,在两个符号之间的语句都是注释语句,因此可以扩展到多行。如:以上n各语句都是注释语句另一种是以“//”开头的语句,它表示以//开始到本行的结束都属于注释语句注释/*statement1,statement2,...
statementn*/VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符和表达式条件语句Case语句格式VerilogHDL是区分大小写的,即大小写不同的标识符是不同的Verilog书写格式自由,一条语句可多行书写;一行可写多个语句空白(新行、制表符、空格)没有特殊意义如与是一样的input
A;
input
Binput
A;input
B;书写规范建议一个语句一行采用空四格的TAB键进行缩进VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符和表达式条件语句Case语句数字值集合值的集合常量(整型、实型、字符型)变量值集合四种基本的值类型0:逻辑0或“假”1:逻辑1或“真”X:未知值Z:高阻四种值得解释内置于语言中与门的输入或表达式中的“z”的值通常解释为“x”X值与z值不区分大小写,及0x1z和0X1Z相同常量整型、实型、字符串型下划线符号“_”可随意用在整数或实数中,用来提高易读性。注:下划线不能作为首字符。整型书写格式:简单的十进制数格式;基数格式字符串型:双引号内的字符系列。整型-简单的十进制格式带有一个可选的“+”或“-”操作符的数字序列例如:32十进制数32-15十进制数-15整型-基数表示法(一)格式:[size]’basevalueSize定义以位计的常量的位长;base为o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;value是基于base的值的数字序列。值x和z以及十六进制中的a到f不区分大小写整型-基数表示法(二)合法例子:非法例子:5‘o37
//5位常量,值为八进制数37(和5'b11111等效)4
'd2
//4位常量,值十进制数2(和4'b0010等效)4
'b1x_01
//4位常量,各位的状态依次为1x_017
'hx
//7位常量,每位的状态均为未知(和7'bxxxxxxx等效)4
'hz
//4位常量,每位的状态均为高阻(和4'bzzzz等效)8
'h
2A
//位长和单引号之间以及基数和数字之间允许出现空格3'
b
001
//非法:'和基数b之间不允许出现空格(2+3)
'b10
//非法:位长不能为表达式4
'd-4
//非法:数值不能为负,符号应放在最左边注意:x(或z)在十六进制中代表4位x(或z),在八进制中代表3位x(或z),在二进制中代表1位x(或z)。整型数的长度定义是可选的,如没有定义长度,数的长度为相应值中定义的位数,如:如果定义的长度比常量制定的长度长,通常在左边填0补位。但是如果数最左边一位为“x”或“z”,就相应地用x或z在左边补位。如:如果长度定义的要小,最左边的位相应地被截断。如:'o
721
//9位八进制数'h
AF
//8位十六进制数整型-基数表示法(三)10'b10
//左边填0占位,等价于10'b000000001010'bx0x1
//左边填X占位,等价于10'bxxxxxxx0x13'b1001_0011
//与3'b011等价5'H0FF
//与5'H1F等价字符串型双引号内的字符序列。字符串不能分成多行书写。例:整数型常量是可以综合的,而实数型和字符串型常量都是不可综合的"INTERNALERROR""thisisanexampleforVerilogHDL"VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符和表达式条件语句Case语句数据类型线网类型(nettype)寄存器类型(regtype)数据类型-线网类型(nettype)常用wire定义用于对结构化器件之间的物理连线建模代表物理连接线,不存储逻辑值,必须由器件驱动,通常由assign进行赋值,如:当一个wire类型的信号没有被驱动时,缺省值为z(高阻)信号非有定义数据类型时,缺省为wire类型语法:assign
A
=
B
^
C;wire
[msb:lsb]
wire1,
wire2,
...
,
wireN;数据类型-寄存器类型(regtype)reg是最常用的寄存器类型,用于对存储单元的描述,如D触发器,ROM。在某种触发机制下分配一个值,在分配下一个值之前保留原值reg类型的变量,不一定是存储单元,如在always语句中进行描述的必须用reg类型的变量。语法:例:reg
[msb:lsb]
reg1,
reg2,
...
,
regN;reg
[3:0]
Sat;
//Sat为4位寄存器类型信号reg
Cnt;
//1位寄存器类型reg[1:32]
Kisp,
pisp,
lisp;
//3个32位寄存器类型信号数据类型-寄存器类型(regtype)建模举例:用寄存器类型构建两位的D触发器:用寄存器数组类型来建立存储器的模型,如对2个8位的RAM建模如下:存储单元必须一个一个地赋值reg
[1:0]
Dout;...always@(posedge
clk)
Dout
<=
Din;...reg[7:0]
Mem[0:1];Mem[0]
=
'h55;Mem[1]
=
'haa;VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符条件语句Case语句运算符关系运算符算术运算符逻辑运算符按位逻辑运算符条件运算符连接运算符移位运算符运算符-算术运算符常用算术运算符:加法(二元运算符):“+”减法(二元运算符):“-”乘法(二元运算符):“*”除法(二元运算符):“/”求余(二元运算符):“%”运算符-关系运算符(一)包括:> 大于< 小于>= 不小于<= 不大于== 等于=== 全等!= 不等!== 不全等结果为True(1)或False(0)。如果操作数中有一位为x或z,那么结果为x运算符-关系运算符(二)例:如果操作数长度不同,长度较短的操作数在左方填0补齐。例:逻辑相等与不等的比较中,只要一个操作数含有x或z,比较结果为未知(x)。如:23>45
//结果为False(0);52<8'hxFF
//结果为x'b1000>='b01110;
//等价于'b01000>='b01110;结果为假(0)Data
=
'b11x0;Addr
=
'b11x0;Data
==
Addr
//比较结果不定,也就是说值为x运算符-逻辑运算符(一)包括:&& 逻辑与|| 逻辑或! 逻辑非语法:(表达式1)逻辑运算符(表达式2)运算结果为0或1,例:Crd='b0;
//0为假Dgs='b1;
//1为真Crd&&Dgs
//结果为0(假)Crd||Dgs
//结果为1(真)!Dgs
//结果为0(假)运算符-逻辑运算符(二)逻辑与(&&)的真值表:逻辑或(||)的真值表:运算符-按位逻辑运算符(一)包括:~ 一元非,相当于非门运算& 二元与,相当于与门运算| 二元或,相当于或门运算^ 二元异或,相当于异或门运算~^,^~ 二元异或非,即同或,相当于同或门运算
在输入操作数的对应位上按位操作,产生向量结果。运算符-按位逻辑运算符(二)按位逻辑运算符真值表:运算符-按位逻辑运算符(三)例:如果操作数长度不相等,长度较小的操作数在最左端填0补位。例如:A
=
'b0110;B
=
'b0100;A|B
//结果为'b0110A&B
//结果为'b0100'b0110^'b10000//与下式的操作相同'b00110^'b10000//结果为:'b10110运算符-条件运算符根据条件表达式的值选择表达式语法:cond_expr?expr1:expr2;如果cond_expr为真(1),选项expr1,如果cond_expr为假(0),选择expr2.如果cond_expr为x或z,结果是按以下逻辑expr1和expr2按位操作的值:0与0得1,1与1得1,其余情况为x例:wire
[2:0]
Student
=
Marks>18
?
Grade_A
:
Grade_C;//计算表达式Marks>18,如果为真,Grade_Aa赋值给Stuent;//如果为假,Grade_c赋值给Student运算符-连接运算符将小表达式合并形成大表达式语法:{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位交换运算符:移位运算符<<左移位运算符>>右移位运算符语法:a>>n或a<<na代表要进行移位的操作数,n代表要移几位。逻辑移位,移出的位用0填补例1:若A=5’b11001,则:
A>>2的值为5’b00110A<<2的值为5’b00100VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符If_else语句Case语句If_else语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。三种形式:If_else语句的三种形式(1):if(condition)
procedural_statement;
(2):if(condition)
procedural_statement_1;
//语句1else
procedural_statement_2;
//语句2
(3):if(condition_1)
procedural_statement_1;
//语句1else
if(condition_2)
procedural_statement_2;
//语句2
.
.
.else
if(condition_m)
procedural_statement_m;
//语句melse
procedural_statement_n;
//语句n说明:1.if语句后面都有表达式,一般为逻辑表达式或关系表达式。0、x、z按“假”处理,1按“真”处理。2.注意分号的使用,if、else合起来是一条语句,else不能单独使用3.if、else后面如果有多个操作语句,必须用begin和end关键字包含起来组成为一个复合语句,例if(a>b)
begin
out1<=int1;
out2<=int2;
endelse
begin
out1<=int2;
out2<=int1;
end说明:4.允许一定形式的表达式简写,例如:5.if语句的嵌套注意if和else的配对关系,else总是与它上面最近的if配对。if(expression)
等同于if(expression
==
1)if(!expression)
等同于if(expression
!=
1)if(condition_1)
if(condition_2)
procedural_statement_1;
else
procedural_statement_2;else
if(condition_3)
procedural_statement_3;
else
procedural_statement_4;例2:if(condition_1)
begin
if(condition_2)
procedural_statement_1;
endelse
procedural_statement_2;可以用begin、end块语句来确定配对关系。例1:if(condition_1)
begin
if(condition_2)
procedural_statement_1;
else
procedural_statement_2;
end例:模为60的8421BCD码加法计数器BCD码——4位,0-9有进位输入,结果加1输出,计数满60之后产生一个进位输出VerilogHDL基本语法标识符注释格式数字值集合数据类型运算符If_else语句Case语句case语句多分支选择语句三种形式:1.case(表达式)<case分支项>endcase2.casez(表达式)<case分支项>endcase3.casex(表达式)<case分支项>endcase语法:case(case_expr)
case_item_expr_1
:
procedural_statement_1;
case_item_expr_2
:
procedural_statement_2;
.
.
.
case_item_expr_m
:
procedural_statement_m;
default:procedural_statement_n;endcase说明:1.case括号中的表达式称为控制表达式,分支项中的表达式称为分支表达式。2.当控制表达式的值与分支表达式的值项相等时,就执行分支表达式后面的语句;如果所有的分支表达式的值都没有与控制表达式的值相匹配,就执行default后面的语句3.default项可有可无,一个case语句只能有一个default项4.每个分支表达式的值必须互不相同,否则会出现矛盾。5.所有表达式值的位宽必须相等。6.case、casez、casex的区别,case为全等比较,casez对表达式中出现z的相应位不予比较,casex对表达式中出现x、z的相应位均不予比较,见真值表例:BCD码七段数码显示译码器三种建模方式详解结构建模数据流建模行为建模三种建模方式详解结构建模数据流建模行为建模结构建模(一)描述语句主要是实例化语句实例化的对象主要是PLD厂家提供的宏单元和设计者已有的设计结构建模(二)——实例化语句语法:module_name
instance_name(port_associations);端口关联可通过位置或名称关联,但两者不能混用通过位置关联(port_expr1,port_expr2,…,port_exprn);通过名称关联(.PortName(portexpr1),.PortName(port_expr2),….PortName(port_exprn));结构建模(二)——实例化语句例:module
and_ins(DO,D1,D2);
input
D1,D2;
output
DO;
wire
T1,T2;
//采用位置关联,T1对应输出端口,D1、D2对应两个输入端口
and
A1(T1,D1,D2);
//采用名称关联,C是test模块的端口,与信号T2相连
test
O1(
.C(T2),
.A(D1),
.B(D2));
assign
DO=T1^T2;
endmodule结构建模(二)——实例化语句说明:port_expr可以是一下任何类型标识符,reg或wire。如,上例中的T3为wire型位选项则。如,.c(D[0]),c端口接到D信号的第0位部分选择。如,.Bus(Din[5:4])上述类型的合并。如,.Addr({A1,A2[1:0]})表达式(只适用于输入端口),如,.A(wire
Zire=0)建议:尽量采用名称关联结构建模(二)——实例化语句端口悬空的处理:实例化时,可能有些管教没有用到,可在映射中采用空白处理。对输入管教悬空,则该管教输入为高阻Z,输入管教被悬空,该输出管教废弃不用。DFF
d1
(
.Q(QS),
.Qbar
(
),
.Data
(D)
,
.Preset
(
),
//该管脚悬空
.Clock
(CK));
//名称对应方式。三种建模方式详解结构建模数据流建模行为建模数据流建模(一)主要描述方式为持续性赋值语句数据流建模(二)——持续性赋值语句也称连续赋值语句(continuousassignment)对线网类型变量赋值语法:主要用于组合逻辑的建模执行过程:只要右边表达式任一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号为并行执行语句,与书写顺序无关assign
net_type
=
expression;数据流建模(二)——持续性赋值语句举例:wire
[3:0]
Z,
Preset,
Clear;
//线网说明assign
Z
=
Preset
&
Clear;
//连续赋值语句wire
Cout,
C
i
n
;wire
[3:0]
Sum,
A,
B;.
.
.assign
{Cout,
Sum}
=
A
+
B
+
Cin;assign
Mux
=
(S
=
=
3)?
D
:
'bz;三种建模方式详解结构建模数据流建模行为建模行为建模通过对设计的行为的描述来实现对设计建模一般采用过程语句(initial语句和always语句)行为建模——initial语句语法1:initial
语句1;语法2:只执行一次常用于产生激励信号或寄存器变量的初始化常用于仿真中的初始化initial
begin
statement1;
statement2;
.
.
.
statementn;
end行为建模——initial语句例:用initial语句产生激励信号`timescale
1ns/1nsmodule
test;
reg
A,B,C;
wire
D;
initial
begin
A=0;B=1;c=0;
#50
A=1;B=0;
#50
A=0;C=1;
#50
B=1;
#50
B=0;C=0;
end
and3
t1(D,A,B,C);
endmodule行为建模——always语句语法1:always
时序控制语句1;语法2:always语句不断重复执行,即一直检测时序控制条件,一旦满足,其后的语句被执行一次always
时序控制
begin
statement1;
statement2;
...
statementn;
end行为建模——always语句例:时序控制通常为敏感信号表达式,当表达式中变量的值改变时,其后的语句被执行一次,多个表达式之间用“or”连接,此时的语法为:敏感信号一般为两种类型:边沿敏感型和电平敏感型,两者一般不要在一个always语句中同时使用
always
#5
areg
=
~areg;
always
@(敏感信号表达式)
begin
n条语句;
end行为建模——always语句边沿触发的always常常描述时序行为,综合后生成的电路为寄存器加门级组合逻辑电平触发的always常常描述组合逻辑行为,综合后生成的电路为门级组合逻辑或带锁存器的组合逻辑例:always
@(posedge
clk
or
posedge
clr)
//两个敏感信号都是边沿型always
@(A
or
B)
//两个敏感信号都是电平敏感型always
@(posedge
clk
or
clr)
//不建议使用,两种敏感类型不要同时使用行为建模—posedge和negedge关键字对时序电路的建模(时序电路由时钟边沿触发)posedge表示上升沿;negedge表示下降沿注意同步、异步控制信号的描述方法行为建模—posedge和negedge关键字例1:同步置位、同步清零的计数器module
cout(out,data,load,reset,clk);
input[7:0]
data;
input
load,clk,reset;
output[7:0]
out;
reg[7:0]
out;
always
@(posedge
clk)
//clk上升沿触发
begin
if(!reset)
out
<=
8'h00;
//同步清零,低电平有效
else
if(load)
out
<=
data;
//同步置位,高电平有效
else
out
<=
out+1;
//上升沿计数
endendmodule行为建模—posedge和negedge关键字上例中,敏感信号表达式中没有列出输入信号,load和reset,因为它们为同步控制信号,在时钟的上升沿才检测这些信号行为建模—posedge和negedge关键字例2:异步控制信号的描述方式always
@(posedge
clk
or
posedge
clear)
begin
if(clear)
语句1;
//clear信号上升沿到来时,clear为高电平,
else
//执行语句1,即高电平清零有效语句2;
//否则,在时钟的上升沿执行语句2;
end
always
@(posedge
clk
or
negedge
clear)
begin
if(!clear)
语句1;
//低电平有效清零
else
语句2;
end行为建模—posedge和negedge关键字注意块内的逻辑描述要与敏感信号表达式信号中的有效电平一致,如下错误的描述:always@(posedge
clk
or
negedge
clear)
begin
if(clear)
//矛盾,应改为:if(!clear)
out
<=
0;
else
out
<=
in;
end其他语法赋值语句持续性赋值与过程赋值阻塞赋值与非阻塞赋值参数定义:parameter编译预处理宏定义`define文件包含处理`include时间尺度`timescale其他语法赋值语句持续性赋值与过程赋值阻塞赋值与非阻塞赋值参数定义:parameter编译预处理宏定义`define文件包含处理`include时间尺度`timescale赋值语句持续性赋值语句(continuousassignment),主要用于对wire型变量赋值,用于数据流建模过程赋值语句(proceduralassignment),多用于对reg型变量赋值,用于行为建模。包括阻塞赋值(blockingassignment)和非阻塞赋值(non-blockingassignment)两种。赋值语句——持续型赋值语句例:2选1多路选择器module
MUX2_1(out,a,b,sel);
input
a,b,sel;
output
out;
assign
out
=
(sel==0)?a:b;
//持续型赋值,如果sel为0,则out=a,否则,out=bendmodule赋值语句——过程赋值语句非阻塞(non-blocking)赋值方式赋值符号为“<=”,如:b<=a;非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立即就改变的阻塞(blocking)赋值方式赋值符号为“=”,如:b=a;语句结束时立即完成赋值操作,即b的值在该条件语句结束后立即改变同一个块语句中,如果有多个阻塞赋值语句,那么前面的赋值操作没完成之前,后面的语句就不能被执行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论