当前位置:文档之家› Verilog语言的特点

Verilog语言的特点

Verilog语言的特点
Verilog语言的特点

一、第一章

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

//调用其他模块

<调用模块名module_name > <例化模块名> (<端口列表port_list >);

//门元件例化

门元件关键字<例化门元件名> (<端口列表port_list>);

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)赋值方式赋值符号为“<=”,如:b<= a;

(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<=S0; //异步复位,s0为起始状态

else state<=next_state;

end

always @(state or x) /*该过程定义次态*/

begin

case (state)

S0:begin if(x) next_state<=S1;

else next_state<=S0; end

S1:begin if(x) next_state<=S1;

else next_state<=S2; end

S2:begin

if(x) next_state<=S3;

else next_state<=S0; end

S3:begin if(x) next_state<=S1;

else next_state<=S2; end

default: next_state<=S0; /*default语句*/

endcase

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<=S0; //异步复位,s0为起始状态else case(state)

S0:begin if(x) begin state<=S1; z=1'b0;end

else begin state<=S0; z=1'b0;end

end

S1:begin if(x) begin state<=S1; z=1'b0;end

else begin state<=S2; z=1'b0;end

end

S2:begin if(x) begin state<=S3; z=1'b0;end

else begin state<=S0; z=1'b0;end

end

S3:begin if(x) begin state<=S1; z=1'b1;end

else begin state<=S2; z=1'b1;end

end

default:begin state<=S0; z=1'b0;end /*default语句*/

endcase

end

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过程快来定义激励信号波形,使用系统任务和系统函数定义输出显示格式

Verilog编码风格

Verilog编码风格 嵌入式开发2010-05-03 15:28:13 阅读14 评论0 字号:大中小订阅 这是以前公司的对fpga代码编写的要求 良好代码编写风格的通则概括如下: (1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀; (5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等; (11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性; (13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心 2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:

VerilogHDL经典程序非常适合新手

一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0; 2'b01:y=i1; 2'b10:y=i2; 2'b11:y=i3; default:y=0; 一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0;

Verilog语言基础知识

Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例一个8位全加器的Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; @ assign {cout,sum}=ina+inb+cin; 模块的端口声明了模块的输人和输出口。其格式如下: module 模块名(口1,口2,口3,口4,……); 2.模块内容 模块内容包括I/O说明,信号类型声明和功能定义。 (1) I/O说明的格式如下: ; 输人口: input端口名1,端口名2,……端口名N; 输出口: output端口名l,端口名2,……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portl,input port2,…output portl,output port2,…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 ( reg[7:0] out; 数字 (1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 ) 完整的数字表达式为: <位宽>'<进制> <数字>, 位宽为对应二迸制数的宽度,如: 8'b nets型变量wire nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表。 这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下: & ⑴.定义宽度为1位的变量: wire 数据名1,数据名2,……数据名n; 例如:wire a,b; register型变量reg register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register

verilog语言的综合与不可综合

Verilog的综合与不可综合 综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。 一、基本 Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。 二:verilog语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。 过程性赋值语句中的任何延时在综合时都将忽略。 建议同一个变量单一地使用阻塞或者非阻塞赋值。 3、逻辑操作符: 逻辑操作符对应于硬件中已有的逻辑门 4、算术操作符: Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 5、进位: 通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如: Wire [3:0] A,B; Wire [4:0] C; Assign C=A+B; C的最高位用来存放进位。 6、关系运算符: 关系运算符:<,>,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

Verilog的135个经典设计实例

【例3.1】4位全加器 module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule 【例3.2】4位计数器 module count4(out,reset,clk); output[3:0] out; input reset,clk; reg[3:0] out; always @(posedge clk) begin if (reset) out<=0; //同步复位 else out<=out+1; //计数 end endmodule 【例3.3】4位全加器的仿真程序 `timescale 1ns/1ns `include "adder4.v" module adder_tp; //测试模块的名字 reg[3:0] a,b; //测试输入信号定义为reg型 reg cin; wire[3:0] sum; //测试输出信号定义为wire型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); //调用测试对象 always #5 cin=~cin; //设定cin的取值 initial begin a=0;b=0;cin=0; for(i=1;i<16;i=i+1) #10 a=i; //设定a的取值 end - 1 -

initial begin for(j=1;j<16;j=j+1) #10 b=j; //设定b的取值 end initial//定义结果显示格式 begin $monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum); #160 $finish; end endmodule 【例3.4】4位计数器的仿真程序 `timescale 1ns/1ns `include "count4.v" module coun4_tp; reg clk,reset; //测试输入信号定义为reg型 wire[3:0] out; //测试输出信号定义为wire型 parameter DELY=100; count4 mycount(out,reset,clk); //调用测试对象 always #(DELY/2) clk = ~clk; //产生时钟波形 initial begin//激励信号定义 clk =0; reset=0; #DELY reset=1; #DELY reset=0; #(DELY*20) $finish; end //定义结果显示格式 initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out); endmodule 【例3.5】“与-或-非”门电路 module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,D output F; //模块的输出端口为F - 2 -

Verilog语言的特点

一、第一章 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)硬核:以版图形式实现的设计模块,基于一定的设计工艺。供设计的最终阶段产品: 掩膜。

VHDL语言的主要描述语句

VHDL语言的主要描述语句 按照语句的执行顺序对VHDL语言进行分类,包含两类语句: 并行描述语句该语句的执行与书写顺序无关,总是同时被执行 顺序描述语句从仿真的角度,该语句是顺序执行的 进程语句(PROCESS)是最典型的并行语句,一个构造体内可以有几个进程语句同时存在,而且并发执行。但是进程内部的所有语句都是顺序语句。 一、顺序描述语句 顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。如下分别介绍有关的顺序描述语句. 1.WAIT语句 进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程. 等待语句的格式: *WAIT 无限等待 *WAIT ON 敏感信号变化 *WAIT UNTIL 条件满足 *WAIT FOR 时间到 (1)WAIT ON 格式:WAIT ON 信号[,信号] 例5-1 PROCESS(a,b) BEGIN y<=a AND b;

END PROCESS; 该例中的进程与下例中进程相同: 例5-1 PROCESS BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; 例5-2 PROCESS(a,b) BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; (2)WAIT UNTIL 直到条件满足 格式: WAIT UNTIL 布尔表达式 当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.例: WAIT UNTIL ((x*10)<100) (3)WAIT FOR等到时间到 格式: WAIT FOR 时间表达式 当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.例: WAIT FOR 20 ns; WAIT FOR (a*(b+c);

Verilog程序例子

modul e and1(a, b, c); input a; input b; output c; assign c = a & b; endmodul e `timescale 1ns/1ns modul e t; reg a; reg b; wire c; and1 t(a,b,c); initial begin a=0; b=0; #100 a = 1; b = 0; #100 a = 0; b = 1; #100 a = 0; b = 0; #100 a = 1; b = 1; #100 $stop;

end initial $monitor("a = %d, ", a, " b = %d, ", b, "c = %d\n", c); endmodul e modul e add(a, b, in, c, out); input a; input b; input in; output c; output out; assign {out, c} = a + b + in; endmodul e `timescal e 1ns/1ns modul e count_t; reg clk; reg a; reg b; reg in; wire c; wire out; ad d process(a, b, in, c, out);

initial clk = 0; always forever #5 clk = ~clk; initial begin a = 0; b = 0; in = 0; #10 a = 0; b = 0; in = 1; #10 a = 0; b = 1; in = 0; #10 a = 0; b = 1; in = 1; #10 a = 1; b = 0; in = 0; #10 a = 1; b = 0; in = 1; #10 a = 1; b = 1; in = 0; #10 a = 1; b = 1; in = 1; end initial begin #200 $finish; end initial $monitor(" out = %d, c = %d\n", out, c); endmodul e modul e compare (equal, a, b); input a,b; output equal; assign equal= (a==b)?1:0; endmodul e `timescal e 1ns/1ns modul e t; reg a, b; wire equal; initial begin a=0; b=0; #100 a = 1; b = 0;

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

verilog语言编写8位全加器

8位全加器 一、实验目的 用verilog语言编写一个8位全加器,并在modelsim软件上进行仿真。 二、代码 1、源代码: module add8(sum,cout,in1,in2,cin); input [7:0] in1,in2; input cin; output [7:0] sum; output cout; assign {cout,sum}=in1+in2+cin; endmodule 2、激励: `timescale 1ns/100ps module add8_tb; reg[7:0] A,B; reg CIN; wire [7:0] SUM; wire COUT; add8 ul( .sum(SUM), .cout(COUT), .in1(A), .in2(B), .cin(CIN)

); initial begin A=8'd0;B=8'd0;CIN=1'b0; #10 A=8'd20;B=8'd129;CIN=1'b1; #10 A=8'd27;B=8'd19;CIN=1'b0; #10 A=8'd157;B=8'd29;CIN=1'b0; #10 A=8'd37;B=8'd68;CIN=1'b0; #10 A=8'd11;B=8'd69;CIN=1'b0; #10 A=8'd54;B=8'd67;CIN=1'b1; #10 A=8'd211;B=8'd0;CIN=1'b0; #10 A=8'd87;B=8'd43;CIN=1'b1; #10 A=8'd23;B=8'd171;CIN=1'b0; #10 A=8'd12;B=8'd12;CIN=1'b1; #10 A=8'd112;B=8'd115;CIN=1'b0; end endmodule 三、实验过程 1、上机过程 2、仿真波形 3、波形说明 波形图中,从上至下依次为:输入加数A、输入加数B、输入进位CIN、输出进位COUT、输出和SUM。该程序实现的是A+B+CIN=SUM+COUT。 0+0+0=0; 20+129+1=150;

Verilog的150个经典设计实例

module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule 【例3.2】4位计数器 module count4(out,reset,clk); output[3:0] out; input reset,clk; reg[3:0] out; always @(posedge clk) begin if (reset) out<=0; //同步复位 else out<=out+1; //计数 end endmodule 【例3.3】4位全加器的仿真程序 `timescale 1ns/1ns `include "adder4.v" module adder_tp; //测试模块的名字 reg[3:0] a,b; //测试输入信号定义为reg型 reg cin; wire[3:0] sum; //测试输出信号定义为wire型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); //调用测试对象 always #5 cin=~cin; //设定cin的取值 initial begin a=0;b=0;cin=0; for(i=1;i<16;i=i+1) #10 a=i; //设定a的取值 end - 1 -

initial begin for(j=1;j<16;j=j+1) #10 b=j; //设定b的取值 end initial//定义结果显示格式 begin $monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum); #160 $finish; end endmodule 【例3.4】4位计数器的仿真程序 `timescale 1ns/1ns `include "count4.v" module coun4_tp; reg clk,reset; //测试输入信号定义为reg型 wire[3:0] out; //测试输出信号定义为wire型 parameter DELY=100; count4 mycount(out,reset,clk); //调用测试对象 always #(DELY/2) clk = ~clk; //产生时钟波形 initial begin//激励信号定义 clk =0; reset=0; #DELY reset=1; #DELY reset=0; #(DELY*20) $finish; end //定义结果显示格式 initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out); endmodule 【例3.5】“与-或-非”门电路 module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,D output F; //模块的输出端口为F - 2 -

VHDL经典教程(精简快速入门版)

3 VHDL语言 VHDL: VHSIC Hardware Description Language. 3.1 VHDL语言基础 3.2 VHDL基本结构 3.3 VHDL语句 3.4 状态机在VHDL中的实现 3.5 常用电路VHDL程序 3.6 VHDL仿真 3.7 VHDL综合

HDL----Hardware Description Language 一种用于描述数字电路的功能或行为的语言。目的是提为电路设计效率,缩短设计周期,减小设计成本,可在芯片制造前进行有效的仿真和错误检测。 优点: HDL设计的电路能获得非常抽象级的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工艺。 HDL设计的电路,在设计的前期,就可以完成电路的功能级的验证。HDL设计的电路类似于计算机编程。 常用的HDL语言:VHDL 、Verilog HDL

?VHDL 是美国国防部在20世纪80年代初为实现其高速集成电路硬件VHSIC 计划提出的描述语言; ?IEEE 从1986年开始致力于VHDL 标准化工作,融合了其它 ASIC 芯片制造商开发的硬件描述语言的优点,于93年形成了标 准版本(IEEE.std_1164)。 ?1995年,我国国家技术监督局推荐VHDL 做为电子设计自动化硬件描述语言的国家标准。 VHDL 概述: VHDL VHSIC Hardwarter Description Language Very High speed integrated circuit VHSIC

VHDL优点: ?覆盖面广,系统硬件描述能力强,是一个多层次的硬件描述语言; ?VHDL语言具有良好的可读性,既可以被计算机接受,也容易被人们所理解; ?VHDL语言可以与工艺无关编程; ?VHDL语言已做为一种IEEE的工业标准,便于使用、交流和推广。 VHDL语言的不足之处: 设计的最终实现取决于针对目标器件的编程器,工具的不同会导致综合质量不一样。

verilog实例代码2word版本

v e r i l o g实例代码2

//与门 module zxhand2(c,a,b); input a,b; output c; assign c= a & b; endmodule //或门 module zxhor2(c,a,b); input a,b; output c; assign c= a | b; endmodule //非门 module zxhnot2(c,b); input b; output c; assign c=~ b; endmodule ////异或门 module zxhxro2(c,a,b); input b; output c; assign c=a ^ b; endmodule 两选一电路 module data_scan(d0,d1,sel,q); output q; input d0,d1,sel; wire t1,t2,t3; n1 zxhand2(t1,d0,sel); n2 zxhnot2 (t4,sel); n3 zxhand2(t2,d1,t4); n4 zxhor2(t3,t1,t2); assign q=t1;

endmodule verilog HDL实例(一) 练习一.简单的组合逻辑设计 目的: 掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign结构。注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: //--------------- compare.v ----------------- module compare(equal,a,b); input a,b; output equal; assign equal=(a==b)?1:0; //a等于b时,equal输出为1;a不等于b时, //equal输出为0。 endmodule 测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。 测试模块源代码: `timescale 1ns/1ns //定义时间单位。 module comparetest; reg a,b; wire equal; initial //initial常用于仿真时信号的给出。 begin a=0; b=0; #100 a=0; b=1; #100 a=1; b=1; #100 a=1; b=0; #100 $stop; //系统任务,暂停仿真以便观察仿真波形。 end compare compare1(.equal(equal),.a(a),.b(b)); //调用模块。 Endmodule

最新整理Systemverilog语言简介.doc

SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-20 xx Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilo g在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Acceller a开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。 1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。接口在关键字interface和endinterface之间定义,它独立于模块。接口在模块中就像一个单一的端口一样使用。在最简单的形式下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。下面是一个接口的使用实例:interface chip_bus; // 定义接口 wire read_request, read_grant; wire [7:0] address, data; endinterface: chip_bus module RAM (chip_bus io, // 使用接口 input clk); // 可以使用io.read_request引用接口中的一个信号 endmodule module CPU(chip_bus io, input clk); ...

verilog常用例子

2.6.1 Verilog基本模块 1.触发器的Verilog实现 时序电路是高速电路的主要应用类型,其特点是任意时刻电路产生的稳定输出不仅与当前的输入有关,而且还与电路过去时刻的输入有关。时序电路的基本单元就是触发器。下面介绍几种常见同步触发器的Verilog 实现。 同步RS触发器 RS触发器分为同步触发器和异步触发器,二者的区别在于同步触发器有一个时钟端clk,只有在时钟端的信号上升(正触发)或下降(负触发)时,触发器的输出才会发生变化。下面以正触发为例,给出其Verilog 代码实现。 例2-15 正触发型同步RS触发器的Verilog实现。 module sy_rs_ff (clk, r, s, q, qb); input clk, r, s; output q, qb; reg q; assign qb = ~ q; always @(posedge clk) begin case({r, s}) 2'b00: q <= 0; 2'b01: q <= 1; 2'b10: q <= 0; 2'b11: q <= 1'bx; endcase end endmodule 上述程序经过综合Synplify Pro后,其RTL级结构如图2-2所示。 图2-2 同步RS触发器的RTL结构图 在ModelSim 6.2b中完成仿真,其结果如图2-3所示

图2-3 同步RS触发器的仿真结果示意图 同步T触发器 T触发器也分为同步触发器和异步触发器,二者的区别在于同步T触发器多了一个时钟端。同步T触发器的逻辑功能为:当时钟clk沿到来时,如果T=0,则触发器状态保持不变;否则,触发器输出端反转。R 为复位端,当其为高电平时,输出Q与时钟无关,Q=0。 例2-16 同步T触发器的Verilog实现。 module sy_t_ff(clk, r, t, q, qb); input clk, r, t; output q, qb; reg q; assign qb = ~q; always @(posedge clk) begin if(r) q <= 0; else q <= ~q; end endmodule 上述程序经过综合Synplify Pro后,其RTL级结构如图2-4所示。 图2-4 同步T触发器电路的RTL结构图 在ModelSim 6.2b中完成仿真,其结果如图2-5所示

Verilog语言良好的代码编写格式

Verilog 及VHDL良好的代码编写风格 良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀; (5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用 bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等; (11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性; (13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals;

Verilog实例代码

- 1 - 【例3.1】4位全加器 module adder4(cout,sum,ina,inb,cin); output [3:0] sum; output cout; input [3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule 【例3.2】4位计数器 module count4(out,reset,clk); output [3:0] out; input reset,clk; reg [3:0] out; always @(posedge clk) begin if (reset) out<=0; //同步复位 else out<=out+1; //计数 end endmodule 【例3.3】4位全加器的仿真程序 `timescale 1ns/1ns `include "adder4.v" module adder_tp; //测试模块的名字 reg [3:0] a,b; //测试输入信号定义为reg 型 reg cin; wire [3:0] sum; //测试输出信号定义为wire 型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); //调用测试对象 always #5 cin=~cin; //设定cin 的取值 initial begin a=0;b=0;cin=0; for (i=1;i<16;i=i+1) #10 a=i; //设定a 的取值 end

initial begin for(j=1;j<16;j=j+1) #10 b=j; //设定b的取值 end initial//定义结果显示格式 begin $monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum); #160 $finish; end endmodule 【例3.4】4位计数器的仿真程序 `timescale 1ns/1ns `include "count4.v" module coun4_tp; reg clk,reset; //测试输入信号定义为reg型 wire[3:0] out; //测试输出信号定义为wire型 parameter DELY=100; always #(DELY/2) clk = ~clk; //产生时钟波形 initial begin//激励信号定义 clk =0; reset=0; #DELY reset=1; #DELY reset=0; #(DELY*20) $finish; end //定义结果显示格式 initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out); endmodule 【例3.5】“与-或-非”门电路 module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,D output F; //模块的输出端口为F - 2 -

相关主题
文本预览
相关文档 最新文档