本章内容概述
- 提出基于布尔方程的Verilog模型;
- 介绍了一种用于组合与时序逻辑描述的更通用、更抽象的建模方式;
- 算法状态机(ASM)图,将被用于开发和设计有限状态机的行为级模型;
- 用算法状态机和数据通道(ASMD)图,来设计由数据通道和控制单元构成的更通用的时序电路;
- 给出一些电路的综合行为级模型的设计;
5.1 行为建模
Verilog结构支持结构级建模和行为级建模。
结构级建模:传统设计方法,采用原理图输入工具,把逻辑门连接起来,形成门电路,产生具有某一特定功能的器件(如加法器)。 但是当一个设计中包含较多的逻辑门的时候,门级模型不一定是电路最简单或最容易理解的模型
行为级建模:不用考虑怎样实现硬件设计,只需描述设计的功能性,即所设计的电路是干什么的。
在电路设计过程中需要理解的一点是,行为级建模描述其实也是一个实体电路,只不过是用语言来描述。你要知道你写的每一句话对应到电路中代表的是什么东西。HDL毕竟是硬件描述语言,这些语句描述的是硬件,而不是软件。
5.2 行为级建模的数据类型的简要介绍
Verilog的所有变量都是具有预先定义的类型,且只有两种数据类型:线网型和寄存器型。
线网型(wire):物理上起到导线的作用;主要使用wire;
寄存器型(reg、integer):在程序运行的过程中存储信息;主要使用reg、integer;
wire和reg默认为是1位变量;integer的大小自动取主机所支持的计算机字长,至少32位;
5.3 基于布尔方程的组合逻辑行为级模型
说的很高大上…实际上用人话说就是把门电路的布尔方程表达式逻辑用Verilog语言描述出来。
举个例子:
module and2
(
input a,
input b,
output c
);
assign c = a && b;
endmodule
这就是一个行为级模型了,描述了一个2输入与门。
一般来说,输入定义成wire型,输出定义为reg型。如果输出没有定义的话,默认输出是wire型。
用布尔方程描述的组合逻辑的行为模型会用到一些操作符,如逻辑与操作符(“&&”),逻辑或操作符(“| |”),逻辑非操作符(“!”),条件操作符(“?:”)等,具体使用哪个需要根据实际情况去选择。
5.4 传播延时与连续赋值
传播(惯性)延时与连续赋值相关联,可以使传播延时的隐含逻辑与其它对应的门级电路具有同样的功能和时序特性。
Verilog描述 | 逻辑描述 | |
结构模型 | 电路原理图 | |
用户定义原语 | 真值表 | |
连续赋值语句 | 布尔表达式 |
没看太明白想要表达什么…二刷有感悟再补充
5.5 Verilog中的锁存器和电平敏感电路
感觉想表达的就是,锁存器是随着电平的变化而变化的,举个例子
module D_latch
(
input data_in,
input enable ,
outout q_out
);
assign q_out = enable ? data_in : q_out ;
endmodule
就是描述了一个D锁存器。当enable有效时,q_out = data_in;当enable无效时,q_out = q_out,即保持不变;也就是这个锁存器是对enable的电平敏感的。
感觉P93例5.8的assign好像有点问题
5.6 触发器和锁存器的周期性行为模型
可以把always定义的那一堆堆理解为周期性行为。因为只要满足条件,就会执行语句。
连续赋值语句assign无法模拟边沿敏感的元件,如触发器。因此,借助同步信号(通常称为时钟)的某个边沿触发动作来进行同步。
而之所以称之为“周期性行为”,是因为它们在最后一条过程语句执行完之后仍然不能终止,而是继续执行。执行这些语句可能是无条件的,或者可能是由一个可选事件表达式进行控制的。
周期行为可以用于模拟和综合电平敏感和边沿敏感行为。
always@(posedge clk) begin
...
...
end
如上述代码,只要是满足clk的上升沿,always块内的语句就会一直执行,即为周期性行为。
在时序逻辑中,会涉及到非阻塞赋值“<=”,非阻塞赋值所赋值的变量必须是一个寄存器型变量。如“a <= b”,则要求a必须定义为寄存器型变量。
5.7 周期性行为和边沿检测
大概是讲always模块中的边沿检测和电平检测吧,涉及到always块敏感列表的使用,
always@(敏感列表) begin
...
...
end
这里的敏感列表可以是边沿检测,也可以是电平敏感
边沿检测:
always@(posedge a or negedge b) begin
...
...
end
当检测到a的上升沿或者b的下降沿时,执行always块内部的语句
电平敏感:
always@(a,b) begin
...
...
end
当检测到a或者b的值发生变化时,就会执行always模块内部的语句。
5.8 行为建模方式的比较
5.8.1 连续赋值模型
连续赋值模型assign在语句之间、基本门之间、及描述中的所有行为模块之间都是并行执行的。
5.8.2 数据流/寄存器传输级模型
组合逻辑的数据流模型通常用来描述同步机信号的并发运算。
在同步机中,计算的初始化是在时钟的有效沿进行的,计算是在下一个有效沿时刻寄存器的存储前完成的。
在每个有效沿时,硬件寄存器会读取和存储上一个时钟沿所形成的数据输入,在下一个时钟沿传递寄存器中存储的新值。
对电平敏感的组合逻辑电路是阻塞赋值,所以依次执行;
对边沿敏感的时序逻辑电路是非阻塞赋值,因此是并行执行;
非阻塞赋值在给左边的变量赋值之前,要计算每个右表达式的值。
5.8.3 基于算法的模型
待补充。
5.8.4 端口名称:风格问题
待补充。
5.8.5 用行为级模型仿真
待补充。
5.9 多路复用器、编码器和译码器的行为级模型
主要通过 “ if...else ”语句、“ ?:”语句、 “case...endcase”语句来对其进行描述。不同的描述方法最后综合得到的电路不太一样。
5.10 线性反馈移位寄存器的数据流模型
这一部分直接就没咋看懂,回头细看一下线性反馈移位寄存器(LSFR)是什么吧。
5.11 用循环算法的数字机模型
模拟数字机模型的算法,可以在特定的机器周期中反复地执行一些或所有步骤,这主要取决于这些步骤是否为条件执行。这里介绍了几种循环语法。
for循环;
repeat循环;
while循环;
5.11.1 IP(知识产权)的复用和参数化模型
首先要清楚IP是什么呢。
IP(Intellectual Property),是具有知识产权的、已经设计好并经过验证的、可重复利用的集成电路模块。IP的复用,就是重复使用已经设计并验证过的集成电路IC模块。
5.11.2 时钟发生器
时钟发生器用在testbench中,为同步测试电路模型提供时钟信号。
5.12 多循环操作状态机
又没看懂。
5.13 设计文件中的函数和任务:是精明还是愚蠢?
这一节介绍了task和function的使用方法。
5.14 行为建模的算法状态机图
算法状态机(ASM)图,是时序状态机功能的一种抽象,也是模拟时序状态机行为特性的关键工具。
算法状态机(ASM)图类似于软件流程图,但显示的是计算动作的时间顺序(如寄存器操作),以及在状态机输入影响下发生的时序步骤。
ASM图描述的是状态机的行为动作,而不是存储单元所存储的内容。
有时,用机器工作期间的行为动作来描述状态机的状态。这种方法比用状态机产生的数据进行描述更方便,也更重要。
ASM图在描述时序状态机的行为方面、设计状态机来控制数据通道方面,非常有帮助。
个人感觉有点类似于流程图。
两种状态机(Melay型和Moore型)都可以用ASM图来表示。
Moore机的输出通常列写在状态框内。在输入的作用下,判决框中的值决定通过ASM块的可能的通道。
条件输出(Melay输出)放在ASM图的条件框中。
5.15 ASMD图
有限状态机(FSM)的一个重要应用是:控制更普遍的时序机的寄存器的操作。这种时序机被分为控制器和数据通路。
控制器:控制器的ASM图中,状态框可以表示状态机的Moore型输出;条件框可以表示Melay型输出;判断框可以表示来自环境的基本输出和来自数据通路的状态输入。
当控制器的状态沿着通道发生转移,并且标志信号有效时,通过标注每个数据通道,可指出那些在相关数据通道单元中所发生的并发寄存器操作。
以这种方式连接到数据通道的ASM图称为ASMD图(算法状态机和数据通道)。ASMD图是从FSM图转变过来的。主要就是在FSM图中将控制器和数据通路建立起清晰的联系,使这两者不被混淆。
数据通路:控制器生成的输出来控制数据通路上的寄存器,并引起相应ASMD图上所标识的寄存器操作。