一、第一章
1. 几个英文缩写:
PLA(Programmable Logic Array)可编程逻辑阵列
FPGA(Field Programmable Gate Array)现场可编程逻辑门阵列
CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件
CAD(Computer Aided Design) 计算机辅助设计
CAE(computer aided engineering)
EDA(electronic design automation) 电子设计自动化
2. EDA定义:以计算机为工作平台,以EDA软件为开发环境,以PLD器件或者ASIC专用
集成电路为目标器件设计实现电路系统的一种技术。
3. 现代EDA技术的特征【简答】
(1) 采用硬件描述语言(HDL)进行设计
HDL语言更适合于描述规模大、功能复杂的数字系统,使设计者在比较抽象的层次上对所设计系统的结构和逻辑功能进行描述。
(2) 逻辑综合与优化
目前EDA工具最高只能接受行为级和RTL级描述的HDL文件进行逻辑综合
(3) 开放性和标准化
普遍采用标准化和开放性的框架结构,可以与其他的EDA工具一起进行设计工作,实现各种工具的优化组合,集成在一个易于管理的统一环境下,实现资源共享提高工作效率,利于大规模设计。
(4)更完备的库(Library)
在电路设计的各个阶段,EDA系统需要不同层次、不同种类的元器件模型库的支持。EDA工具要具有更强大的设计能力和更高的设计效率,必须配有丰富的库。各种模型库的功能和规模是衡量EDA工具优劣的一个标志
4. 基于EDA技术的设计思路(P4~P5)
(1) Top-down设计,即自顶向下的设计
将设计分成几个不同的层次:系统级、功能级、门级、开关级,
按照自上而下的顺序,在不同的层次上对系统进行设计和仿真。
首先从系统设计入手,在顶层进行功能框图的划分和机构设计。
在功能级进行仿真纠错,并用HDL对高层次的系统行为进行描
述,然后用综合工具将设计转化为具体门电路网表。
Top-down的设计须经过“设计—验证—修改设计—再验证”的
过程,不断反复,直到结果能够实现所要求的功能,并在速度、
功耗、价格和可靠性方面实现较为合理的平衡。
(2) Bottom-up设计,即自底向上的设计
设计者选择标准集成电路,或者将各种基本单元做成基本单元库,调用这些基本单元,直到设计出满足需要的系统。缺点:效率低、易出错
5. IP核的一些概念(intellectual property)
IP核(IP模块):指功能完整,性能指标可靠,已验证的、可重用的电路功能模块。分为硬核、固核、软核。
(1) 软核:如ARM。是指在寄存器级或门级对电路功能用HDL描述,表现为用VHDL
等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。
(2) 硬核:以版图形式实现的设计模块,基于一定的设计工艺。供设计的最终阶段产品:
掩膜。
(3) 固核:完成了综合的功能块。以网表形式提交客户使用。
软核使用灵活,但可预测性差;硬核可靠性高,能确保性能,并和很快投入使用。
6. SOC: SYSTEM on a CHIP
芯片系统、片上系统。是指把一个完整的系统集成在一个芯片上;或者说用一个芯片实现一个功能完整的系统。
举例:由微处理器核(MPU Core),数字信号处理器核(DSP Core),存储器核(RAM/ROM),A/D、D/A核以及USB接口核等构成一个单片系统(SoC)。
7. 设计方法的演变(见下图)
8. 基于FPGA/CPLD的数字系统设计流程 (见下图)
9. 综合
将较高层次的设计描述自动转化为较低层次描述的过程。
◆行为综合:从算法表示、行为描述转换到寄存器传输级(RTL)
◆逻辑综合:RTL级描述转换到逻辑门级(包括触发器)
◆版图综合或结构综合:从逻辑门表示转换到版图表示,或转换到PLD器件的配置网表表示
综合器是能自动实现上述转换的软件工具,是能将原理图或HDL语言描述的电路
功能转化为具体电路网表的工具
注意VHDL与C的区别。。。。
10. 仿真
仿真是对所设计电路的功能的验证。在设计过程中对整个系统和各个模块进行仿真,在PC上用软件验证功能是否正确,各部分时序配合是否准确。
(1) 功能仿真(Function Simulation)
不考虑信号延时等因素
(2) 时序仿真(Timing Simulation)
选择具体器件并完成布局布线后进行的包含延时的仿真。
11. 常用的EDA软件工具
按公司分:
(1) 第三方EDA软件工具,如
cadence design systems\mentor graphics\synopsys
功能强、有良好的兼容性、适合复杂和高效率的设计,但价格昂贵
(2) PLD厂商专用开发工具,如altera\xilinx\lattice
针对性好、提高资源利用率,降低功耗
按软件功能分:
(1) 集成的 FPGA/CPLD开发工具
(2) 设计输入工具
(3) 逻辑综合器
将设计者在EDA平台上编辑输入的HDL、原理图、状态图等,依据给定的硬件结构和约束控制条件进行编译、优化和转换,最终获得门级电路甚至更底层的电路描述网表文件的过程。专业逻辑综合软件有:
Synopsys的FPGA Express,fpga compiler, fpga compiler II
Synplicity的synplify pro/synplify
Mentor的leonardo spectrum
(4) 仿真工具
(5) 其他设计工具
二、第二章
(1) PLD理论基础(P19)【简答】
任何组合逻辑函数均可化为“与或”表达式,用“与门—或门”二级电路实现,任何时序电路又都可以由组合电路加上存储元件(触发器)构成。因此,从原理上说,与或阵列加上触发器的结构就可以实现任意的数字逻辑。
(2) CPLD和FPGA的区别
??
(3) JTAG边界扫描测试(P42)
为了解决超大规模集成电路(VLSI)的测试问题,自1986年开始,IC领域的专家成立了“联合测试行动组”(JTAG,Joint Test Action Group),并制定出了IEEE 1149.1边界扫描测试(BST,Boundary Scan Test)技术规范
这种测试方法提供一个串行扫描路径,它能捕获器件逻辑的内容,以可以测试遵守JTAG规范的器件之间的引脚连接情况,且可以在器件正常工作时捕获功能数据。测试数据从左边的一个边界单元串行移入,捕获的数据从右边的一个边界扫描单元串行移入,然后同标准数据进行比较,就能够知道芯片性能的好坏。
(4) 在系统可编程(ISP)in-system programmable)
指的是对器件、电路板或整个电子系统的逻辑功能可随时进行修改或重构的能力。
三、第三章
1. Quartus II设计开发流程 (P56)
(1) 设计输入:包括原理图输入、HDL文本输入、EDIF网表输
入、波形输入
(2) 编译:先根据设计要求设定编译方式和编译策略,如器件
的选择,逻辑综合方法的选择。然后根据设定的参数和策
略对设计项目进行网表提取、逻辑综合、器件适配,并产
生报告文件、延时信息文件及编程文件,供分析、仿真编
程使用。
(3) 仿真:用以验证设计项目的逻辑功能和时序关系是否正确
(4) 编程与验证:用得到的编程文件通过编程电缆配置PLD,
加入实际激励,进行在线测试。
2. 时序分析
建立时间(tsu):在触发器记时的时钟信号已在时钟引脚确立之前,通过输入或使能端输入而进入寄存器的数据必须在输入引脚处出现的时间长度
保持时间(th):在触发器记时的时钟信号已在时钟引脚确立之后,通过输入或使能端输入而进入寄存器的数据必须在输入引脚处出现的时间长度
时钟至输出延时(tco):时钟信号在触发寄存器的输入引脚发生转换之后,再由寄存器馈送到信号的输出引脚上取得有效输出所需的时间
引脚至引脚延时(tpd):输入引脚处信号通过组合逻辑进行传输并出现在外部
最大时钟频率(fmax):在不违反内部tsu和th要求下可以达到的最大频率。
延缓时间:
3. 宏模块库
Quartus自带的有Megafunctions\maxplusii\primitives.
Megafunction库是Altera提供的参数化模块库。从功能上看,可以把Megafunction库中的元器件分为:
算术运算模块(arithmetic)\逻辑门模块(gates)\储存模块(storage)\IO模块(I/O)
四、第四章
1. Verilog语言的特点:从C发展而来【简答】
(1) 既适合于可综合的电路设计,也可胜任电路与系统的仿真
(2) 能在多个层次上对所设计的系统加以描述,从开关级、门级、寄存器传输级、行为
级,同时该语言不对设计规模加以限制
(3) 灵活多样的描述风格,包括行为描述和结构描述,支持混合建模,可以在一个设计
中不同模块在不同层次上建模和描述
(4) Verilog的行为描述语句,如条件语句、赋值语句和循环语句等,类似于软件高级
语言,便于学习和使用。
(5) 内置各种基本逻辑门,可以方便进行门级结构描述,内置各种开关级元件,可以进
行开关级建模
(6) 易学易用,功能强,可满足各个层次设计人员的需要。
2. Verilog程序的特点:
(1) Verilog程序由模块构成,没搞个模块的内容嵌在module和endmodule两个关键字
之间;每个模块实现特定功能
(2) 每个模块首先要进行端口定义,并说明输入和输出口,然后对模块的功能进行定义
(3) Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写
(4) 除了endmodule等少数语句外,每个语句最后必须有分号
(5) 可以用/*„„*/和//„„对Verilog程序做注释,以增强程序的可读性和可维护性
3. Verilog模块基本结构:图4.2
(1) 模块声明
(2) 端口定义:端口类型有三种(输入端口、输出端口、输入
输出双向端口)
(3) 信号类型声明(输入端口和双向端口不可以用寄存器型)
(4) 逻辑功能描述
assign语句:一般用于组合逻辑赋值
always语句:既可用于组合电路也可以描述时序电路
元件例化:调用元件的方法类似于在电路图输入方式下调入图形符
号来完成设计,这种方法侧重于电路的结构描述。
/*******************************************************/
module ();
output 输出端口列表; //输出端口声明
input 输入端口列表; //输入端口声明
/*定义数据,信号的类型,函数声明*/
reg 信号名;
//逻辑功能定义
assign =; //使用assign语句定义逻辑功能
//用always块描述逻辑功能
always @ ()
begin
//过程赋值
//if-else,case语句
//while,repeat,for循环语句
//task,function调用
end
//调用其他模块
();
//门元件例化
门元件关键字 ();
endmodule
/****************************************************************/
五、第五章
1. Verilog中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,
但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。
2. Verilog有下面四种基本的逻辑状态。
◆ 0:低电平、逻辑0或逻辑非
◆ 1:高电平、逻辑1或“真”
◆ x或X:不确定或未知的逻辑状态
◆ z或Z:高阻态
3. Verilog中的变量分为如下两种数据类型:◆ net型 ◆ variable型
◆ Net型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持续赋值语句assign对其进行赋值。
wire是最常用的Net型变量,tri跟wire完全一样
◆ variable型变量必须放在过程语句(如initial、always)中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号也必须定义成variable型。
注意:variable型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,variable型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。
4. 在Verilog语言中,用参数parameter来定义符号常量,即用parameter来定义一个标志
符代表一个常量。参数常用来定义时延和变量的宽度。
5. 向量
(1) 标量与向量 宽度为1位的变量称为标量,如果在变量声明中没有指定位宽,则默
认为标量(1位)。
(2) 在表达式中可任意选中向量中的一位或相邻几位,分别称为位选择和域选择
(3) 向量分为:标量类向量、向量类向量。标量类支持位选择域选择,后者不支持。前
者用scalared说明,后者用vectored说明。
(4) 在数字设计中用reg类型阵列构成的存储器在综合时均被综合成存储器宏模块。而
不是真正的RAM\ROM。
6. 运算符
(1) 位拼接运算符
(2) 可用括号()控制运算符的优先级
六、第六章
1. Verilog行为语句包括:过程语句、块语句、赋值语句、条件语句、循环语句、编译指
示语句
2. 过程语句
过程语句包括initial、always。多数过程模块均从属于此。
两者区别:在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化;initial过程块中的语句仅执行一次,always块内的语句则是不断重复执行的;always语句带触发条件,initial不带;always可综合,initial不可综合;两者过程块中均只对reg型变量赋值
3. 块语句
块语句是由块标志符串行块begin-end或并行块fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。
4. 赋值语句
。。。
5. 过程赋值语句
过程赋值语句多用于对reg型变量进行赋值。
(1)非阻塞(non_blocking)赋值方式 赋值符号为“
(2)阻塞(blocking)赋值方式 赋值符号为“=”, 如:b= a;
(3)阻塞赋值与非阻塞赋值的区别:非阻塞赋值语句右端表达式计算完后并不立即赋给左端,而是同时启动下一条语句继续执行,在进程结束时同时赋给左端变量
(4)使用时应当注意的事项:
1) 当用always块描述组合逻辑时,既可以用阻塞赋值,又可以用非阻塞赋值,建议使
用阻塞赋值
2) 设计时序逻辑电路,尽量使用非阻塞赋值
3) 描述锁存器尽量使用非阻塞赋值
4) 若在同一个always过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻
塞赋值
5) 在同一个always过程中,最好不要混合使用阻塞赋值和非阻塞赋值,对同一个变量,
不能既进行阻塞赋值,又进行非阻塞赋值
6) 不能在两个或两个以上的always过程中对同一个变量赋值 7) 仿真时使用
$strobe显示非阻塞赋值的变量
在always过程块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。
6. 任务与函数的区别
7. 顺序执行与并发执行
两个或更多个“always”过程块、“assign”持续赋值语句、实例元件调用等操作都是同时执行的。 在“always”模块内部,其语句如果是非阻塞赋值,也是并发执行的;而如果是阻塞赋值,则语句是按照指定的顺序执行的,语句的书写顺序对程序的执行结果有着直接的影响。 module serial1(q,a,clk); output q,a; input clk; reg q,a; always @(posedge clk) begin q=~q; a=~q; end endmodule
七、第七章
1. Verilog HDL 是一种能够在多个层级对数字系统进行描述的语言,verilog HDL 模型可以
是实际电路不同级别的抽象。这些抽象级别可分为5级
(1) 系统级(system level)
(2) 算法级(algorithm level)
(3) 寄存器传输级 (RTL, Register Transfer Level )
(4) 门级 (Gate Level)
(5) 开关级 (Switch level)
2. Verilog HDL 允许设计者用三种方式来描述逻辑电路:
结构描述(structural)
行为描述(behavioural)
数据流描述(data flow)
(1) 结构描述方式,就是指在设计中,通过调用库中的元件或是以设计好的模块来完成设计实体功能的描述。
(2)
行为描述,就是对设计实体的数学模型的描述,其抽象程度远高于结构描述,无须
知道具体电路的结构,只要描述清楚输入与输出信号的行为
可综合的verilog行为描述方式多采用always过程语句实现,这种行为描述既适合
于设计时序逻辑电路,也适合于设计组合逻辑电路。
采用行为描述方式时注意以下几点
1 用行为描述方式设计电路,可以降低设计难度。行为描述只需表示输入与输出之间的关系,不需要包含任何结构方面的信息。
2 设计者只需写出源程序,而挑选电路方案的工作由EDA软件自动完成,最终选取的电路的优化程度,往往取决与综合软件的技术水平和器件的支持能力。可能最终选取得电路方案所耗用的器件资源并非是最少的。
3 在电路规模较大或者需要描述复杂的逻辑关系时,应首先考虑用行为描述方式设计电路,如果设计的结果不能满足资源耗用的要求,则应改变描述方式。
(3) 数据流描述方式主要使用持续赋值语句,多用于描述组合逻辑电路。用数据流描述
方式设计电路与用传统的逻辑方程设计电路很相似。
3. 采用的描述级别越高,设计越容易:对综合器而言,行为级的描述为综合器的优化提供
了更大的空间,较之门级结构描述更能发挥综合器的性能,所以在电路设计中,除非一些关键路径的设计采用门级结构描述外,一般更多地采用行为建模方式。
4. 简易微处理器
(1) 代码
(2)测试代码
5. 同步双端口8*128FIFO
八、第八章
有限状态机(Finite State Machine, FSM)是时序电路设计中经常采用的一种方式,尤其适于设计数字系统的控制模块。优点是:具有速度快,结构简单,可靠性高等优点 ,过程明确,适用于控制。
1. 状态机可分为两类:米里型(Mealy)和摩尔型(moore)。摩尔型状态机的输出只用当
前状态的函数,米里型状态机的输出则是当前状态和当前输入的函数 2. 状态机有三种表示方法:状态图(state diagram)、状态表(state table)、流程图 3. 状态机设计中主要包含三个对象:
(1)当前状态 ,或称为现态(current state,cs) (2)下一个状态,或称为次态(Next State,ns) (3)输出逻辑(out logic,ol)
相应的,在用verilog描述有限状态机时,有下面几种描述方式 (1) 用三个过程描述:即现态(cs),次态(ns),输出逻辑(ol)各用一个always过程
描述
(2) 双过程描述(CS+NS,OL双过程描述):使用两个always过程来描述有限状态机,
一个过程描述现态和次态时序逻辑(CS+NS);另一个过程描述输出逻辑(OL)
(3) 双过程描述(CS,NS+OL双过程描述);一个过程用来描述现态(CS);另一个过程
描述次态和输出逻辑(NS+OL).
(4) 单过程描述:在但过程描述方式中,将状态机现态。次态,和输出逻辑(CS+NS+OL)
放在一个always过程中进行描述。
4. 101序列检测器 (1)三过程
module fsm1_seq101(clk,clr,x,z);
input clk,clr,x; output reg z; reg[1:0] state,next_state; parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;
/*状态编码,采用格雷(Gray)编码方式*/
always @(posedge clk or posedge clr) /*该过程定义当前状态*/ begin if(clr) state
always @(state or x) /*该过程定义次态*/ begin
case (state) S0:begin if(x) next_state
default: next_state
end
always @(state) begin case(state) S3: z=1'b1; default:z=1'b0; endcase end
endmodule (2)CS,NS+OL
/*该过程产生输出逻辑*/
(3)单过程
module fsm4_seq101(clk,clr,x,z);
input clk,clr,x; output reg z; reg[1:0] state;
parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;
/*状态编码,采用格雷(Gray)编码方式*/ always @(posedge clk or posedge clr)
Begin if(clr) state
end S3:begin if(x) begin state
default:begin state
endmodule 5. 状态编码
一位热码的特点:虽然多用触发器,但可以有效节省和简化译码电路。对于FPGA器件来说,采用一位热码可有效提高电路的速度和可靠性,也有利于提高资源利用率。 6. 状态机的复位
状态机一般都应设计为同步方式,并有一个时钟信号来触发。实用的状态机都应该设计为由唯一时钟边沿触发的同步运行方式。时钟信号和复位信号对每一个有限状态机来说都是很重要的。
同步复位型号在时钟的跳变沿到来时,对有限状态机进行复位操作,同时把复位值赋给输出信号并使用有限状态机回到起始状态。
在描述带同步复位有限状态机时,对同步复位信号进行判断的if语句中,如果不指定输出信号的值,那么输出信号将保持原来的值不变。这种情况会需要额外的寄存器来保持原值,从而增加了资源耗用,因此应该在if语句中指定输出信号的值。有时可以指定在复位时输出信号的值是任意值,这样在逻辑综合时会忽略它们。
如果只需要在上电和系统错误时进行复位操作,
那么采用异步复位方式要比同步复位方式好。
这样做的主要原因是;同步复位方式占用较多的额外资源,而异步复位可以消除引入额外寄存器的可能性;而且带有异步复位信号的verilog语言描述简单,只需要描述状态寄存器的过程中引入异步复位信号即可。 7. 多余状态的处理
(1) 在case语句中用default分支决定如果进入无效状态所采用的措施 (2) 编写必要的verilog源代码明确定义进入无效状态所采取的行为。 8. 状态机AD采用控制电路
九、第九章
流水线加法器与后面重复
十、第十章
1. 用FPGA/CPLD器件实现的设计中,综合就是将Verilog或VHDL语言描述的行为级或功
能级电路模型转化为RTL级功能块或门级电路网表的过程
2. 可综合的设计中应注意
(1)不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循环语句,如forever,while等。
(2) 应尽量采用同步方式设计电路。除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (3) 用always过程块描述组合逻辑,应在敏感信号列表中列出块中出现的所有输入信号。 (4) 所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位,用器件的全局时钟端作为系统外部时钟输入端。 (5) 在Verilog模块中,任务(task)通常被综合成组合逻辑的形式;每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。 3. 流水线技术
流水线加法器好处:工作速度快,在逻辑电路中加入若干寄存器来暂存中间结果,虽然多用了一些寄存器资源,但减小了每一级的电路的时延,提高整个加法器的运行频率。 为了保证数据吞吐率,电路设计中的一个主要问题是要维持系统时钟的速度处于或高于某一频率,如果延时路径较长,就必须在组合逻辑间插入触发器 流水线设计技术使用情形:在某些复杂逻辑功能的完成需要较长延时就会使得系统难以运行在高的频率上,这时可使用流水线设计技术 流水线设计技术的好处:在长延时的逻辑功能块中插入触发器,使得复杂的逻辑操作分步完成,减小每个部分的延时,从而是系统的运行频率得以提高 流水线技术的缺点:增加了寄存器逻辑,即增加量芯片资源的耗用
4. 流水线加法器 (1) 2
级
module adder_pipe2(cout,sum,ina,inb,cin,clk); input[7:0] ina,inb; input cin,clk; output reg[7:0] sum; output reg cout;
reg[3:0] tempa,tempb,firsts; reg firstc; always @(posedge clk)
begin {firstc,firsts}=ina[3:0]+inb[3:0]+cin; tempa=ina[7:4]; tempb=inb[7:4]; end
always @(posedge clk)
begin {cout,sum[7:4]}=tempa+tempb+firstc; sum[3:0]=firsts; end
endmodule
(2) 4级
module pipeline(cout,sum,ina,inb,cin,clk); output[7:0] sum;output cout;
input[7:0] ina,inb;input cin,clk; reg[7:0] tempa,tempb,sum; reg tempci,firstco,secondco,thirdco, cout; reg[1:0] firsts, thirda,thirdb;
reg[3:0] seconda, secondb, seconds; reg[5:0] firsta, firstb, thirds; always @(posedge clk)
begin tempa=ina; tempb=inb; tempci=cin; end //输入数据缓存 always @(posedge clk)
begin {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci; //第一级加(低2位) firsta=tempa[7:2]; firstb=tempb[7:2]; //未参加计算的数据缓存
end
always @(posedge clk)
begin {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts}; seconda=firsta[5:2]; secondb=firstb[5:2]; //数据缓存 end
always @(posedge clk)
begin {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}; thirda=seconda[3:2];thirdb=secondb[3:2]; //数据缓存 end
always @(posedge clk) begin
{cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds}; //第四级加(高两位相加) end endmodule
5. 过程
6. Always语句的特点:
(1) always过程只有两种状态,即执行状态和等待状态,是否进入执行状态取决于是否
满足特定的条件
(2) 不同的always过程是并发执行的:always过程、assign持续赋值、元件例化等操作
都是同时执行,在程序中的书写位置并不影响执行结果
7. 在用ALWAYS进行数字系统设计的时候应注意
将组合逻辑实现的电路和用时序逻辑实现的电路应尽量分配到不同的always过程中。 一个always过程中只允许描述对应于一个时钟信号的同步时序逻辑。
always过程必须由敏感信号的变化来启动,因此应精心选择进程敏感表达式中的敏
感变量。
多个always过程间可通过信号线进行通信和协调。
十一、 第十一章
仿真:对所设计电路系统的一种检测方法
1. 输出控制类系统任务:$display $write $monitor(实时监控器,只要输出变量列表中
的任何变量发生变化,系统则按照该语句所规定的格式将结果输出一次) $strobe(选通监控器,只有模拟时间发生变化时,并且所有的时间都已处理完毕后才能将结果输出) 2. 显示仿真时间标度的系统函数:$time $realtime(两个函数被调用时,都返回当前时
刻距离仿真开始时刻的时间量值,不同的是$time以64位整数值的形式返回模拟时间,$realtime以实数型数据返回模拟时间)
3. 对仿真过程进行控制的系统任务:$finish(结束仿真) $stop (中断仿真)
4. 文件读\写控制的系统任务:$readmemh(读取十六进制数据) $readmemb(读取二
进制数据)
5. 产生随机数据的系统函数:$random(每次调用该函数将返回一个32位随机数,是一
个带符号的整数)
6. 文件输入类系统任务:$fopen $fclose $fwrite $fmonitor $fstrobe $fdisplay 7. 延时:门延时(从门输入端发生变化到输出端发生变化的延迟时间)、assign赋值延时
(等号右端某个值发生变化到等号左端发生相应变化的延迟时间)、连线延时(信号在连线上传输的延时)
8. 测试平台:为测试或仿真一个Verilog HDL程序搭建一个平台,给被测试的模块施加激
励信号,通过观察被测试模块的输出响应,从而判断其逻辑功能和时序关系是否正确
9. 测试模块特点:
(1) 测试模块只有模块名字,没有端口列表
(2) 输入信号(激励信号)必须定义为reg型,以保持信号值,输出信号必须定义为wire
型
(3) 一般用initial、always过程快来定义激励信号波形,使用系统任务和系统函数定义输
出显示格式
一、第一章
1. 几个英文缩写:
PLA(Programmable Logic Array)可编程逻辑阵列
FPGA(Field Programmable Gate Array)现场可编程逻辑门阵列
CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件
CAD(Computer Aided Design) 计算机辅助设计
CAE(computer aided engineering)
EDA(electronic design automation) 电子设计自动化
2. EDA定义:以计算机为工作平台,以EDA软件为开发环境,以PLD器件或者ASIC专用
集成电路为目标器件设计实现电路系统的一种技术。
3. 现代EDA技术的特征【简答】
(1) 采用硬件描述语言(HDL)进行设计
HDL语言更适合于描述规模大、功能复杂的数字系统,使设计者在比较抽象的层次上对所设计系统的结构和逻辑功能进行描述。
(2) 逻辑综合与优化
目前EDA工具最高只能接受行为级和RTL级描述的HDL文件进行逻辑综合
(3) 开放性和标准化
普遍采用标准化和开放性的框架结构,可以与其他的EDA工具一起进行设计工作,实现各种工具的优化组合,集成在一个易于管理的统一环境下,实现资源共享提高工作效率,利于大规模设计。
(4)更完备的库(Library)
在电路设计的各个阶段,EDA系统需要不同层次、不同种类的元器件模型库的支持。EDA工具要具有更强大的设计能力和更高的设计效率,必须配有丰富的库。各种模型库的功能和规模是衡量EDA工具优劣的一个标志
4. 基于EDA技术的设计思路(P4~P5)
(1) Top-down设计,即自顶向下的设计
将设计分成几个不同的层次:系统级、功能级、门级、开关级,
按照自上而下的顺序,在不同的层次上对系统进行设计和仿真。
首先从系统设计入手,在顶层进行功能框图的划分和机构设计。
在功能级进行仿真纠错,并用HDL对高层次的系统行为进行描
述,然后用综合工具将设计转化为具体门电路网表。
Top-down的设计须经过“设计—验证—修改设计—再验证”的
过程,不断反复,直到结果能够实现所要求的功能,并在速度、
功耗、价格和可靠性方面实现较为合理的平衡。
(2) Bottom-up设计,即自底向上的设计
设计者选择标准集成电路,或者将各种基本单元做成基本单元库,调用这些基本单元,直到设计出满足需要的系统。缺点:效率低、易出错
5. IP核的一些概念(intellectual property)
IP核(IP模块):指功能完整,性能指标可靠,已验证的、可重用的电路功能模块。分为硬核、固核、软核。
(1) 软核:如ARM。是指在寄存器级或门级对电路功能用HDL描述,表现为用VHDL
等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。
(2) 硬核:以版图形式实现的设计模块,基于一定的设计工艺。供设计的最终阶段产品:
掩膜。
(3) 固核:完成了综合的功能块。以网表形式提交客户使用。
软核使用灵活,但可预测性差;硬核可靠性高,能确保性能,并和很快投入使用。
6. SOC: SYSTEM on a CHIP
芯片系统、片上系统。是指把一个完整的系统集成在一个芯片上;或者说用一个芯片实现一个功能完整的系统。
举例:由微处理器核(MPU Core),数字信号处理器核(DSP Core),存储器核(RAM/ROM),A/D、D/A核以及USB接口核等构成一个单片系统(SoC)。
7. 设计方法的演变(见下图)
8. 基于FPGA/CPLD的数字系统设计流程 (见下图)
9. 综合
将较高层次的设计描述自动转化为较低层次描述的过程。
◆行为综合:从算法表示、行为描述转换到寄存器传输级(RTL)
◆逻辑综合:RTL级描述转换到逻辑门级(包括触发器)
◆版图综合或结构综合:从逻辑门表示转换到版图表示,或转换到PLD器件的配置网表表示
综合器是能自动实现上述转换的软件工具,是能将原理图或HDL语言描述的电路
功能转化为具体电路网表的工具
注意VHDL与C的区别。。。。
10. 仿真
仿真是对所设计电路的功能的验证。在设计过程中对整个系统和各个模块进行仿真,在PC上用软件验证功能是否正确,各部分时序配合是否准确。
(1) 功能仿真(Function Simulation)
不考虑信号延时等因素
(2) 时序仿真(Timing Simulation)
选择具体器件并完成布局布线后进行的包含延时的仿真。
11. 常用的EDA软件工具
按公司分:
(1) 第三方EDA软件工具,如
cadence design systems\mentor graphics\synopsys
功能强、有良好的兼容性、适合复杂和高效率的设计,但价格昂贵
(2) PLD厂商专用开发工具,如altera\xilinx\lattice
针对性好、提高资源利用率,降低功耗
按软件功能分:
(1) 集成的 FPGA/CPLD开发工具
(2) 设计输入工具
(3) 逻辑综合器
将设计者在EDA平台上编辑输入的HDL、原理图、状态图等,依据给定的硬件结构和约束控制条件进行编译、优化和转换,最终获得门级电路甚至更底层的电路描述网表文件的过程。专业逻辑综合软件有:
Synopsys的FPGA Express,fpga compiler, fpga compiler II
Synplicity的synplify pro/synplify
Mentor的leonardo spectrum
(4) 仿真工具
(5) 其他设计工具
二、第二章
(1) PLD理论基础(P19)【简答】
任何组合逻辑函数均可化为“与或”表达式,用“与门—或门”二级电路实现,任何时序电路又都可以由组合电路加上存储元件(触发器)构成。因此,从原理上说,与或阵列加上触发器的结构就可以实现任意的数字逻辑。
(2) CPLD和FPGA的区别
??
(3) JTAG边界扫描测试(P42)
为了解决超大规模集成电路(VLSI)的测试问题,自1986年开始,IC领域的专家成立了“联合测试行动组”(JTAG,Joint Test Action Group),并制定出了IEEE 1149.1边界扫描测试(BST,Boundary Scan Test)技术规范
这种测试方法提供一个串行扫描路径,它能捕获器件逻辑的内容,以可以测试遵守JTAG规范的器件之间的引脚连接情况,且可以在器件正常工作时捕获功能数据。测试数据从左边的一个边界单元串行移入,捕获的数据从右边的一个边界扫描单元串行移入,然后同标准数据进行比较,就能够知道芯片性能的好坏。
(4) 在系统可编程(ISP)in-system programmable)
指的是对器件、电路板或整个电子系统的逻辑功能可随时进行修改或重构的能力。
三、第三章
1. Quartus II设计开发流程 (P56)
(1) 设计输入:包括原理图输入、HDL文本输入、EDIF网表输
入、波形输入
(2) 编译:先根据设计要求设定编译方式和编译策略,如器件
的选择,逻辑综合方法的选择。然后根据设定的参数和策
略对设计项目进行网表提取、逻辑综合、器件适配,并产
生报告文件、延时信息文件及编程文件,供分析、仿真编
程使用。
(3) 仿真:用以验证设计项目的逻辑功能和时序关系是否正确
(4) 编程与验证:用得到的编程文件通过编程电缆配置PLD,
加入实际激励,进行在线测试。
2. 时序分析
建立时间(tsu):在触发器记时的时钟信号已在时钟引脚确立之前,通过输入或使能端输入而进入寄存器的数据必须在输入引脚处出现的时间长度
保持时间(th):在触发器记时的时钟信号已在时钟引脚确立之后,通过输入或使能端输入而进入寄存器的数据必须在输入引脚处出现的时间长度
时钟至输出延时(tco):时钟信号在触发寄存器的输入引脚发生转换之后,再由寄存器馈送到信号的输出引脚上取得有效输出所需的时间
引脚至引脚延时(tpd):输入引脚处信号通过组合逻辑进行传输并出现在外部
最大时钟频率(fmax):在不违反内部tsu和th要求下可以达到的最大频率。
延缓时间:
3. 宏模块库
Quartus自带的有Megafunctions\maxplusii\primitives.
Megafunction库是Altera提供的参数化模块库。从功能上看,可以把Megafunction库中的元器件分为:
算术运算模块(arithmetic)\逻辑门模块(gates)\储存模块(storage)\IO模块(I/O)
四、第四章
1. Verilog语言的特点:从C发展而来【简答】
(1) 既适合于可综合的电路设计,也可胜任电路与系统的仿真
(2) 能在多个层次上对所设计的系统加以描述,从开关级、门级、寄存器传输级、行为
级,同时该语言不对设计规模加以限制
(3) 灵活多样的描述风格,包括行为描述和结构描述,支持混合建模,可以在一个设计
中不同模块在不同层次上建模和描述
(4) Verilog的行为描述语句,如条件语句、赋值语句和循环语句等,类似于软件高级
语言,便于学习和使用。
(5) 内置各种基本逻辑门,可以方便进行门级结构描述,内置各种开关级元件,可以进
行开关级建模
(6) 易学易用,功能强,可满足各个层次设计人员的需要。
2. Verilog程序的特点:
(1) Verilog程序由模块构成,没搞个模块的内容嵌在module和endmodule两个关键字
之间;每个模块实现特定功能
(2) 每个模块首先要进行端口定义,并说明输入和输出口,然后对模块的功能进行定义
(3) Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写
(4) 除了endmodule等少数语句外,每个语句最后必须有分号
(5) 可以用/*„„*/和//„„对Verilog程序做注释,以增强程序的可读性和可维护性
3. Verilog模块基本结构:图4.2
(1) 模块声明
(2) 端口定义:端口类型有三种(输入端口、输出端口、输入
输出双向端口)
(3) 信号类型声明(输入端口和双向端口不可以用寄存器型)
(4) 逻辑功能描述
assign语句:一般用于组合逻辑赋值
always语句:既可用于组合电路也可以描述时序电路
元件例化:调用元件的方法类似于在电路图输入方式下调入图形符
号来完成设计,这种方法侧重于电路的结构描述。
/*******************************************************/
module ();
output 输出端口列表; //输出端口声明
input 输入端口列表; //输入端口声明
/*定义数据,信号的类型,函数声明*/
reg 信号名;
//逻辑功能定义
assign =; //使用assign语句定义逻辑功能
//用always块描述逻辑功能
always @ ()
begin
//过程赋值
//if-else,case语句
//while,repeat,for循环语句
//task,function调用
end
//调用其他模块
();
//门元件例化
门元件关键字 ();
endmodule
/****************************************************************/
五、第五章
1. Verilog中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,
但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。
2. Verilog有下面四种基本的逻辑状态。
◆ 0:低电平、逻辑0或逻辑非
◆ 1:高电平、逻辑1或“真”
◆ x或X:不确定或未知的逻辑状态
◆ z或Z:高阻态
3. Verilog中的变量分为如下两种数据类型:◆ net型 ◆ variable型
◆ Net型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持续赋值语句assign对其进行赋值。
wire是最常用的Net型变量,tri跟wire完全一样
◆ variable型变量必须放在过程语句(如initial、always)中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号也必须定义成variable型。
注意:variable型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,variable型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。
4. 在Verilog语言中,用参数parameter来定义符号常量,即用parameter来定义一个标志
符代表一个常量。参数常用来定义时延和变量的宽度。
5. 向量
(1) 标量与向量 宽度为1位的变量称为标量,如果在变量声明中没有指定位宽,则默
认为标量(1位)。
(2) 在表达式中可任意选中向量中的一位或相邻几位,分别称为位选择和域选择
(3) 向量分为:标量类向量、向量类向量。标量类支持位选择域选择,后者不支持。前
者用scalared说明,后者用vectored说明。
(4) 在数字设计中用reg类型阵列构成的存储器在综合时均被综合成存储器宏模块。而
不是真正的RAM\ROM。
6. 运算符
(1) 位拼接运算符
(2) 可用括号()控制运算符的优先级
六、第六章
1. Verilog行为语句包括:过程语句、块语句、赋值语句、条件语句、循环语句、编译指
示语句
2. 过程语句
过程语句包括initial、always。多数过程模块均从属于此。
两者区别:在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化;initial过程块中的语句仅执行一次,always块内的语句则是不断重复执行的;always语句带触发条件,initial不带;always可综合,initial不可综合;两者过程块中均只对reg型变量赋值
3. 块语句
块语句是由块标志符串行块begin-end或并行块fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。
4. 赋值语句
。。。
5. 过程赋值语句
过程赋值语句多用于对reg型变量进行赋值。
(1)非阻塞(non_blocking)赋值方式 赋值符号为“
(2)阻塞(blocking)赋值方式 赋值符号为“=”, 如:b= a;
(3)阻塞赋值与非阻塞赋值的区别:非阻塞赋值语句右端表达式计算完后并不立即赋给左端,而是同时启动下一条语句继续执行,在进程结束时同时赋给左端变量
(4)使用时应当注意的事项:
1) 当用always块描述组合逻辑时,既可以用阻塞赋值,又可以用非阻塞赋值,建议使
用阻塞赋值
2) 设计时序逻辑电路,尽量使用非阻塞赋值
3) 描述锁存器尽量使用非阻塞赋值
4) 若在同一个always过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻
塞赋值
5) 在同一个always过程中,最好不要混合使用阻塞赋值和非阻塞赋值,对同一个变量,
不能既进行阻塞赋值,又进行非阻塞赋值
6) 不能在两个或两个以上的always过程中对同一个变量赋值 7) 仿真时使用
$strobe显示非阻塞赋值的变量
在always过程块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。
6. 任务与函数的区别
7. 顺序执行与并发执行
两个或更多个“always”过程块、“assign”持续赋值语句、实例元件调用等操作都是同时执行的。 在“always”模块内部,其语句如果是非阻塞赋值,也是并发执行的;而如果是阻塞赋值,则语句是按照指定的顺序执行的,语句的书写顺序对程序的执行结果有着直接的影响。 module serial1(q,a,clk); output q,a; input clk; reg q,a; always @(posedge clk) begin q=~q; a=~q; end endmodule
七、第七章
1. Verilog HDL 是一种能够在多个层级对数字系统进行描述的语言,verilog HDL 模型可以
是实际电路不同级别的抽象。这些抽象级别可分为5级
(1) 系统级(system level)
(2) 算法级(algorithm level)
(3) 寄存器传输级 (RTL, Register Transfer Level )
(4) 门级 (Gate Level)
(5) 开关级 (Switch level)
2. Verilog HDL 允许设计者用三种方式来描述逻辑电路:
结构描述(structural)
行为描述(behavioural)
数据流描述(data flow)
(1) 结构描述方式,就是指在设计中,通过调用库中的元件或是以设计好的模块来完成设计实体功能的描述。
(2)
行为描述,就是对设计实体的数学模型的描述,其抽象程度远高于结构描述,无须
知道具体电路的结构,只要描述清楚输入与输出信号的行为
可综合的verilog行为描述方式多采用always过程语句实现,这种行为描述既适合
于设计时序逻辑电路,也适合于设计组合逻辑电路。
采用行为描述方式时注意以下几点
1 用行为描述方式设计电路,可以降低设计难度。行为描述只需表示输入与输出之间的关系,不需要包含任何结构方面的信息。
2 设计者只需写出源程序,而挑选电路方案的工作由EDA软件自动完成,最终选取的电路的优化程度,往往取决与综合软件的技术水平和器件的支持能力。可能最终选取得电路方案所耗用的器件资源并非是最少的。
3 在电路规模较大或者需要描述复杂的逻辑关系时,应首先考虑用行为描述方式设计电路,如果设计的结果不能满足资源耗用的要求,则应改变描述方式。
(3) 数据流描述方式主要使用持续赋值语句,多用于描述组合逻辑电路。用数据流描述
方式设计电路与用传统的逻辑方程设计电路很相似。
3. 采用的描述级别越高,设计越容易:对综合器而言,行为级的描述为综合器的优化提供
了更大的空间,较之门级结构描述更能发挥综合器的性能,所以在电路设计中,除非一些关键路径的设计采用门级结构描述外,一般更多地采用行为建模方式。
4. 简易微处理器
(1) 代码
(2)测试代码
5. 同步双端口8*128FIFO
八、第八章
有限状态机(Finite State Machine, FSM)是时序电路设计中经常采用的一种方式,尤其适于设计数字系统的控制模块。优点是:具有速度快,结构简单,可靠性高等优点 ,过程明确,适用于控制。
1. 状态机可分为两类:米里型(Mealy)和摩尔型(moore)。摩尔型状态机的输出只用当
前状态的函数,米里型状态机的输出则是当前状态和当前输入的函数 2. 状态机有三种表示方法:状态图(state diagram)、状态表(state table)、流程图 3. 状态机设计中主要包含三个对象:
(1)当前状态 ,或称为现态(current state,cs) (2)下一个状态,或称为次态(Next State,ns) (3)输出逻辑(out logic,ol)
相应的,在用verilog描述有限状态机时,有下面几种描述方式 (1) 用三个过程描述:即现态(cs),次态(ns),输出逻辑(ol)各用一个always过程
描述
(2) 双过程描述(CS+NS,OL双过程描述):使用两个always过程来描述有限状态机,
一个过程描述现态和次态时序逻辑(CS+NS);另一个过程描述输出逻辑(OL)
(3) 双过程描述(CS,NS+OL双过程描述);一个过程用来描述现态(CS);另一个过程
描述次态和输出逻辑(NS+OL).
(4) 单过程描述:在但过程描述方式中,将状态机现态。次态,和输出逻辑(CS+NS+OL)
放在一个always过程中进行描述。
4. 101序列检测器 (1)三过程
module fsm1_seq101(clk,clr,x,z);
input clk,clr,x; output reg z; reg[1:0] state,next_state; parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;
/*状态编码,采用格雷(Gray)编码方式*/
always @(posedge clk or posedge clr) /*该过程定义当前状态*/ begin if(clr) state
always @(state or x) /*该过程定义次态*/ begin
case (state) S0:begin if(x) next_state
default: next_state
end
always @(state) begin case(state) S3: z=1'b1; default:z=1'b0; endcase end
endmodule (2)CS,NS+OL
/*该过程产生输出逻辑*/
(3)单过程
module fsm4_seq101(clk,clr,x,z);
input clk,clr,x; output reg z; reg[1:0] state;
parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;
/*状态编码,采用格雷(Gray)编码方式*/ always @(posedge clk or posedge clr)
Begin if(clr) state
end S3:begin if(x) begin state
default:begin state
endmodule 5. 状态编码
一位热码的特点:虽然多用触发器,但可以有效节省和简化译码电路。对于FPGA器件来说,采用一位热码可有效提高电路的速度和可靠性,也有利于提高资源利用率。 6. 状态机的复位
状态机一般都应设计为同步方式,并有一个时钟信号来触发。实用的状态机都应该设计为由唯一时钟边沿触发的同步运行方式。时钟信号和复位信号对每一个有限状态机来说都是很重要的。
同步复位型号在时钟的跳变沿到来时,对有限状态机进行复位操作,同时把复位值赋给输出信号并使用有限状态机回到起始状态。
在描述带同步复位有限状态机时,对同步复位信号进行判断的if语句中,如果不指定输出信号的值,那么输出信号将保持原来的值不变。这种情况会需要额外的寄存器来保持原值,从而增加了资源耗用,因此应该在if语句中指定输出信号的值。有时可以指定在复位时输出信号的值是任意值,这样在逻辑综合时会忽略它们。
如果只需要在上电和系统错误时进行复位操作,
那么采用异步复位方式要比同步复位方式好。
这样做的主要原因是;同步复位方式占用较多的额外资源,而异步复位可以消除引入额外寄存器的可能性;而且带有异步复位信号的verilog语言描述简单,只需要描述状态寄存器的过程中引入异步复位信号即可。 7. 多余状态的处理
(1) 在case语句中用default分支决定如果进入无效状态所采用的措施 (2) 编写必要的verilog源代码明确定义进入无效状态所采取的行为。 8. 状态机AD采用控制电路
九、第九章
流水线加法器与后面重复
十、第十章
1. 用FPGA/CPLD器件实现的设计中,综合就是将Verilog或VHDL语言描述的行为级或功
能级电路模型转化为RTL级功能块或门级电路网表的过程
2. 可综合的设计中应注意
(1)不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循环语句,如forever,while等。
(2) 应尽量采用同步方式设计电路。除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (3) 用always过程块描述组合逻辑,应在敏感信号列表中列出块中出现的所有输入信号。 (4) 所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位,用器件的全局时钟端作为系统外部时钟输入端。 (5) 在Verilog模块中,任务(task)通常被综合成组合逻辑的形式;每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。 3. 流水线技术
流水线加法器好处:工作速度快,在逻辑电路中加入若干寄存器来暂存中间结果,虽然多用了一些寄存器资源,但减小了每一级的电路的时延,提高整个加法器的运行频率。 为了保证数据吞吐率,电路设计中的一个主要问题是要维持系统时钟的速度处于或高于某一频率,如果延时路径较长,就必须在组合逻辑间插入触发器 流水线设计技术使用情形:在某些复杂逻辑功能的完成需要较长延时就会使得系统难以运行在高的频率上,这时可使用流水线设计技术 流水线设计技术的好处:在长延时的逻辑功能块中插入触发器,使得复杂的逻辑操作分步完成,减小每个部分的延时,从而是系统的运行频率得以提高 流水线技术的缺点:增加了寄存器逻辑,即增加量芯片资源的耗用
4. 流水线加法器 (1) 2
级
module adder_pipe2(cout,sum,ina,inb,cin,clk); input[7:0] ina,inb; input cin,clk; output reg[7:0] sum; output reg cout;
reg[3:0] tempa,tempb,firsts; reg firstc; always @(posedge clk)
begin {firstc,firsts}=ina[3:0]+inb[3:0]+cin; tempa=ina[7:4]; tempb=inb[7:4]; end
always @(posedge clk)
begin {cout,sum[7:4]}=tempa+tempb+firstc; sum[3:0]=firsts; end
endmodule
(2) 4级
module pipeline(cout,sum,ina,inb,cin,clk); output[7:0] sum;output cout;
input[7:0] ina,inb;input cin,clk; reg[7:0] tempa,tempb,sum; reg tempci,firstco,secondco,thirdco, cout; reg[1:0] firsts, thirda,thirdb;
reg[3:0] seconda, secondb, seconds; reg[5:0] firsta, firstb, thirds; always @(posedge clk)
begin tempa=ina; tempb=inb; tempci=cin; end //输入数据缓存 always @(posedge clk)
begin {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci; //第一级加(低2位) firsta=tempa[7:2]; firstb=tempb[7:2]; //未参加计算的数据缓存
end
always @(posedge clk)
begin {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts}; seconda=firsta[5:2]; secondb=firstb[5:2]; //数据缓存 end
always @(posedge clk)
begin {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}; thirda=seconda[3:2];thirdb=secondb[3:2]; //数据缓存 end
always @(posedge clk) begin
{cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds}; //第四级加(高两位相加) end endmodule
5. 过程
6. Always语句的特点:
(1) always过程只有两种状态,即执行状态和等待状态,是否进入执行状态取决于是否
满足特定的条件
(2) 不同的always过程是并发执行的:always过程、assign持续赋值、元件例化等操作
都是同时执行,在程序中的书写位置并不影响执行结果
7. 在用ALWAYS进行数字系统设计的时候应注意
将组合逻辑实现的电路和用时序逻辑实现的电路应尽量分配到不同的always过程中。 一个always过程中只允许描述对应于一个时钟信号的同步时序逻辑。
always过程必须由敏感信号的变化来启动,因此应精心选择进程敏感表达式中的敏
感变量。
多个always过程间可通过信号线进行通信和协调。
十一、 第十一章
仿真:对所设计电路系统的一种检测方法
1. 输出控制类系统任务:$display $write $monitor(实时监控器,只要输出变量列表中
的任何变量发生变化,系统则按照该语句所规定的格式将结果输出一次) $strobe(选通监控器,只有模拟时间发生变化时,并且所有的时间都已处理完毕后才能将结果输出) 2. 显示仿真时间标度的系统函数:$time $realtime(两个函数被调用时,都返回当前时
刻距离仿真开始时刻的时间量值,不同的是$time以64位整数值的形式返回模拟时间,$realtime以实数型数据返回模拟时间)
3. 对仿真过程进行控制的系统任务:$finish(结束仿真) $stop (中断仿真)
4. 文件读\写控制的系统任务:$readmemh(读取十六进制数据) $readmemb(读取二
进制数据)
5. 产生随机数据的系统函数:$random(每次调用该函数将返回一个32位随机数,是一
个带符号的整数)
6. 文件输入类系统任务:$fopen $fclose $fwrite $fmonitor $fstrobe $fdisplay 7. 延时:门延时(从门输入端发生变化到输出端发生变化的延迟时间)、assign赋值延时
(等号右端某个值发生变化到等号左端发生相应变化的延迟时间)、连线延时(信号在连线上传输的延时)
8. 测试平台:为测试或仿真一个Verilog HDL程序搭建一个平台,给被测试的模块施加激
励信号,通过观察被测试模块的输出响应,从而判断其逻辑功能和时序关系是否正确
9. 测试模块特点:
(1) 测试模块只有模块名字,没有端口列表
(2) 输入信号(激励信号)必须定义为reg型,以保持信号值,输出信号必须定义为wire
型
(3) 一般用initial、always过程快来定义激励信号波形,使用系统任务和系统函数定义输
出显示格式