3.2.1 Verilog HDL程序入门[共2页]

合集下载

verilog HDL精简教程

verilog HDL精简教程

VERILOG HDL精简教程什么是verilog HDL?verilog是一种硬件描述语言,可以在算法级、门级到开关级的多种抽象设计层次上对数字系统建模。

它可以描述设计的行为特性、数据流特性、结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。

此外,verilog提供了编程语言接口,通过该接口用户可以在模拟、验证期间从外部访问设计,包括模拟的具体控制和运行。

verilog不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。

因此,用这种语言编写的模型能够使用verilog仿真器进行验证。

verilog从C语言中继承了多种操作符和结构,所以从结构上看两者有很多相似之处。

设计流程:功能设计>用verilog描述电路>软件模拟与仿真>考察结果>逻辑综合>代码下载到硬件电路>完成。

1. 基本机构1.1 模块模块(module)是verilog最基本的概念,也是v设计中的基本单元。

每个v设计的系统都是由若干模块组成的。

A:模块在语言形式上是以关键词module开始,以关键词endmodule结束的一段程序。

B:模块的实际意义是代表硬件电路上的逻辑实体。

C:每个模块都实现特定的功能。

D:模块的描述方式有行为建模和结构建模之分。

E:模块之间是并行运行的。

F:模块是分层的,高层模块通过调用、连接低层模块的实例来实现复杂的功能。

G:各模块连接完成整个系统需要一个顶层模块(Top-module)。

无论多么复杂的系统,总能划分成多个小的功能模块。

因此系统的设计可以按照下面三个步骤进行:(1)把系统划分成模块;(2)规划各模块的接口;(3)对模块编程并连接各模块完成系统设计。

模块的结构是这样的:module <模块名>(<端口列表>);<定义><模块条目>endmodule其中:【模块名】是模块唯一的标识符;【端口列表】是输入、输出和双向端口的列表,这些端口用来与其他模块进行连接。

VerilogHDL基础语法入门

VerilogHDL基础语法入门
可用以下七个系统任务:
1) $dumpfile(“file.dump”); //打开记录数据变化的数据文件
2) $dumpvars();
//选择需要记录的变量
3) $dumpflush; //把记录在数据文件中的资料转送到硬盘保存
4) $dumpoff;
//停止记录数据变化
5) $dumpon;
//重新开始记录数据变化
模块的抽象
技术指标:
用文字表示 用算法表示 用高级行为的Verilog模块表示
RTL/功能级:
用可综合的Verilog模块表示
门级/结构级:
用实例引用的Verilog模块表示
版图布局/物理级:
用几何形状来表示
行为综合 综合前仿真
逻辑综合
综合后仿真 布局布线
第三部分.简单的 Verilog HDL 模块
转换为门级电路互连的电路结构(综合)。 ▪ 需要对已经转换为门级电路结构的逻辑
进行测试(门级电路仿真)。 ▪ 需要对布局布线后的电路结构进行测试。
(布局布线后仿真)。
模块的测试
激励和控 制信号
被测模块
输出响应 和验证
模块的测试
测试模块常见的形式:
module t; reg …; //被测模块输入/输出变量类型定义 wire…; //被测模块输入/输出变量类型定义 initial begin …; …; …; end … …//产生测试信号 always #delay begin …; end … …//产生测试信号
▪ Verilog HDL的构造性语句可以精确地建立信号的 模型。这是因为在Verilog HDL中,提供了延迟和输出 强度的原语来建立精确程度很高的信号模型。信号值 可以有不同的的强度,可以通过设定宽范围的模糊值 来降低不确定条件的影响。

VerilogHDL语言基础学习教案课件

VerilogHDL语言基础学习教案课件
按运算符所带操作数的个数来区分,可分为3类: 单 目 运 算 符 (unaryoperator) : 带 一 个 操 作 数 。
o双目运算符(binaryoperator):带两个操作数。 三目运算符(ternaryoperator):带三个操作数。
第27页/共69页
27
第28页/共69页
28
第29页/共69页
格式: assign 连线型变量名=赋值表达式; 持续赋值语句是并发执行的,每条持续赋值语句对应着独 立的逻辑电路,它们的执行顺序与其在描述中的顺序无关。
第51页/共69页
51
第52页/共69页
52
第53页/共69页
53
第54页/共69页
54
4.3.模块的行为描述方式
第20页/共69页
20
wire型数据
用 来 表 示用 assign 语 句 赋 值 的 组 合 逻辑 信 号 。 Verilog HDL模块输入输出端口信号类型说明缺省时,自动定义为wire 型。
wire型变量可以用作任何表达时的输入,也可用作assign 语句、元件调用语句和模块调用语句的输出。
4.1 什么是Verilog HDL?
Verilog HDL 是 目 前 应 用 最 为 广 泛 的 硬 件 描 述 语 言 。 Verilog HDL可以用来进行各种层次的逻辑设计,也可以进行 数字系统的逻辑综合,仿真验证和时序分析等。
Verilog HDL适合算法级,寄存器级,逻辑级,开关级、 系统级和版图级等各个层次的设计和描述。
通过一个例子认识Verilog HDL的3种建模方式,图中电路 实现的功能是,当sel=0时,out=a;当sel=1时,out=b。
第40页/共69页

VerilogHDL基础语法ppt课件

VerilogHDL基础语法ppt课件
留意:
一切的关键字都必需小写。
定义为reg型的线网不一定会生成存放器。
虽然信号和内部变量定义声明只需出如今被调用的语句之前就行 ,可是代码风格普通要求在执行语句之前就定义好,这样可以提 高代码的可读性。
在声明后,便是功能执行语句,功能执行语句包括always语句、 initial语句、assign语句、task、function、模块例化等等。可以混 合描画,没有先后顺序,但是要留意的是initial语句只能用于仿真 程序中,不能生成实践的电路。
时序性:Verilog言语可以用来描画过去的时间和相应发生的事件 ;而软件言语那么做不到。
互连:互连是硬件系统中的一个根本概念,Verilog言语中的wire 变量可以很好地表达这样的功能;而软件言语并没有这样的描画 。
3.2 Verilog HDL的描画方式
Verilog HDL采用三种描画方式来进展设计: 数据流描画:采用assign语句,延续赋值,数据实时变化,赋值
//模块功能实现
数据流描画: assign
行为级描画:initial, always
构造化描画: module例化
其他用户原语
endmoduleFra bibliotek例 3–1 端口声明 //Port Declaration input [4:0] a; // 信号名为a的5输入信号 inout b; // 双向信号b output [6:0] c; // 信号名为c的7输出总线信号
存放器型表示数据的存取,在仿真器中会占据一个内存空间。存 放器型也有许多子类型,包括reg、integer、time、real、 realtime等等。用reg可以表示一位或者多位的存放器,也可以表 示存取器。
例 3–5 采用reg表示的存放器和存取器

Verilog HDL基础知识

Verilog HDL基础知识
task time tran tranif0 tranif1
tri tri0 tri1 triand trior trireg unsigned vectored wait wand weak0 weak1 while wire wor xnor xor
第3章 Verilog HDL基础知识
3.2 数 据 类 型
Verilog HDL支持两种形式的注释符:/*……*/与//。其中, /*……*/为多行注释符,用于对多行语句注释;//为单行注释符, 只对注释符所在的行有效。下面是一个使用注释符对1位加法器 进行说明的例子。
第3章 Verilog HDL基础知识
【例3-2】注释符的例子。
/* 该例利用一位加法器来说明单行注释符与多行注释符的
第3章 Verilog HDL基础知识
1. 字符串变量的声明 Verilog HDL中采用寄存器变量来存储字符串,寄存器变量的 位数要大于字符串的最大长度。需要注意的是,Verilog HDL中并 不需要特殊位来存储终止符。 【例3-6】字符串变量的声明。
reg [8*12:1] stringvar; initial
'<base_format><number> 符号“'”为基数格式表示的固有字符,该字符不能省略,否 则为非法表示形式;参数<base_format>用于说明数值采用的进制 格式;参数<number>为相应进制格式下的一串数字。这种格式未 指定位宽,其缺省值至少为32位。
第3章 Verilog HDL基础知识
第3章 Verilog HDL基础知识
module addbit (a,b,ci,sum,co);
input

Verilog HDL入门

Verilog HDL入门

线网型:wire,tri
wor,trior,wand,triand,trireg,tri1,tri0 supply0,supply1
寄存器型:
reg integer,time real,realtime
wire和tri
用于连接单元的连线是最常见的线网类型。 默认值为z。 wire与tri语法和语义一致; 三态线可以用于描述多个驱动源驱动同一根线 的线网类型;并且没有其他特殊的意义。 通常都用wire。 其他线网型用于底层设计与仿真,FPGA设计通 常不会涉及。
简单的Verilog程序
该程序例子通过另一种方法描述了一个三态 门。 在这个例子中存在着两个模块:模块trist1 在这个例子中存在着两个模块:模块trist1 tri_inst。 调用模块 mytri 的实例元件 tri_inst。 是上层模块。 模块 trist1 是上层模块。模块 mytri 则被 称为子模块。 称为子模块。 通过这种结构性模块构造可构成特大型模块 。
例:always @(b or c) always a=b&c;
元件(实)例化
例:and and1(a,b,c); BUFG BUFG_inst ( .O(out), // Clock buffer output .I(in) // Clock buffer input );
注意
三种方式可以在同一个模块之内混合使用 ; 同一个模块内可以有多个always块,多个 assign和多个元件例化。 所有这些单元是并行执行的。 这些单元的书写顺序不影响逻辑功能;
128状态值集合:包含强度信息
其他值集合
整数(32bits) 实数 字符串 时间(64bits) 布尔值(0,1) ……
提纲

第1章 Verilog HDL入门简介

第1章  Verilog HDL入门简介
第1章 Verilog HDL入门简介
Verilog HDL数字系统设计及仿真
数字电路的回忆—七进制计数器
Verilog HDL数字系统设计及仿真
➢状态转换图
➢卡诺图
2
Verilog HDL数字系统设计及仿真
➢ Q3* 的卡诺图
➢状态方程:
Q3* Q3Q2 ' Q3 'Q2Q1
3
Verilog HDL数字系统设计及仿真
8
采用Verilog HDL代码
Verilog HDL数字系统设计及仿真
➢计数器模块
➢JK触发器模块
module
module JK_FF(J,K,CLK,Q,Qn);
Counter(Q3,Q2,Q1,C,CLK); input J,K;
output Q3,Q2,Q1,C;
input CLK;
input CLK;
output Q,Qn;
wire J1,K2,J3;
wire G3_n,G4_n,G5_n,G6_n,G7_n,G8_n;
nand G7(G7_n,Qn,J,CLK);
JK_FF JK1(Q1,Q1n,J1,1,CLK);nand G8(G8_n,CLK,K,Q);
JK_FF JK2(Q2, ,Q1,K2,CLK); nand G5(G5_n,G8_n,G6_n);
nand G1(Q,G3_n,Qn);
or or1(K2,Q1,Q3);
nand G2(Qn,Q,G4_n);
endmodule
not G9(CLK_n,CLK);
endmodule
9
Verilog HDL数字系统设计及仿真
➢更简洁的代码
module Counter(Q,CLK,RESET);

Verilog-HDL基础知识

Verilog-HDL基础知识

Verilog-HDL基础知识第⼆章 Verilog-HDL基础知识1.Verilog-HDL概述1.1 什么是硬件描述语⾔(HDL)HDL:Hardware Description Language硬件描述语⾔HDL是⼀种⽤形式化⽅法描述数字电路和系统的语⾔,可以描述硬件电路的功能、信号连接关系和定时关系。

1.2 使⽤HDL的优点电路的逻辑功能容易理解;便于计算机对逻辑进⾏分析处理;把逻辑设计与具体电路的实现分成两个独⽴的阶段来操作;逻辑设计与实现的⼯艺⽆关;逻辑设计的资源积累可以重复利⽤;可以由多⼈共同更好更快地设计⾮常复杂的逻辑电路(⼏⼗万门以上的逻辑系统)。

1.3 Top_Down设计思想1.4 Verilog-HDL简介1.4.1 Verilog HDL的发展1.4.2 Verilog-HDL与VHDL的⽐较☆ VHDL-VHSIC Hardware Description Language。

VHDL于 1987年成为IEEE标准。

☆ Verilog-HDL简单易学,语法⽐较灵活。

VHDL语法严谨,需要较长的时间学会。

☆ Verilog-HDL在系统抽象⽅⾯⽐VHDL略差,但在门级开关电路描述⽅⾯⽐VHDL强。

1.4.3 Verilog-HDL 的应⽤ASIC和FPGA设计师可⽤它来编写可综合的代码。

描述系统的结构,做⾼层次的仿真。

验证⼯程师编写各种层次的测试模块对具体电路设计⼯程师所设计的模块进⾏全⾯细致的验证。

库模型的设计:可以⽤于描述ASIC 和FPGA的基本单元(Cell)部件,也可以描述复杂的宏单元(Macro Cell)。

1.4.4 Verilog-HDL的抽象级别⽤Verilog-HDL描述的电路设计就是该电路的Verilog HDL模型,这些模型可以是实际电路的不同级别的抽象,这些抽象的级别和它们对应的模型类型共有以下五种:?系统级(system): ⽤⾼级语⾔结构实现设计模块的外部性能的模型。

VerilogHDL入门(可编辑)

VerilogHDL入门(可编辑)

Verilog HDL入门Introduction to Verilog pldcomcnCourse Objectivesn Learn the basic constructs of Verilogn Learn the modeling structure of Verilogn Learn the concept of delays and their effects in simulationpldcomcnCourse OutlinenVerilog Overviewn Basic Structure of a Verilog Modeln Components of a Verilog Module– Ports– Data Types– Assigning Values and Numbers– Operators– Behavioral ModelingContinuous AssignmentsProcedural Blocks– Structural Modelingn Summary Verilog EnvironmentpldcomcnVerilogOverviewpldcomcnWhat is Verilogn IEEE industry standard Hardware DescriptionLanguage HDL - used to describe a digital system n For both Simulation SynthesispldcomcnVerilog Historyn Introduced in 1984 by Gateway Design Automationn 1989 Cadence purchased Gateway Verilog-XLsimulatorn 1990 Cadence released Verilog to the publicn Open Verilog International OVI was formed to control the language specificationsn 1993 OVI released version 20n 1993 IEEE accepted OVI Verilog as a standard Verilog 1364pldcomcnVerilog StructurenVerilog HDL Consists of Keywords syntax andsemantics used to describe hardware functionality and timingn PLI Programming Language Interface provides Clanguage routines used to interact between Verilog and EDA tools SimulatorsWaveform displaysn SDF Standard Delay Format - a file used to back-annotate accurate timing information to simulators and other toolspldcomcnTerminologyn HDL - Hardware Description Language is a softwareprogramming language that is used to model a piece of hardwaren Behavior Modeling - A component is described by itsinputoutput responsen Structural Modeling - A component is described byinterconnecting lower-level componentsprimitives pldcomcnBehavior Modelingn Only the functionality of the circuit no structure n No specific hardware intentn For the purpose of synthesis as well as simulationoutput 1 outputninput 1 inputnif input 1for j 0 j 8 j j25 output 1 1b0elsefor j 1 j 8 j j25 output 1 1b1pldcomcnStructural Modelingn Functionality and structure of the circuitn Call out the specific hardwaren For the purpose of synthesisHigher-level Componentinput1 output 1Lower-levelComponent1Lower-levelComponent1inputnoutputnpldcomcnMore Terminologyn Register Transfer Level RTL - A type of behavioralmodeling for the purpose of synthesis– Hardware is implied or inferred– Synthesizablen Synthesis - Translating HDL to a circuit and thenoptimizing the represented circuitn RTL Synthesis - The process of translating a RTLmodel of hardware into an optimized technologyspecific gate level implementationpldcomcnRTL Synthesisalways a or b or c or d or sel ainferredbegin b mux_outcase sel c2b00 mux_out a d2b01 mux_out b sel2b10 mux_out c 22b11 mux_out dendcaseaTranslationdaOptimization dpldcomcnVerilog vs Other HDL StandardsnVerilog– Tell me how your circuit should behave and I will give youthe hardware that does the jobnVHDL– Similar to VerilognABEL PALASM AHDL– Tell me what hardware you want and I will give it to youpldcomcnVerilog vs Other HDL StandardsnVerilog– Give me a circuit whose output only changes when there isa low-to-high transition on a particular input When thetransition happens make the output equal to the input untilthe next transition–Result Verilog Synthesis provides a positive edge-triggeredflipflopnABEL PALASM AHDL– Give me a D-type flipflop– Result ABEL PALASM AHDL synthesis provides a D-typeflipflop The sense of the clock depends on the synthesistoolpldcomcnTypical Synthesis Design FlowVerilog TechnologyModel LibrarySynthesisCompilerTiming Analysis Netlist PlaceRouteText OutputTestSimulationVectorsWaveformpldcomcnTypical Simulation Design FlowVerilog VerilogModelTestBenchOptionalSimulationCompilerSimulation TestModel VectorsWaveform Verilog Text OutputSimulationpldcomcnVerilogModelingpldcomcnVerilog - Basic Modeling Structuren CASE-sensitvemodule module_name port_list nAll keywords areport declarations lowercasenWhitespace is used fordata type declarations readabilitynSemicolon is thecircuit functionality statement terminatornSingle line commenttiming specifications n Multi-line commentendmodule nTiming specification isfor simulationpldcomcnComponents of a Verilog ModulemoduleTiming SpecificationsPort ListPort Data Type Circuit SubprogramsDeclarations Declarations FunctionalityInstantiation taskinput NetContinuous Procedural functionoutput Register Assignment BlocksSystem Tasksinout parameter assign initialblockCompilerDirectivesalwaysblockpldcomcnComponents of a Verilog Modulemodule Module_name Port_listPort declarations if ports are presentParameters optionalData type declarationsContinuous Assignments assignProcedural Blocks initial andalways- behavioral statementsInstantiation of lower-level modulesTasks and FunctionsTiming SpecificationsendmodulepldcomcnSchematic Representation - MACadder_outoutinaD Qmult_out clkXinbclr CLRNpldcomcnVerilog Model Mulitiplier-Accumulator MACtimescale 1 ns 10 ps assign adder_out mult_out outmodule mult_acc out ina inb clk clr alwaysposedge clk or posedge clrbegininput [70] ina inb if clrinput clk clr out 16h0000output [150] out elseout adder_outwire [150] mult_out adder_out endreg [150] outmulta u1 in_a ina in_b inb m_out mult_outparameter set 10parameter hld 20 specify setup ina posedge clk sethold posedge clk ina hldsetup inb posedge clk sethold posedge clk inb hldendspecifyendmodulepldcomcnLets take a look atmoduleTiming SpecificationsPort ListPort Data Type Circuit SubprogramsDeclarations Declarations FunctionalityInstantiation taskinput NetContinuous Procedural functionoutput Register Assignment BlocksSystem Tasksinout parameter assign initialblock CompilerDirectivesalwaysblockpldcomcnPortsn Port List– A listing of the port names– Examplemodule mult_acc out ina inb clk clr n Port Types– input -- input port– output -- output port– inout -- bidirectional portn Port Declarations–– Exampleinput [70] ina inbinput clk clroutput [150] outpldcomcnPorts List and Declarationtimescale 1 ns 10 ps assign adder_out mult_out outmodule mult_acc out ina inb clk clr always posedge clk or posedge clrbegininput [70] ina inb if clrout 16h0000input clk clr elseoutput [150] out out adder_outendwire [150] mult_out adder_outreg [150] out multa u1 in_aina in_b inb m_out mult_outparameter set 10 specifyparameter hld 20 setup ina posedge clk sethold posedge clk ina hldsetup inb posedge clk sethold posedge clk inb hldendspecify endmodule pldcomcnData Typesn Net Data Type - represent physical interconnect betweenprocesses activity flowsprocess processFunctional Functionalnets nets nets Block BlockMUX Addersnets netsnRegister Data Type - represent variable to store datatemporarily– It does not represent a physical hardware registerTemporary StoragepldcomcnNet Data Typenwire -- represents a nodentri -- represents a tri-state node n Bus Declarations– [MSB LSB ]– [LSB MSB]n Examples– wire– wire [150] mult_out adder_outpldcomcnNet Data TypesSupported byNet Data Type Functionality Synthesiswire tri Used for interconnectsupply0 supply1 Constant logic valuewand triand Used to model ECLwor trior Used to model ECLtri0 tri1 Pull-down Pull-uptrireg Stores last value whennot drivenpldcomcnRegister Data Typesnreg - unsigned variable of any bit size ninteger - signed variable usually 32 bits n Bus Declarations– [MSB LSB ]– [LSB MSB]n Examples– reg– reg [7 0] outpldcomcnRegister Data TypesRegisterSupported byData Type Functionality Synthesisreg Unsigned variable ofany bit sizeinteger Signed variable -usually 32 bitstime Unsigned integer -usually 64 bitsreal Double precisionfloating point variablepldcomcnMemorynTwo dimensional register arrayn Can not be a net typen Examplesreg [310] mem[01023] 1Kx32 reg [310] instrinstr mem[2]n Double-indexing is not permittedinstr mem[2][70] Illegal pldcomcnParametern Parameter - assigning a value to a symbolic nameparameter size 8reg [size-10] a bpldcomcnData Typen Every signal which includes ports must have a datatype– Signals must be explicitly declared in the data type declarations of your module– Ports are by default wire net data types if theyare not explicitly declaredpldcomcnData Types Declarationtimescale 1 ns 10 ps assignadder_out mult_out outmodule mult_acc out ina inb clk clr alwaysposedge clk or posedge clrbegininput [70] ina inb if clrinput clk clr out 16h0000output [150] out elseout adder_outwire [150] mult_out adder_out endreg [150] out multa u1 in_aina in_b inb m_out mult_outparameter set 10 specifyparameter hld 20 setup ina posedge clk sethold posedge clk ina hldsetup inb posedge clk sethold posedge clk inb hldendspecifyendmodule pldcomcnAssigning Values - NumbersandOperatorspldcomcnAssigning Values - NumbersnAre sized or unsized– Sized example 3b010 3-bit wide binary number The prefix 3 indicates the size of number– Unsized example 123 32-bit wide decimal number by defaultDefaults– No specified defaults to decimal–No specified defaults to 32-bit wide numbern Base Format–Decimal d or D 16d255 16-bit wide decimal number– Hexadecimal h or H 8h9a 8-bit wide hexadecimal number– Binary b or B b1010 32-bit wide binary numer– Octal o or O o21 32-bit wide octal numberpldcomcnNumbersn Negative numbers - specified by putting a minus sign beforethe– Legal -8d3 8-bit negative number stored as 2s complement of 3– Illegal 4d-2 ERRORn Special Number Characters– _ underscore used for readabilityExample 32h21_65_bc_fe 32-bit hexadecimal number– x or X unknown valueExample 12h12x 12-bit hexadecimal number LSBs unknown– z or Z high impedance valueExample 1bz 1-bit high impedance numberpldcomcnNumbersn Extended– If MSB is 0 x or z number is extended to fill MSBs with 0 xorz respectivelyExamples 3b01 3b001 3bx1 3bxx1 3bz 3bzzz– If MSB is 1 number is extended to fill MSBs with 0Example 3b1 3b001pldcomcnShort Quizn Short Quiz– Q What is the actual value for 4d017 in binary pldcomcnAnswersn Short Quiz– Q What is the actual value for 4d017 in binary– A 4b0001 MSB is truncated 10001pldcomcnArithmetic OperatorsOperator Operation ExamplesSymbol Performed ain 5 bin 10 cin 2b01 din 2b0ZAdd bin cin 11- Subtract Negate bin - cin 9 -bin -10Multiply ain bin 50Divide bin ain 2Modulus bin ain 0nTreats vectors as a whole valuen If any operand is Z or X then the results are unknown– Example ain din unknownn If results and operands are same size then carry is lostpldcomcnBitwise OperatorsOperator Operation ExamplesSymbol Performed ain 3b101 bin 3b110 cin 3b01XInvert each bit ain is 3b010And each bit ain bin is 3 b100 bin cin is 3b010Or each bit ain bin is 3b111Xor each bit ain bin is 3 b011or Xnor each bit ain bin 3b100n Operates on each bit of the operandn Result is the size of the largest operandn Left-extended if sizes are differentpldcomcnReduction OperatorsOperator Operation ExamplesSymbol Performed ain 5b10101 bin 4b0011cin 3bZ00 din 3bX011And all bits ain 1b0 din 1b0Nand all bits ain 1b1Or all bits ain 1b1 cin 1bXNor all bits ain 1b0Xor all bits ain 1b1or Xnor all bits ain 1b0n Reduces a vector to a single bitnX or Z are considered unkown but result maybe a knownvalue– Example din results in 1b0pldcomcnRelational OperatorsOperator Operation ExamplesSymbol Performed ain 3b010 bin 3b100 cin 3b111。

第2章 Verilog HDL 基础

第2章   Verilog HDL 基础

input cin; output count; output [2:0] sum;
//声明输入进位信号 cin //声明输出进位信号 count //声明输出信号
assign {count,sum}=a+b+cin; endmodule
用“assign”持续赋值语句来 描述三位加法器
2.3.1 模块的概念
为什么要用硬件描述语言来设计?
电路的逻辑功能容易理解; 把逻辑设计与具体电路的实现分成两个独立的阶段来操作; 逻辑设计与实现的工艺无关; 逻辑设计的资源积累可以重复利用;
可以由多人共同更好更快地设计非常复杂的逻辑电路(几十万 门以上的逻辑系统)。
4
2.1 Verilog HDL的简介
有哪几种硬件描述语言?各有什么特点?
调用模块 ……
endmodule
2.3.1 模块的概念
(3) 模块可以根据描述方法的不同定义成行为型或结构型 (或者是二者的组合)。
行为型模块通过传统的编程语言结构定义数字系统(模 块)的状态,如使用if条件语句、赋值语句等。
结构型模块是将数字系统(模块)的状态表达为具有层次 概念的互相连接的子模块。
2.3.1 模块的概念
2. 端口定义
又称“端口声明语句”,用来进行端口方向的说明。
Verilog语言中有如下三种端口声明语句: 1)input——对应的端口是输入端口 2 )output——对应的端口是输出端口 3 )inout——对应的端口是双向端口
module
input
output inout
2.1 Verilog HDL的简介
Verilog HDL提供了扩展的建模能力,其中许多扩展最初 很难理解,但是Verilog HDL的核心子集非常易于学习和使用, 这对大多数建模应用来说已经足够。完整的硬件描述语言可 以对从最复杂的芯片到完整的电子系统进行描述,主要特点 如下:

Verilog HDL 程序设计教程

Verilog HDL 程序设计教程

《Verilog HDL 程序设计教程》代码例子- 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)beginif (reset) out<=0; //同步复位else out<=out+1; //计数endendmodule【例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 的取值initialbegina=0;b=0;cin=0;for(i=1;i<16;i=i+1)#10 a=i; //设定a 的取值end程序文本- 2 -initialbeginfor(j=1;j<16;j=j+1)#10 b=j; //设定b 的取值initial //定义结果显示格式begin$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum); #160 $finish;endendmodule【例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; //产生时钟波形initialbegin //激励信号定义clk =0; reset=0;#DELY reset=1;#DELY reset=0;#(DELY*20) $finish;//定义结果显示格式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,Doutput F; //模块的输出端口为F王金明:《Verilog HDL 程序设计教程》- 3 -wire A,B,C,D,F; //定义信号的数据类型assign F= ~((A&B)|(C&D)); //逻辑功能描述endmodule【例5.1】用case 语句描述的4 选1 数据选择器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;endcaseendmodule【例5.2】同步置数、同步清零的计数器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 上升沿触发beginif (!reset) out = 8'h00; //同步清0,低电平有效else if (load) out = data; //同步预置else out = out + 1; //计数endendmodule【例5.3】用always 过程语句描述的简单算术逻辑单元`define add 3'd0`define minus 3'd1`define band 3'd2`define bor 3'd3`define bnot 3'd4程序文本- 4 -module alu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode; //操作码input[7:0] a,b; //操作数always@(opcode or a or b) //电平敏感的always 块begincase(opcode)`add: out = a+b; //加操作`minus: out = a-b; //减操作`band: out = a&b; //求与`bor: out = a|b; //求或`bnot: out=~a; //求反default: out=8'hx; //未收到指令时,输出任意态endcaseendendmodule【例5.4】用initial 过程语句对测试变量A、B、C 赋值`timescale 1ns/1nsmodule test;reg A,B,C;initialbeginA = 0;B = 1;C = 0;#50 A = 1; B = 0;#50 A = 0; C = 1;#50 B = 1;#50 B = 0; C = 0;#50 $finish ;endendmodule【例5.5】用begin-end 串行块产生信号波形`timescale 10ns/1nsmodule wave1;reg wave;parameter cycle=10;initialbegin王金明:《Verilog HDL 程序设计教程》- 5 -wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) $finish ;endinitial $monitor($time,,,"wave=%b",wave); endmodule【例5.6】用fork-join 并行块产生信号波形`timescale 10ns/1nsmodule wave2;reg wave;parameter cycle=5;initialforkwave=0;#(cycle) wave=1;#(2*cycle) wave=0;#(3*cycle) wave=1;#(4*cycle) wave=0;#(5*cycle) wave=1;#(6*cycle) $finish;joininitial $monitor($time,,,"wave=%b",wave); endmodule【例5.7】持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel 为0,则out=a ;否则out=b endmodule【例5.8】阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);input a,b,sel;程序文本- 6 -output out;reg out;always@(a or b or sel)beginif(sel==0) out=a; //阻塞赋值else out=b;endendmodule【例5.9】非阻塞赋值module non_block(c,b,a,clk); output c,b;input clk,a;reg c,b;always @(posedge clk) beginb<=a;c<=b;endendmodule【例5.10】阻塞赋值module block(c,b,a,clk); output c,b;input clk,a;reg c,b;always @(posedge clk)beginb=a;c=b;endendmodule【例5.11】模为60 的BCD 码加法计数器module count60(qout,cout,data,load,cin,reset,clk); output[7:0] qout;output cout;input[7:0] data;input load,cin,clk,reset;reg[7:0] qout;always @(posedge clk) //clk 上升沿时刻计数王金明:《Verilog HDL 程序设计教程》- 7 -beginif (reset) qout<=0; //同步复位else if(load) qout<=data; //同步置数else if(cin)beginif(qout[3:0]==9) //低位是否为9,是则beginqout[3:0]<=0; //回0,并判断高位是否为5if (qout[7:4]==5) qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1; //高位不为5,则加1endelse //低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0; //产生进位输出信号endmodule【例5.12】BCD 码—七段数码管显示译码器module decode4_7(decodeout,indec);output[6:0] decodeout;input[3:0] indec;reg[6:0] decodeout;always @(indec)begincase(indec) //用case 语句进行译码4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011; default: decodeout=7'bx;endcaseend程序文本- 8 -endmodule【例5.13】用casez 描述的数据选择器module mux_casez(out,a,b,c,d,select); output out;input a,b,c,d;input[3:0] select;reg out;always @(select or a or b or c or d) begincasez(select)4'b???1: out = a;4'b??1?: out = b;4'b?1??: out = c;4'b1???: out = d;endcaseendendmodule【例5.14】隐含锁存器举例module buried_ff(c,b,a);output c;input b,a;reg c;always @(a or b)beginif((b==1)&&(a==1)) c=a&b;endendmodule【例5.15】用for 语句描述的七人投票表决器module voter7(pass,vote);output pass;input[6:0] vote;reg[2:0] sum;integer i;reg pass;always @(vote)beginsum=0;王金明:《Verilog HDL 程序设计教程》- 9 -for(i=0;i<=6;i=i+1) //for 语句if(vote[i]) sum=sum+1;if(sum[2]) pass=1; //若超过4 人赞成,则pass=1 else pass=0;endendmodule【例5.16】用for 语句实现2 个8 位数相乘module mult_for(outcome,a,b);parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] outcome; //结果reg[2*size:1] outcome;integer i;always @(a or b)beginoutcome=0;for(i=1; i<=size; i=i+1) //for 语句if(b[i]) outcome=outcome +(a << (i-1));endendmodule【例5.17】用repeat 实现8 位二进制数的乘法module mult_repeat(outcome,a,b);parameter size=8;input[size:1] a,b;output[2*size:1] outcome;reg[2*size:1] temp_a,outcome;reg[size:1] temp_b;always @(a or b)beginoutcome=0;temp_a=a;temp_b=b;repeat(size) //repeat 语句,size 为循环次数beginif(temp_b[1]) //如果temp_b 的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a<<1; //操作数a 左移一位程序文本- 10 -temp_b=temp_b>>1; //操作数b 右移一位endendendmodule【例5.18】同一循环的不同实现方式module loop1; //方式1integer i;initialfor(i=0;i<4;i=i+1) //for 语句begin$display(“i=%h”,i);endendmodulemodule loop2; //方式2integer i;initial begini=0;while(i<4) //while 语句begin$display ("i=%h",i);i=i+1;endendendmodulemodule loop3; //方式3integer i;initial begini=0;repeat(4) //repeat 语句begin$display ("i=%h",i);i=i+1;endendendmodule【例5.19】使用了`include 语句的16 位加法器王金明:《Verilog HDL 程序设计教程》- 11 -`include "adder.v"module adder16(cout,sum,a,b,cin);output cout;parameter my_size=16;output[my_size-1:0] sum;input[my_size-1:0] a,b;input cin;adder my_adder(cout,sum,a,b,cin); //调用adder 模块endmodule//下面是adder 模块代码module adder(cout,sum,a,b,cin);parameter size=16;output cout;output[size-1:0] sum;input cin;input[size-1:0] a,b;assign {cout,sum}=a+b+cin;endmodule【例5.20】条件编译举例module compile(out,A,B);output out;input A,B;`ifdef add //宏名为addassign out=A+B;`elseassign out=A-B;`endifendmodule【例6.1】加法计数器中的进程module count(data,clk,reset,load,cout,qout);output cout;output[3:0] qout;reg[3:0] qout;input[3:0] data;input clk,reset,load;程序文本- 12 -always @(posedge clk) //进程1,always 过程块beginif (!reset) qout= 4'h00; //同步清0,低电平有效else if (load) qout= data; //同步预置else qout=qout + 1; //加法计数endassign cout=(qout==4'hf)?1:0; //进程2,用持续赋值产生进位信号endmodule【例6.2】任务举例module alutask(code,a,b,c);input[1:0] code;input[3:0] a,b;output[4:0] c;reg[4:0] c;task my_and; //任务定义,注意无端口列表input[3:0] a,b; //a,b,out 名称的作用域范围为task 任务内部output[4:0] out;integer i;beginfor(i=3;i>=0;i=i-1)out[i]=a[i]&b[i]; //按位与endendtaskalways@(code or a or b)begincase(code)2'b00: my_and(a,b,c);/* 调用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c分别对应任务定义中的a,b,out */2'b01: c=a|b; //或2'b10: c=a-b; //相减2'b11: c=a+b; //相加endcaseendendmodule王金明:《Verilog HDL 程序设计教程》- 13 -【例6.3】测试程序`include "alutask.v"module alu_tp;reg[3:0] a,b;reg[1:0] code;wire[4:0] c;parameter DELY = 100;alutask ADD(code,a,b,c); //调用被测试模块initial begincode=4'd0; a= 4'b0000; b= 4'b1111;#DELY code=4'd0; a= 4'b0111; b= 4'b1101; #DELY code=4'd1; a= 4'b0001; b= 4'b0011; #DELY code=4'd2; a= 4'b1001; b= 4'b0011; #DELY code=4'd3; a= 4'b0011; b= 4'b0001; #DELY code=4'd3; a= 4'b0111; b= 4'b1001; #DELY $finish;endinitial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c);endmodule【例6.4】函数function[7:0] get0;input[7:0] x;reg[7:0] count;integer i;begincount=0;for (i=0;i<=7;i=i+1)if (x[i]=1'b0) count=count+1;get0=count;endendfunction【例6.5】用函数和case 语句描述的编码器(不含优先顺序)module code_83(din,dout);input[7:0] din;output[2:0] dout;程序文本- 14 -function[2:0] code; //函数定义input[7:0] din; //函数只有输入,输出为函数名本身casex (din)8'b1xxx_xxxx : code = 3'h7;8'b01xx_xxxx : code = 3'h6;8'b001x_xxxx : code = 3'h5;8'b0001_xxxx : code = 3'h4;8'b0000_1xxx : code = 3'h3;8'b0000_01xx : code = 3'h2;8'b0000_001x : code = 3'h1;8'b0000_000x : code = 3'h0;default: code = 3'hx;endcaseendfunctionassign dout = code(din) ; //函数调用endmodule【例6.6】阶乘运算函数module funct(clk,n,result,reset);output[31:0] result;input[3:0] n;input reset,clk;reg[31:0] result;always @(posedge clk) //在clk 的上升沿时执行运算beginif(!reset) result<=0; //复位else beginresult <= 2 * factorial(n); //调用factorial 函数endendfunction[31:0] factorial; //阶乘运算函数定义(注意无端口列表)input[3:0] opa; //函数只能定义输入端,输出端口为函数名本身reg[3:0] i;beginfactorial = opa ? 1 : 0;for(i= 2; i <= opa; i = i+1) //该句若要综合通过,opa 应赋具体的数值factorial = i* factorial; //阶乘运算end王金明:《Verilog HDL 程序设计教程》- 15 -endfunctionendmodule【例6.7】测试程序`define clk_cycle 50`include "funct.v"module funct_tp;reg[3:0] n;reg reset,clk;wire[31:0] result;initial //定义激励向量beginn=0; reset=1; clk=0;for(n=0;n<=15;n=n+1)#100 n=n;endinitial $monitor($time,,,"n=%d result=%d",n,result);//定义输出显示格式always # `clk_cycle clk=~clk; //产生时钟信号funct funct_try(.clk(clk),.n(n),.result(result),.reset(reset)); //调用被测试模块endmodule【例6.8】顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;a=~q;endendmodule【例6.9】顺序执行模块2 module serial2(q,a,clk); output q,a;程序文本- 16 -input clk;reg q,a;always @(posedge clk) begina=~q;q=~q;endendmodule【例6.10】并行执行模块1 module paral1(q,a,clk); output q,a;input clk;reg q,a;always @(posedge clk) beginq=~q;endalways @(posedge clk) begina=~q;endendmodule【例6.11】并行执行模块2 module paral2(q,a,clk); output q,a;input clk;reg q,a;always @(posedge clk) begina=~q;endalways @(posedge clk) beginq=~q;endendmodule【例7.1】调用门元件实现的4 选1 MUX王金明:《Verilog HDL 程序设计教程》- 17 -module mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2); output out;input in1,in2,in3,in4,cntrl1,cntrl2;wire notcntrl1,notcntrl2,w,x,y,z;not (notcntrl1,cntrl2),(notcntrl2,cntrl2);and (w,in1,notcntrl1,notcntrl2),(x,in2,notcntrl1,cntrl2),(y,in3,cntrl1,notcntrl2),(z,in4,cntrl1,cntrl2);or (out,w,x,y,z);endmodule【例7.2】用case 语句描述的4 选1 MUX module mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2); output out;input in1,in2,in3,in4,cntrl1,cntrl2;reg out;always@(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) case({cntrl1,cntrl2})2'b00:out=in1;2'b01:out=in2;2'b10:out=in3;2'b11:out=in4;default:out=2'bx;endcaseendmodule【例7.3】行为描述方式实现的4 位计数器module count4(clk,clr,out);input clk,clr;output[3:0] out;reg[3:0] out;always @(posedge clk or posedge clr)beginif (clr) out<=0;else out<=out+1;endendmodule程序文本- 18 -【例7.4】数据流方式描述的4 选1 MUXmodule mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=(in1 & ~cntrl1 & ~cntrl2)|(in2 & ~cntrl1 & cntrl2)| (in3 & cntrl1 & ~cntrl2)|(in4 & cntrl1 & cntrl2); endmodule【例7.5】用条件运算符描述的4 选1 MUXmodule mux4_1d(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1); endmodule【例7.6】门级结构描述的2 选1MUXmodule mux2_1a(out,a,b,sel);output out;input a,b,sel;not (sel_,sel);and (a1,a,sel_),(a2,b,sel);or (out,a1,a2);endmodule【例7.7】行为描述的2 选1MUX module mux2_1b(out,a,b,sel);output out;input a,b,sel;reg out;always @(a or b or sel)beginif(sel) out = b;else out = a;endendmodule【例7.8】数据流描述的2 选1MUX module MUX2_1c(out,a,b,sel);output out;王金明:《Verilog HDL 程序设计教程》- 19 -input a,b,sel;assign out = sel ? b : a;endmodule【例7.9】调用门元件实现的1 位半加器module half_add1(a,b,sum,cout);input a,b;output sum,cout;and (cout,a,b);xor (sum,a,b);endmodule【例7.10】数据流方式描述的1 位半加器module half_add2(a,b,sum,cout);input a,b;output sum,cout;assign sum=a^b;assign cout=a&b;endmodule【例7.11】采用行为描述的1 位半加器module half_add3(a,b,sum,cout);input a,b;output sum,cout;reg sum,cout;always @(a or b)begincase ({a,b}) //真值表描述2'b00: begin sum=0; cout=0; end2'b01: begin sum=1; cout=0; end2'b10: begin sum=1; cout=0; end2'b11: begin sum=0; cout=1; end endcaseendendmodule【例7.12】采用行为描述的1 位半加器module half_add4(a,b,sum,cout);input a,b;output sum,cout;程序文本- 20 -reg sum,cout;always @(a or b)beginsum= a^b;cout=a&b;endendmodule【例7.13】调用门元件实现的1 位全加器module full_add1(a,b,cin,sum,cout); input a,b,cin;output sum,cout;wire s1,m1,m2,m3;and (m1,a,b),(m2,b,cin),(m3,a,cin);xor (s1,a,b),(sum,s1,cin);or (cout,m1,m2,m3);endmodule【例7.14】数据流描述的1 位全加器module full_add2(a,b,cin,sum,cout); input a,b,cin;output sum,cout;assign sum = a ^ b ^ cin;assign cout = (a & b)|(b & cin)|(cin & a); endmodule【例7.15】1 位全加器module full_add3(a,b,cin,sum,cout); input a,b,cin;output sum,cout;assign {cout,sum}=a+b+cin; endmodule【例7.16】行为描述的1 位全加器module full_add4(a,b,cin,sum,cout);input a,b,cin;output sum,cout;王金明:《Verilog HDL 程序设计教程》- 21 -reg sum,cout; //在always 块中被赋值的变量应定义为reg 型reg m1,m2,m3;always @(a or b or cin)beginsum = (a ^ b) ^ cin;m1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1|m2)|m3;endendmodule【例7.17】混合描述的1 位全加器module full_add5(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg cout,m1,m2,m3; //在always 块中被赋值的变量应定义为reg 型wire s1;xor x1(s1,a,b); //调用门元件always @(a or b or cin) //always 块语句beginm1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1| m2) | m3;endassign sum = s1 ^ cin; //assign 持续赋值语句endmodule【例7.18】结构描述的4 位级连全加器`include "full_add1.v"module add4_1(sum,cout,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;full_add1 f0(a[0],b[0],cin,sum[0],cin1); //级连描述full_add1 f1(a[1],b[1],cin1,sum[1],cin2);full_add1 f2(a[2],b[2],cin2,sum[2],cin3);程序文本- 22 -full_add1 f3(a[3],b[3],cin3,sum[3],cout); endmodule【例7.19】数据流描述的4 位全加器module add4_2(cout,sum,a,b,cin); output[3:0] sum;output cout;input[3:0] a,b;input cin;assign {cout,sum}=a+b+cin; endmodule【例7.20】行为描述的4 位全加器module add4_3(cout,sum,a,b,cin); output[3:0] sum;output cout;input[3:0] a,b;input cin;reg[3:0] sum;reg cout;always @(a or b or cin)begin{cout,sum}=a+b+cin;endendmodule【例8.1】$time 与$realtime 的区别`timescale 10ns/1nsmodule time_dif;reg ts;parameter delay=2.6;initialbegin#delay ts=1;#delay ts=0;#delay ts=1;#delay ts=0;endinitial $monitor($time,,,"ts=%b",ts); //使用函数$time 王金明:《Verilog HDL 程序设计教程》- 23 -endmodule【例8.2】$random 函数的使用`timescale 10ns/1nsmodule random_tp;integer data;integer i;parameter delay=10;initial $monitor($time,,,"data=%b",data); initial beginfor(i=0; i<=100; i=i+1)#delay data=$random; //每次产生一个随机数endendmodule【例8.3】1 位全加器进位输出UDP 元件primitive carry_udp(cout,cin,a,b);input cin,a,b;output cout;table//cin a b : cout //真值表0 0 0 : 0;0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;endtableendprimitive【例8.4】包含x 态输入的1 位全加器进位输出UDP 元件primitive carry_udpx1(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表0 0 0 : 0;程序文本- 24 -0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;0 0 x : 0; //只要有两个输入为0,则进位输出肯定为00 x 0 : 0;x 0 0 : 0;1 1 x : 1; //只要有两个输入为1,则进位输出肯定为11 x 1 : 1;x 1 1 : 1;endtableendprimitive【例8.5】用简缩符“?”表述的1 位全加器进位输出UDP 元件primitive carry_udpx2(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表? 0 0 : 0; //只要有两个输入为0,则进位输出肯定为00 ? 0 : 0;0 0 ? : 0;? 1 1 : 1; //只要有两个输入为1,则进位输出肯定为11 ? 1 : 1;1 1 ? : 1;endtableendprimitive【例8.6】3 选1 多路选择器UDP 元件primitive mux31(Y,in0,in1,in2,s2,s1);input in0,in1,in2,s2,s1;output Y;table//in0 in1 in2 s2 s1 : Y0 ? ? 0 0 : 0; //当s2s1=00 时,Y=in01 ? ? 0 0 : 1;? 0 ? 0 1 : 0; //当s2s1=01 时,Y=in1王金明:《Verilog HDL 程序设计教程》- 25 -? 1 ? 0 1 : 1;? ? 0 1 ? : 0; //当s2s1=1?时,Y=in2? ? 1 1 ? : 1;0 0 ? 0 ? : 0;1 1 ? 0 ? : 1;0 ? 0 ? 0 : 0;1 ? 1 ? 0 : 1;? 0 0 ? 1 : 0;? 1 1 ? 1 : 1;endtableendprimitive【例8.7】电平敏感的1 位数据锁存器UDP 元件primitive latch(Q,clk,reset,D);input clk,reset,D;output Q;reg Q;initial Q = 1'b1; //初始化table// clk reset D : state : Q? 1 ? : ? : 0 ; //reset=1,则不管其他端口为什么值,输出都为0 0 0 0 : ? : 0 ; //clk=0,锁存器把D 端的输入值输出0 0 1 : ? : 1 ;1 0 ? : ? : - ; //clk=1,锁存器的输出保持原值,用符号“-”表示endtableendprimitive【例8.8】上升沿触发的D 触发器UDP 元件primitive DFF(Q,D,clk);output Q;input D,clk;reg Q;table//clk D : state : Q(01) 0 : ? : 0; //上升沿到来,输出Q=D(01) 1 : ? : 1;(0x) 1 : 1 : 1;(0x) 0 : 0 : 0;(?0) ? : ? : -; //没有上升沿到来,输出Q 保持原值? (??) : ? : - ; //时钟不变,输出也不变程序文本- 26 -endtableendprimitive【例8.9】带异步置1 和异步清零的上升沿触发的D 触发器UDP 元件primitive DFF_UDP(Q,D,clk,clr,set);output Q;input D,clk,clr,set;reg Q;table// clk D clr set : state : Q(01) 1 0 0 : ? : 0;(01) 1 0 x : ? : 0;? ? 0 x : 0 : 0;(01) 0 0 0 : ? : 1;(01) 0 x 0 : ? : 1;? ? x 0 : 1 : 1;(x1) 1 0 0 : 0 : 0;(x1) 0 0 0 : 1 : 1;(0x) 1 0 0 : 0 : 0;(0x) 0 0 0 : 1 : 1;? ? 1 ? : ? : 1; //异步复位? ? 0 1 : ? : 0; //异步置1n ? 0 0 : ? : -;? * ? ? : ? : -;? ? (?0) ? : ? : -;? ? ? (?0): ? : -;? ? ? ? : ? : x;endtableendprimitive【例8.12】延迟定义块举例module delay(out,a,b,c);output out;input a,b,c;and a1(n1,a,b);or o1(out,c,n1);specify(a=>out)=2;(b=>out)=3;(c=>out)=1;王金明:《Verilog HDL 程序设计教程》- 27 -endspecifyendmodule【例8.13】激励波形的描述'timescale 1ns/1nsmodule test1;reg A,B,C;initialbegin //激励波形描述A = 0;B = 1;C = 0;#100 C = 1;#100 A = 1; B = 0;#100 A = 0;#100 C = 0;#100 $finish;endinitial $monitor($time,,,"A=%d B=%d C=%d",A,B,C); //显示endmodule【例8.15】用always 过程块产生两个时钟信号module test2;reg clk1,clk2;parameter CYCLE = 100;alwaysbegin{clk1,clk2} = 2'b10;#(CYCLE/4) {clk1,clk2} = 2'b01;#(CYCLE/4) {clk1,clk2} = 2'b11;#(CYCLE/4) {clk1,clk2} = 2'b00;#(CYCLE/4) {clk1,clk2} = 2'b10;endinitial $monitor($time,,,"clk1=%b clk2=%b",clk1,clk2); endmodule【例8.17】存储器在仿真程序中的应用module ROM(addr,data,oe);output[7:0] data; //数据信号input[14:0] addr; //地址信号input oe; //读使能信号,低电平有效程序文本- 28 -reg[7:0] mem[0:255]; //存储器定义parameter DELAY = 100;assign #DELAY data=(oe==0) ? mem[addr] : 8'hzz; initial $readmemh("rom.hex",mem); //从文件中读入数据endmodule【例8.18】8 位乘法器的仿真程序`timescale 10ns/1nsmodule mult_tp; //测试模块的名字reg[7:0] a,b; //测试输入信号定义为reg 型wire [15:0] out; //测试输出信号定义为wire 型integer i,j;mult8 m1(out,a,b); //调用测试对象//激励波形设定initialbegina=0;b=0;for(i=1;i<255;i=i+1)#10 a=i;endinitialbeginfor(j=1;j<255;j=j+1)#10 b=j;endinitial //定义结果显示格式begin$monitor($time,,,"%d * %d= %d",a,b,out); #2560 $finish;endendmodulemodule mult8(out, a, b); //8 位乘法器源代码parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] out; //结果assign out=a*b; //乘法运算符王金明:《Verilog HDL 程序设计教程》- 29 -endmodule【例8.19】8 位加法器的仿真程序`timescale 1ns/1nsmodule add8_tp; //仿真模块无端口列表reg[7:0] A,B; //输入激励信号定义为reg 型reg cin;wire[7:0] SUM; //输出信号定义为wire 型wire cout;parameter DELY = 100;add8 AD1(SUM,cout,A,B,cin); //调用测试对象initial begin //激励波形设定A= 8'd0; B= 8'd0; cin=1'b0;#DELY A= 8'd100; B= 8'd200; cin=1'b1;#DELY A= 8'd200; B= 8'd88;。

VerilogHDL程序设计教程

VerilogHDL程序设计教程

Verilog HDL程序设计教程红色:做后有错。

粉红色:有疑问。

紫色:第二次仍有错。

绿色:文字错误第1章EDA技术综述 1.1引言1.摩尔定律1.2EDA的发展阶段1.阶段1.3设计方法与设计技术1.两种设计思路2.IP的含义3. IP核的分类。

4. SOC的含义1.4EDA的实现1.实现方法第2章EDA设计软件与设计流程 2.2EDA的设计流程1(FPGA的设计流程 2(综合的定义与类型。

3(仿真的类型第3章Verilog HDL设计初步(P18) 3.2完整的Verilog HDL设计1. 4位全加器的和4位计数器的程序。

2. 4位全加器的仿真程序(1.时间头文件 2.模块名(没有参数)3.参数规定(端口、延时、时钟)4.调用测试对象 5.设置参数(所有的输入端口都应初始化赋值)6.显示设置)。

3.3Verilog模块基本结构剖析 1.端口定义注意事项。

2.逻辑功能定义的几种方式第4章Verilog HDL语言要素(P32)4.1词法1.verilog中的四种基本逻辑状态4.2数据类型1.连线型(Net Type)的特点2.寄存器型(Register Type):定义、与连线型区别(赋值、保值)3.Parameter的使用格式4.3寄存器和存储器1.寄存器定义格式和标矢性2.存储器:定义、格式、位区选择方法4.3运算符1.等式与全等式的区别2.位拼接运算符第5章Verilog HDL行为语句(P45)5.2 Verilog HDL中的过程语句1.always过程语句格式。

2.initial过程语句格式。

5.3 块语句1.块语句。

2.用begin—end产生周期为10的个单位时间的方波.3.用fork—join产生周期为10的个单位时间的方波5.4赋值语句1.分类。

2.阻塞赋值和非阻塞赋值的区别5.5条件语句1.例5.11(模为60的BCD码加法计数器)2.case语句的三种表达形式5.6循环语句1.Verilog HDL中4种类型循环语句。

Verilog HDL入门教程

Verilog HDL入门教程
2.4.1 历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.4.2 能力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3 Verilog HDL 建模概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.1 模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.1.1 简单事例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.1.2 模块的结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.1.3 模块语法 . . . . . . . . . . . . . . . . . . . . . .

VerilogHDL语言基础教材教学课件

VerilogHDL语言基础教材教学课件
IEEE标准
1990年代,Verilog HDL成为IEEE标准,并不断发展完善。
新版本
随着数字电路设计的发展,Verilog HDL不断推出新版本,支持更高级的硬件描述和验证功能。
Verilog HDL的历史和发展
01
02
03
04
ASIC设计
在ASIC设计中,Verilog HDL用于描述数字电路的结构和行为。
FPGA设计
在FPGA设计中,Verilog HDL用于描述逻辑块、路由和IO接口等。
仿真验证
Verilog HDL还用于数字电路的仿真验证,通过模拟电路的行为来检测设计中的错误和缺陷。
学术研究
在数字电路和系统设计领域,Verilog HDL广泛应用于学术研究、教学和实验中。
Verilog HDL的应用领域
测试平台编写是指编写用于测试Verilog设计的测试平台代码。测试平台代码可以使用Verilog语言编写,并使用仿真测试平台进行测试和验证。
仿真测试平台
测试平台编写
仿真和测试平台
Verilog HDL设计实例
04
组合逻辑设计
总结词:组合逻辑设计是Verilog HDL中最基础的设计之一,主要用于实现逻辑函数。
02
数字系统设计涉及逻辑门、触发器、寄存器、组合逻辑、时序逻辑等基本数字逻辑单元的设计和组合,Verilog HDL语言能够方便地描述这些结构和行为。
03
数字系统广泛应用于计算机、通信、控制等领域,通过Verilog HDL语言可以实现高效、可靠的数字系统设计。
01
Verilog HDL的未来发展
发展趋势和挑战
THANKS
ASIC设计涉及逻辑设计、电路设计、物理实现等环节,Verilog HDL语言能够描述硬件结构和行为,为ASIC设计提供强大的支持。

verilog_hdl教程_硬件描述语言_课件_PPT

verilog_hdl教程_硬件描述语言_课件_PPT
门元件关键字
例化元件名
门元件例化
注1:元件例化即是调用Verilog HDL提供的元件; 注2:元件例化包括门元件例化和模块元件例化; 注3:每个实例元件的名字必须唯一!以避免与其 它调用元件的实例相混淆。 注4:例化元件名也可以省略!
模块元件例化
15
3.2 Verilog HDL基本结构
第3章
硬件描述语言Verilog HDL
3.1 3.2 3.3 3.4 3.5 3.6 3.7 引言 Verilog HDL基本结构 数据类型及常量、变量 运算符及表达式 语句 赋值语句和块语句 条件语句
3.8 循环语句 3.9 结构说明语句 3.10 编译预处理语句 3.11 语句的顺序执行与并行执行 3.12 不同抽象级别的Verilog HDL模型 3.13 设计技巧
4
3.1 引言 三、不同层次的Verilog HDL抽象
Verilog HDL模型可以是实际电路的不同级别的抽象。 抽象级别可分为五级:
系统级(system level): 用高级语言结构(如case语句)
实现的设计模块外部性能的模型;
算法级(algorithmic level): 用高级语言结构实现的设


程序书写格式自由,一行可以写几个语句,一个语句也可以分多 行写。
除了endmodule语句、begin_end语句和fork_join语句外,每个语 句和数据定义的最后必须有分号。 可用/*.....*/和//...对程序的任何部分作注释。加上必要的注释,以 增强程序的可读性和可维护性。
13
例化元件名
子模块
返回逻辑 功能定义
module mytri(out,in,enable); output out; input in, enable; assign out = enable? in:‘bz; / * 如果enable为1,则out = in,否则为高阻态 * / endmodule

《Verilog设计入门》PPT课件

《Verilog设计入门》PPT课件

精选PPT
18
3.1 组合电路的Verilog描述
3.1.2 4选1多路选择器及其case语句表述方式 6.赋值操作符 “<=”,只能用于顺序语句,不能用于assign引 导的并行语句
两种过程赋值操作: (1)阻塞式赋值“=”:语句执行结束,右侧表达式的值立刻赋给左侧 目标变量。
对于always引导的块语句中含有多条阻塞式赋值语句时,当执行某 一条语句时,其它语句不允许执行,被阻塞了,具有顺序执行的特点。
module h_adder (a,b,so,co); input a,b; output so,co; assign {co,so} = a + b;
endmodule
精选PPT
30
3.1 组合电路的Verilog描述
3.1.5 加法器及其Verilog描述 4. 算数操作符的使用
精选PPT
31
endmodule
精选PPT
34
3.1 组合电路的Verilog描述
3.1.5 加法器及其Verilog描述 5. 全加器描述----用半加器、或门模块及例化语句描述
精选PPT
35
3.1 组合电路的Verilog描述
3.1.5 加法器及其Verilog描述 5. 全加器描述----顶层文件及例化语句描述
3.1 组合电路的Verilog描述
3.1.5 加法器及其Verilog描述 5. 全加器描述----用半加器模块和或门模块描述
精选PPT
32
3.1 组合电路的Verilog描述
3.1.5 加法器及其Verilog描述 5. 全加器描述----用半加器、或门模块及例化语句描述
module or2a(a,b,c); input a,b; output c; assign c = a | b;

VerilogHDL教程

VerilogHDL教程

VerilogHDL教程verilog hdl教程一、Verilog HDL概述二、Verilog HDL语法1.模块定义和端口声明模块是Verilog HDL的基本单元,用于描述电路的结构和行为。

以下是一个简单的模块定义和端口声明的例子:module adderinput wire [3:0] a,input wire [3:0] b,output wire [3:0] sum//模块内部的逻辑和信号声明//...endmodule2.信号声明和赋值wire [3:0] a;reg [3:0] b;assign a = 4'b0110;b<=a;end3.组合逻辑和时序逻辑组合逻辑通过组合逻辑操作(如AND,OR,XOR等)来描述电路的行为。

时序逻辑通过时钟沿的触发条件来描述电路的行为。

以下是组合逻辑和时序逻辑的例子://组合逻辑assign c = a & b;assign d = a ^ b;//时序逻辑if (reset) begine<=0;end else begine<=a+b;endend三、Verilog HDL用法1.模块实例化add4 adder_inst.a(a),.b(b),.sum(sum)2.仿真和验证Verilog HDL可以使用仿真工具进行仿真和验证。

常用的仿真工具包括ModelSim,Xilinx ISE和Cadence Incisive等。

仿真工具可以使用Verilog HDL代码来模拟和验证电路的功能和性能。

四、总结Verilog HDL是一种用于描述数字电路的硬件描述语言。

它提供了一种清晰,结构化的方式来描述电路的行为和结构。

通过模块化的设计和调试,Verilog HDL使设计人员能够更好地建模和分析复杂的电路。

它支持多种级别的抽象,如行为级,RTL级和门级,以满足不同层次的设计需求。

通过实例化已定义的模块和使用仿真工具,Verilog HDL可以方便地进行电路的仿真和验证。

Verilog语言基础入门

Verilog语言基础入门
4
❑ 非阻塞型过程赋值 “<=” :一条非阻塞型赋值语句的 执行,并不会影响块中其它语句的执行。
❑ 连续赋值语句:用关键词 assign,只要输入端操作数的 值
发生变化,该语句就重新计算并刷新赋值结果
数据类型
线网类型(wire):表示 Verilog 元件间的物理连线,一般使 用持续赋值 assign 语句赋值
5
寄存器类型(reg):表示一个抽象的数据存储单元,它只能 在 always 语句和 initial 语句中被赋值
❑ 数组
❑ reg [15:0] reg_file[0:31]; // 32 个 16 位的寄存器构成的寄 存器堆
行为描述
6
module mux2_1(out1, a, b, sel) ; output reg out1, out2; input a, b; input sel;
➢ 测试模块中要调用到设计块,只有这样才能对它进行测试; ➢ 测试模块中应包含测试的激励信号源; ➢ 测试模块能够实施对输出信号的检测。
8
Verilog 电路的仿真与验证
8
Testbench 实例
9
Verilog HDL 语言入门
Verilog 程序的最基本结构
❑ 模块(module)是 Verilog 的基本描述单位,用于 描
述某个设计的功能或结构 ❑ 一个模块可以在另一个模块中使用。
❑ Verilog 大小写敏感
Verilog 模块
• 一个ssign out2 = a+b; //持续赋值语句
always @(sel or a or b) begin if (sel) out1 = b; else out1 = a; end endmodule

3.2 VerilogHDL的基本语法(2)

3.2 VerilogHDL的基本语法(2)

b)
always
@(sel[1:0]
or
a
or
b)
case(sel[1:0]) 2‘b00: 2‘b11: endcase q<=a; q<=b;
case(sel[1:0]) 2‘b00: 2‘b11: default: endcase q<=a; q<=b; q<=‘b0;
有 锁 存 器
无 锁 存 器

fork
#50
r = 'h35; #100 r = 'hE2; #150 r = 'h00; #200 r = 'hF7; #250 -> end_wave; //触发事件end_wave.

join
起始时间和结束时间

fork
#250
-> end_wave; #200 r = 'hF7; #150 r = 'h00; #100 r = 'hE2; #50 r = 'h35;
3.6.1 forever语句

forever语句的格式如下:
语句; forever begin 多条语句 end
forever
forever循环语句常用于产生周期性的波形,用 来作为仿真测试信号。 它与always语句不同处在于不能独立写在程序 中,而必须写在initial块中。

3.6.2 repeat语句

join
3.5.1 条件语句——if_else语句
(1) if(表达式)语句; (2) if(表达式) 语句1; else 语句2; (3) if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; ........
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

║68 第3章 硬件描述语言Verilog HDL基础
3.2 Verilog HDL程序基本结构
Verilog HDL是一种用于数字逻辑电路设计的语言。

用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。

Verilog HDL既是一种行为描述的语言,也是一种结构描述的语言。

也就是说,既可以用电路的功能描述,也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。

Verilog模型可以是实际电路的不同级别的抽象。

这些抽象的级别和它们对应的模型类型共有以下5种。

∙系统级(system):用高级语言结构实现设计模块的外部性能的模型。

∙算法级(algorithm):用高级语言结构实现设计算法的模型。

∙RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。

∙门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。

∙开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。

一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。

其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。

利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。

Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。

这种行为描述语言具有以下功能。

∙可描述顺序执行或并行执行的程序结构。

∙用延迟表达式或事件表达式来明确地控制过程的启动时间。

∙通过命名的事件来触发其他过程里的激活行为或停止行为。

∙提供了条件、if-else、case、循环程序结构。

∙提供了可带参数且非零延续时间的任务(task)程序结构。

∙提供了可定义新的操作符的函数结构(function)。

∙提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。

∙ Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。

因其结构化的特点又使它具有以下功能。

—提供了完整的一套组合型原语(primitive);
—提供了双向通路和电阻器件的原语;
—可建立MOS器件的电荷分享和电荷衰减动态模型。

Verilog HDL的构造性语句可以精确地建立信号的模型。

这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。

信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。

Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。

其中if语句、case语句等和C语言中的对应语句十分相似。

如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。

下面将介绍Verilog。

相关文档
最新文档