当前位置:文档之家› cpld的verilog学习

cpld的verilog学习

cpld的verilog学习
cpld的verilog学习

cpld的verilog学习

2011-01-06 17:17 2842人阅读评论(0) 收藏举报integer存储语言编译器moduleinput

以前浪费了太多机会了。以后就用这些来记录下自己到底学会了什么。用到了什么。做出了什么。

verilog的整体结构

模块的结构

verilog的基本设计单元是“模块”(block)。包括(接口描述、逻辑功能描述)例子:

module block(a, b, c, d);

input a, b;

output c, d;

assign c = a | b; 【连续赋值:assign,问号表达式(?:)】

assign d = a & b;

endmodule

由例子可以看出,verilog结构位于在module和endmodule声明语句之间,每个verilog程序包括4个主要部分:端口定义、I/O说明、内部信号声明和功能定义。

1、模块的端口定义

模块端口声明了模块的输入输出。格式:

module 模块名(口1,口2,口3,口4,…..);

模块的端口表示模块的输入还是输出名。

引用模块时其端口可以用两种方法连接:

(1)在引用时,严格按照定义的端口顺序连接,不用标明原模块定义时规定的端口

(2)在引用时用”.”符号,标明原模块是定义时规定的端口名。

2、模块内容

模块的内容包括I/O说明、内部信号声明和功能定义。

(1)I/O说明的格式

输入口:input [信号位宽-1 : 0] 端口名1;

输出口:output [信号位宽-1 : 0] 端口名1;

输入输出口:inout [信号位宽-1 : 0] 断口名1;

(2)内部信号说明

在模块内用到的与端口有关的wire和reg类型变量的声明。

Reg [width-1 : 0] R变量1,R变量2…;【reg不和实际的电路如寄存器对应,高层次的描述时用】

Wire [width-1 : 0]W变量1,W变量2…;【与实际的物理连接对应】

(3)功能定义

模块中最重要的部分时逻辑功能定义。由3种方法可以在模块中产生逻辑。

1)用assign声明语句

如assign a = b&c;

2)用实例元件

and #2 u1(q, a, b);

3)用always块【变量必须声明为reg,还有initial。】

always @(posedge clk or posedge clr)

begin

if(clr) q <= 0;

else if(en) q <= d;

end

采用assign是描述组合逻辑最常用的方法之一。而always既可用来描述组合逻辑电路也可以用来描述时序逻辑。

(4)要点

1)在verilog模块中所有过程块(initial, always)、连续赋值语句、实例引用都是并行的;

2)他们表示的是一种通过变量名互相连接的关系

3)在同一模块中这三者出现的先后顺序没有关系。

只有联系赋值的语句assign和实例引用语句可以独立与过程块而存在于模块功能定义部分

程序例子

偶数分频器的verilog实现(先学习偶数,我用的单片机用到分频器)

偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。

module odd_division(clk,rst,count,clk_odd);

input clk,rst;

output clk_odd;

output[3:0] count;

reg clk_odd;

reg[3:0] count;

parameter N = 6; 【常数】

always @ (posedge clk) 【always模块:(敏感表可以为电平、沿信号posedge/negedge;通常和@连用)】

if(! rst) 【任务定义:task……endtask】

begin

count <= 1'b0; 【赋值符号:= 和 <= (阻塞和非阻塞赋值,在具体设计中时很有讲究的)】clk_odd <= 1'b0;

end

else

if ( count < N/2-1)

begin

count <= count + 1'b1;

end

else

begin

count <= 1'b0;

clk_odd <= ~clk_odd;

end

endmodule

注:数据结构详解

整数、实数和时间寄存器类型

整数是一种通用的寄存器数据类型,用于对数量进行操作,使用integer进行声明。

integer counter; //一般用途的变量用作计数器

initial

counter = -1; //把-1存储到寄存器中

实数:实常量和实数寄存器数据类型使用关键字real来声明,可以用十进制或科学计数法来表示。实数声明不能带有范围,其默认值为0.如果将一个实数赋予一个整数,那么实数将会被取为最接近的整数。

real delta; //定义一个名为delta的实型变量

时间寄存器:仿真是按照仿真时间进行的,verilog使用一个特殊的时间寄存器数据类型来保存仿真时间。时间变量通过使用关键字time来声明,其宽度与具体实现无关,最小为64位。通过调用系统函数$time可以取得当前的仿真时间。

2数组

Verilog中允许声明reg、integer、time、real、realtime及其向量类型的数组,对数组的维数没有限制,即可声明任意维数的数组。线网数组也可用于连接实例的端口,数组中的每个元素都可以作为一个标量或者向量,以同样的方式来使用,形如<数组名>[<下标>]。

Integer count[0:7]; //由八位计数变量组成的数组

reg bool [31:0]; //由32个1位的布尔寄存器变量组成的数组

wire [7:0] w_array2 [5:0]; //声明8位向量的数组

注意:不要把数组和线网或寄存器向量混淆起来。向量是一个单独的元件,它的位宽是n,数组由多个元件组成,其中每个元件的位宽为n或1.

3存储器【重点】

Verilog中使用寄存器一维数组来表示存储器。数字的每个元素成为一个元素或一个字(word),由一个数组索引来指定。每个字的位宽为1位或者多位。

注意n个1位寄存器和一个n位寄存器是不同的。如果需要访问存储器中的一个特定的字,则可通过子的地址作为数组的下标来完成。

reg mem1bit[0:1023]; //1k的1位存储器

reg [7:0] membyte [0:1023]; //1k的字节(8位)存储器membyte

membyet[511] //取出membyte中地址511所处的字节

4参数

Verilog使用关键字parameter在模块内定义常数。参数代表常数,不能像变量那样赋值,但是每个模块实例的参数值可以在编译阶段被重载。通过参数重载使得用户可以对模块实例进行定制。除此之外还可以对参数的类型和范围进行定义。

parameter port_id = 5; //定义常数port_id 为5

5字符串

字符串保存在reg类型的变量中,每个字符占用8位(一个字节),因此寄存器变量的宽度应足够大,以保证容纳全部字符。如果寄存器变量的宽度大于字符串的大小,则verilog用0来填充左边的空余位。如果寄存器变来那个的宽度小于字符串的大小,则verilog截去字符串最左边的位。

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 HDL 作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,Verilog HDL语言于1990年被推向公众领域。 Open Verilog International (OVI)是促进Verilog发展的国际性组织。1992年, OVI决定致力于推广Verilog OVI标准成为IEEE标准。这一努力最后获得成功,Verilog 语言于1995年成为IEEE标准,称为IEEE Std 1364-1995。完整的标准在Verilog 硬件描述语言参考手册中有详细描述。

主要能力

下面列出的是Verilog硬件描述语言的主要能力:

* 基本逻辑门,例如and、or和nand等都内置在语言中。

* 用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑

原语,也可以是时序逻辑原语。

* 开关级基本结构模型,例如pmos 和nmos等也被内置在语言中。

* 提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的

时序检查。

* 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。

* Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网

类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。

* 能够描述层次设计,可使用模块实例结构描述任何层次。

* 设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。* Verilog HDL不再是某些公司的专有语言而是IEEE标准。

* 人和机器都可阅读Verilog 语言,因此它可作为EDA的工具和设计者之间的交互语言。

* Verilog HDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。PLI是允许外部函数访问Verilog 模块内信息、允许设计者与模拟器交互的例程集合。

* 设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级。

* 能够使用内置开关级原语在开关级对设计完整建模。

* 同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。

* Verilog HDL 能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。

* 在行为级描述中,Verilog HDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。

* 能够使用门和模块实例化语句在结构级进行结构描述。

* Verilog HDL 的混合方式建模能力,即在一个设计中每个模块均可以在不同设计层次上建模。

* Verilog HDL 还具有内置逻辑函数,例如&(按位与)和(按位或)。

* 对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。

* 可以显式地对并发和定时进行建模。

* 提供强有力的文件读写能力。

* 语言在特定情况下是非确定性的,即在不同的模拟器上模型可以产生不同的结果;例如,事件队列上的事件顺序在标准中没有定义。

习题

1. Verilog HDL 是在哪一年首次被IEEE标准化的?

2. Verilog HDL支持哪三种基本描述方式?

3. 可以使用Verilog HDL描述一个设计的时序吗?

4. 语言中的什么特性能够用于描述参数化设计?

5. 能够使用Verilog HDL 编写测试验证程序吗?

6. Verilog HDL 是由哪个公司最先开发的?

7. Verilog HDL中的两类主要数据类型什么?

8. UDP代表什么?

9. 写出两个开关级基本门的名称。

10. 写出两个基本逻辑门的名称。

======================================

中文版Verilog HDL简明教程:第2章 HDL指南

本章提供HDL语言的速成指南。

2.1 模块

模块是Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中使用。

一个模块的基本语法如下:

module module_name (port_list);

Declarations:

reg, wire, parameter,

input, output, inout,

function, task, . . .

Statements:

Initial statement

Always statement

Module instantiation

Gate instantiation

UDP instantiation

Continuous assignment

endmodule

说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功能和结构。说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性, 最好将所有的说明部分放在语句前。本书

中的所有实例都遵守这一规范。

以下为建模一个半加器电路的模块的简单实例。

module HalfAdder (A, B, Sum, Carry);

input A, B;

output Sum, Carry;

assign #2 Sum = A ^ B;

assign #5 Carry = A & B;

endmodule

模块的名字是HalfAdder。模块有4个端口: 两个输入端口A和B,两个输出端口Sum和Carry。由于没有定义端口的位数, 所有端口大小都为1位;同时, 由于没有各端口的数据类型说明, 这四个端口都是线网数据类型。模块包含两条描述半加器数据流行为的连续赋值语句。从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的。每条语句的执行顺序依赖于发生在变量A和B上的事件。

在模块中,可用下述方式描述一个设计:

1) 数据流方式;

2) 行为方式;

3) 结构方式;

4) 上述描述方式的混合。

下面几节通过实例讲述这些设计描述方式。不过有必要首先对Verilog HDL的时延作简要介绍。

2.2 时延

Verilog HDL模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例。

assign #2 Sum = A ^ B;

#2指2个时间单位。

使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:

` timescale 1ns /100ps

此语句说明时延时间单位为1ns并且时间精度为100ps (时间精度是指所有的时延必须被限定在0.1ns内)。如果此编译器指令所在的模块包含上面的连续赋值语句, #2 代表2ns。

如果没有这样的编译器指令, Verilog HDL 模拟器会指定一个缺省时间单位。IEEE Verilog HDL 标准中没有规定缺省时间单位。

2.3 数据流描述方式

用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值

语句。在连续赋值语句中,某个值被指派给线网变量。连续赋值语句的语

法为:

assign [delay] LHS_net = RHS_ expression;

右边表达式使用的操作数无论何时发生变化, 右边表达式都重新计算, 并

且在指定的时延后变化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值, 缺省时延为0。

下面的例子显示了使用数据流描述方式对2-4解码器电路的建模的实例模型。`timescale 1ns/ 1ns

module Decoder2x4 (A, B, EN, Z);

input A, B, EN;

output [ 0 :3] Z;

wire Abar, Bbar;

assign #1 Abar = ~ A; / / 语句 1。

assign #1 Bbar = ~ B; / / 语句 2。

assign #2 Z[0] = ~ (Abar & Bbar & EN) ; / / 语句 3。

assign #2 Z[1] = ~ (Abar & B & EN) ; / / 语句 4。

assign #2 Z[2] = ~ (A & Bbar & EN) ; / / 语句 5。

assign #2 Z[3] = ~ (A & B & EN) ; / / 语句 6。

endmodule

以反引号“ ` ”开始的第一条语句是编译器指令, 编译器指令

`timescale 将模块中所有时延的单位设置为1 ns,时间精度为1 ns。例如,在连续赋值语句中时延值#1和#2分别对应时延1 ns和2 ns。

模块Decoder2x4有3个输入端口和1个4位输出端口。线网类型说明

了两个连线型变量Abar和Bbar (连线类型是线网类型的一种)。此外,模块包含6个连续赋值语句。

当EN在第5 ns变化时,语句3、4、5和6执行。这是因为EN是这些连续赋值语句中右边表达式的操作数。Z[0]在第7 ns时被赋予新值0。当A

在第15 ns变化时, 语句1、5和6执行。执行语句5和6不影响Z[0]和Z[1]的取值。执行语句5导致Z[2]值在第17 ns变为0。执行语句1导致Abar

在第16 ns被重新赋值。由于Abar的改变,反过来又导致Z[0]值在第18 ns 变为1。

请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式

是隐式而非显式的建模方式。此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。

2.4 行为描述方式

设计的行为功能使用下述过程语句结构描述:

1) initial语句:此语句只执行一次。

2) always语句:此语句总是循环执行, 或者说此语句重复执行。

只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。

下例为always语句对1位全加器电路建模的示例。

module FA_Seq (A, B, Cin, Sum, Cout);

input A, B, Cin;

output Sum, Cout;

reg Sum, Cout;

reg T1, T2, T3;

always

@ ( A or B or Cin ) begin

Sum = (A ^ B) ^ Cin;

T1 = A & Cin;

T2 = B & Cin;

T3 = A & B;

Cout = (T1 T2) T3;

end

endmodule

模块FA_Seq 有三个输入和两个输出。由于Sum、Cout、T1、T2和T3

在always 语句中被赋值,它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要A、B或Cin 上发生事件,即A、B或Cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always 语句再次等待A、B或Cin上发生的事件。

在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。

时延可以细分为两种类型:

1) 语句间时延: 这是时延语句执行的时延。

2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。

下面是语句间时延的示例:

Sum = (A ^ B) ^ Cin;

#4 T1 = A & Cin;

在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。

Sum = #3 (A^ B) ^ Cin;

这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给Sum。

如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以及在always 语句中指定语句的其他形式将在第8章中详细讨论。

下面是initial语句的示例:

`timescale 1ns / 1ns

module Test (Pop, Pid);

output Pop, Pid;

reg Pop, Pid;

initial

begin

Pop = 0; // 语句 1。

Pid = 0; // 语句 2。

Pop = #5 1; // 语句 3。

Pid = #3 1; // 语句 4。

Pop = #6 0; // 语句 5。

Pid = #2 0; // 语句 6。

end

endmodule

initial语句包含一个顺序过程。这一顺序过程在0 ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0 ns 时执行。第三条语句也在0时刻执行,导致Pop 在第5 ns时被赋值。语句4在第5 ns执行,并且Pid 在第8 ns被赋值。同样,Pop在14 ns被赋值0,Pid在第16 ns被赋值0。第6条语句执行后,initial语句永远被挂起。2.5 结构化描述形式

在Verilog HDL中可使用如下方式描述结构:

1) 内置门原语(在门级);

2) 开关级原语(在晶体管级);

3) 用户定义的原语(在门级);

4) 模块实例 (创建层次结构)。

通过使用线网来相互连接。下面的结构描述形式使用内置门原语描述的全加器电路实例。

module FA_Str (A, B, Cin, Sum, Cout);

input A, B, Cin;

output Sum, Cout;

wire S1, T1, T2, T3;

xor

X1 (S1, A, B),

X2 (Sum, S1, Cin);

and

A1 (T3, A, B),

A2 (T2, B, Cin),

A3 (T1, A, Cin),

or

O1 (Cout, T1, T2, T3);

endmodule

在这一实例中,模块包含门的实例语句,也就是说包含内置门xor、and 和or 的实例语句。门实例由线网类型变量S1、T1、T2和T3互连。由于没有指定的顺序, 门实例语句可以以任何顺序出现;图中显示了纯结构;xor、and和or是内置门原语;X1、X2、A1等是实例名称。紧跟在每个门后的信号列表是它的互连;列表中的第一个是门输出,余下的是输入。例如,S1与xor 门实例X1的输出连接,而A和B与实例X1的输入连接。

4位全加器可以使用4个1位全加器模块描述。下面是4位全加器的结构描述形式。

module FourBitFA (FA, FB, FCin, FSum, FCout );

parameter SIZE = 4;

input [SIZE:1] FA, FB;

output [SIZE:1] FSum

input FCin;

input FCout;

wire [ 1: SIZE-1] FTemp;

FA_Str

FA1( .A (FA[1]), .B(FB[1]), .Cin(FCin),

.Sum(FSum[1]), .Cout(FTemp[2])),

FA2( .A (FA[2]), .B(FB[2]), .Cin(FTemp[1]),

.Sum(FSum[2]), .Cout(FTemp[2])),

FA3(FA[3], FB[3], FTemp[2], FSum[3], FTemp[3],

FA4(FA[4], FB[4], FTemp[3], FSum[4], FCout);

endmodule

在这一实例中,模块实例用于建模4位全加器。在模块实例语句中,端口可以与名称或位置关联。前两个实例FA1和FA2使用命名关联方式,也就是说,端口的名称和它连接的线网被显式描述(每一个的形式都为

“.port_name (net_name))。最后两个实例语句,实例FA3和FA4使用位置关联方式将端口与线网关联。这里关联的顺序很重要,例如,在实例FA4中,第一个FA[4]与FA_Str 的端口A连接,第二个FB[4]与FA_Str 的端口B连接,余下的由此类推。

2.6 混合设计描述方式

在模块中,结构的和行为的结构可以自由混合。也就是说,模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及always语句和initial语句的混合。它们之间可以相互包含。来自always语句和initial 语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。

下面是混合设计方式的1位全加器实例。

module FA_Mix (A, B, Cin, Sum, Cout);

input A,B, Cin;

output Sum, Cout;

reg Cout;

reg T1, T2, T3;

wire S1;

xor X1(S1, A, B); // 门实例语句。

always

@ ( A or B or Cin ) begin // always 语句。

T1 = A & Cin;

T2 = B & Cin;

T3 = A & B;

Cout = (T1 T2) T3;

end

assign Sum = S1 ^ Cin; // 连续赋值语句。

endmodule

只要A或B上有事件发生,门实例语句即被执行。只要A、B或Cin上有事件发生,就执行always 语句,并且只要S1或Cin上有事件发生,就执行连续赋值语句。

2.7 设计模拟

Verilog HDL不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。激励和控制可用初始化语句产生。验证运行过程中的响应可以作为“变化时保存”或作为选通的数据存储。最后,设计验证可以通过在初始化语句中写入相应的语句自动与期望的响应值比较完成。下面是测试模块Top的例子。该例子测试2.3节中讲到的FA_Seq模块。

‘timescale 1ns/1ns

module Top; // 一个模块可以有一个空的端口列表。

reg PA, PB, PCi;

wire PCo, PSum;

// 正在测试的实例化模块:

FA_Seq F1(PA, PB, PCi, PSum, PCo); // 定位。

initial

begin: ONLY_ONCE

reg [3:0] Pal;

//需要4位, Pal才能取值8。

for (Pal = 0; Pal < 8; Pal = Pal + 1)

begin

{PA, PB, PCi} = Pal;

#5 $display (“PA, PB, PCi = %b%b%b”, PA, PB, PCi,

“ : : : PCo, PSum=%b%b”, PCo, PSum);

end

end

endmodule

在测试模块描述中使用位置关联方式将模块实例语句中的信号与模块

中的端口相连接。也就是说,PA连接到模块FA_Seq的端口A,PB连接到模块FA_Seq的端口B,依此类推。注意初始化语句中使用了一个for循环语句,

在PA、PB和PCi上产生波形。for 循环中的第一条赋值语句用于表示合并的目标。自右向左,右端各相应的位赋给左端的参数。初始化语句还包含有一个预先定义好的系统任务。系统任务$display将输入以特定的格式打印输出。

系统任务$display调用中的时延控制规定$display任务在5个时间单位后执行。这5个时间单位基本上代表了逻辑处理时间。即是输入向量的加载至观察到模块在测试条件下输出之间的延迟时间。

这一模型中还有另外一个细微差别。Pal在初始化语句内被局部定义。为完成这一功能,初始化语句中的顺序过程(begin-end)必须标记。在这种情况下, ONLY_ONCE是顺序过程标记。如果在顺序过程内没有局部声明的变量,就不需要该标记。下面是测试模块产生的输出。

PA, PB, PCi = 000 ::: PCo, PSum = 00

PA, PB, PCi = 001 ::: PCo, PSum = 01

PA, PB, PCi = 010 ::: PCo, PSum = 01

PA, PB, PCi = 011 ::: PCo, PSum = 10

PA, PB, PCi = 100 ::: PCo, PSum = 01

PA, PB, PCi = 101 ::: PCo, PSum = 10

PA, PB, PCi = 110 ::: PCo, PSum = 10

PA, PB, PCi = 111 ::: PCo, PSum = 11

验证与非门交叉连接构成的RS_FF模块的测试模块如下例所示。

`timescale 10ns/1ns

module RS_FF (Q, Qbar, R, S);

output Q, Qbar;

input R, S;

nand #1 (Q, R, Qbar);

nand #1 (Qbar, S, Q,);

//在门实例语句中,实例名称是可选的。

endmodule

module Test;

reg TS, TR;

wire TQ, TQb;

//测试模块的实例语句:

RS_FF NSTA (.Q(TQ), .S(TS), .R(TR), .Qbar(TQb));

//采用端口名相关联的连接方式。

// 加载激励:

initial

begin:

TR = 0;

TS = 0;

#5 TS = 1;

#5 TS = 0;

TR = 1;

#5 TS = 1;

TR = 0;

#5 TS = 0;

#5 TR = 1;

end

//输出显示:

initial

$monitor ("At time %t ," , $time,

"TR = %b, TS=%b, TQ=%b, TQb= %b", TR, TS, TQ, TQb);

endmodule

RS_FF模块描述了设计的结构。在门实例语句中使用门时延;例如,第一个实例语句中的门时延为1个时间单位。该门时延意味着如果R或Qbar 假定在T时刻变化,Q将在T+1时刻获得计算结果值。

模块Test是一个测试模块。测试模块中的RS_FF用实例语句说明其端口用端口名关联方式连接。在这一模块中有两条初始化语句。第一个初始化语句只简单地产生TS和TR上的波形。这一初始化语句包含带有语句间时延的程序块过程赋值语句。

第二条初始化语句调用系统任务$monitor。这一系统任务调用的功能是只要参数表中指定的变量值发生变化就打印指定的字符串。下面是测试模块产生的输出。请注意`timescale指令在时延上的影响。

At time 0, TR=0, TS=0, TQ=x, TQb= x

At time 10, TR=0, TS=0, TQ=1, TQb= 1

At time 50, TR=0, TS=1, TQ=1, TQb= 1

At time 60, TR=0, TS=1, TQ=1, TQb= 0

At time 100, TR=1, TS=0, TQ=1, TQb= 0

At time 110, TR=1, TS=0, TQ=1, TQb= 1

At time 120, TR=1, TS=0, TQ=0, TQb= 1

At time 150, TR=0, TS=1, TQ=0, TQb= 1

At time 160, TR=0, TS=1, TQ=1, TQb= 1

At time 170, TR=0, TS=1, TQ=1, TQb= 0

At time 200, TR=0, TS=0, TQ=1, TQb= 0

At time 210, TR=0, TS=0, TQ=1, TQb= 1

At time 250, TR=1, TS=0, TQ=1, TQb= 1

At time 260, TR=1, TS=0, TQ=0, TQb= 1

后面的章节将更详细地讲述这些主题。

习题

1. 在数据流描述方式中使用什么语句描述一个设计?

2. 使用`timescale 编译器指令的目的是什么?举出一个实例。

3. 在过程赋值语句中可以定义哪两种时延?请举例详细说明。

4. initial语句与always 语句的关键区别是什么?

5. 为2.3节中描述的模块Decode2x4编写一个测试验证程序。

6. 列出你在Verilog HDL模型中使用的两类赋值语句。

7. 在顺序过程中何时需要定义标记?

8. 找出下面连续赋值语句的错误。

assign Reset = #2 ^ WriteBus;

本章介绍Verilog

HDL的基本要素,包括标识符、注释、数值、编译程序指令、系统任务和系统函数。另外,本章还介绍了Verilog硬件描述语言中的两种数据类型。

3.1 标识符

Verilog

HDL中的标识符(identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下是标识符的几个例子:

Count

COUNT //与Count不同。

_R1_D2

R56_68

FIVE$

转义标识符(escaped identifier )可以在一条标识符中包含任何可打印字符。转义标识符以/

(反斜线)符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。下面例举了几个转义标识符:

/7400

/.*.$

/{******}

/~Q

/OutGate 与OutGate相同。

最后这个例子解释了在一条转义标识符中,反斜线和结束空格并不是转义标识符的一部分。也就是说,标识符/OutGate 和标识符OutGate 恒等。

Verilog HDL定义了一系列保留字,叫做关键词,它仅用于某些上下文中。

附录A列出了语言中的所有保留字。注意只有小写的关键词才是保留字。例如,标识符always(这是个关键词)与标识符ALWAYS(非关键词)是不同的。

另外,转义标识符与关键词并不完全相同。标识符/initial 与标识符initial(这是个关键词)不同。注意这一约定与那些转义标识符不同。

3.2 注释

在Verilog HDL中有两种形式的注释。

/*第一种形式:可以扩展至

多行 */

//第二种形式:在本行结束。

3.3 格式

Verilog HDL区分大小写。也就是说大小写不同的标识符是不同的。此外,Verilog

HDL是自由格式的,即结构可以跨越多行编写,也可以在一行内编写。白空(新行、制表符和空格)没有特殊意义。下面通过实例解释说明。

initial begin Top = 3' b001; #2 Top = 3' b011; end 和下面的指令一样:

initial

begin

Top = 3' b001;

#2 Top = 3' b011;

end

可综合的Verilog语法子集总汇

常用的RTL语法结构如下: ☆模块声明:module……endmodule ☆端口声明:input,output,inout(inout的用法比较特殊,需要注意) ☆信号类型:wire,reg,tri等,integer常用语for语句中(reg,wire时最常用的,一般tri和integer 不用) ☆参数定义:parameter ☆运算操作符:各种逻辑操作符、移位操作符、算术操作符大多时可综合的(注:===与!==是不可综合的) ☆比较判断:if……else,case(casex,casez)……default endcase ☆连续赋值:assign,问号表达式(?:) ☆always模块:(敏感表可以为电平、沿信号posedge/negedge;通常和@连用) ☆begin……end(通俗的说,它就是C语言里的“{ }”) ☆任务定义:task……endtask ☆循环语句:for(用的也比较少,但是在一些特定的设计中使用它会起到事半功倍的效果) ☆赋值符号:= 和<= (阻塞和非阻塞赋值,在具体设计中时很有讲究的) 可综合的语法时verilog可用语法里很小的一个子集,用最精简的语句描述最复杂的硬件,这也正是硬件描述语言的本质。对于做RTL级设计来说,掌握好上面这些基本语法是很重要。 相信大家在看了这么多了verilog语法书籍以后一定有点烦了,那么现在我告诉大家一个好消息,对于一个RTL级的设计来说,掌握了上面的语法就已经足够了,无论多么牛逼的工程师,在他的代码

里无非也就是上面一些语法而已。当然了,对于一个能够进行很好的仿真验证的代码,一般还需要在RTL级的设计代码中添加一些延时之类的语句,比如大家一定知道#10的作用,就是延时10个单位时间,这个语句虽然在仿真的时候是实实在在的延时,但是这个语句在综合后是会被忽略的,也就是说在我们综合并且布局布线最后烧进FPGA里,这个#10的延时是不会在硬件上实现的。所以说,上面给出的这些语法才是可以最后在硬件上实现的,其它的语法大多会在综合后被忽略。这么一来大家就要问了,为什么语法书里又要给出这么多的语法呢?呵呵,它们大都是为仿真验证是写testbench 准备的,先点到为止,下集继续! 对于模型(module)的建立,要保证可综合性应该注意: (1)不使用initial。(被忽略) (2)不使用#10。(被忽略) (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。(10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。

数字系统设计与verilog HDL课程设计

数字系统设计与verilog HDL课程设计 设计题目:实用多功能数字钟 专业:电子信息科学与技术 班级:0313410 学号:031341025 姓名:杨存智 指导老师:黄双林

摘要 本课程设计利用QuartusII软件Verilog VHDL语言的基本运用设计一个多功能数字钟,经分析采用模块化设计方法,分别是顶层模块、alarm、alarm_time、counter_time、clk50mto1、led、switch、bitel、adder、sound_ddd、sound_ddd_du模块,再进行试验设计和软件仿真调试,分别实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能。 单个模块调试达到预期目标,再将整体模块进行试验设计和软件仿真调试,已完全达到分块模式设计功能,并达到设计目标要求。 关键字:多功能数字钟、Verilog、模块、调试、仿真、功能

目录 1.课程设计的目的及任务............................................................. 错误!未定义书签。 1.1 课程设计的目的 (3) 1.2 课程设计的任务与要求 (4) 2.课程设计思路及其原理 (4) 3.QuartusII软件的应用 (5) 3.1工程建立及存盘 (5) 3.2工程项目的编译 (5) 3.3时序仿真 (6) 4.分模块设计、调试、仿真与结果分析 (7) 4.1 clk50mto1时钟分频模块 (7) 4.2 adder加法器模块 (7) 4.3 hexcounter16 进制计数器模块 (7) 4.4 counter_time 计时模块 (8) 4.5 alarm闹铃模块 (8) 4.6 sound_ddd嘀嘀嘀闹铃声模块 (9) 4.7 sound_ddd_du嘀嘀嘀—嘟声音模块 (9) 4.8 alarm_time闹钟时间设定模块 (10) 4.9 bitsel将输出解码成时分秒选择模块 (10) 4.10 switch去抖模块 (11) 4.11 led译码显示模块 (11) 4.12 clock顶层模块 (12) 5.实验总结 (13) 5.1调试中遇到的问题及解决的方法 (13) 5.2实验中积累的经验 (14) 5.3心得体会 (14) 6.参考文献 (14) 1.1 课程设计的目的 通过课程设计的锻炼,要求学生掌握V erilog HDL语言的一般设计方法,掌握VerilogHDL语言的基本运用,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,基于实践、源于实践,实践出真知,实践检验真理,培养学生的

verilog基本语法

Verilog基本语法 【逻辑值】 逻辑0 表示低电平,GND 逻辑1 表示高电平,VCC 逻辑X 表示未知电平,可能是高电平,也可能是低电平 逻辑Z 表示高阻态,外部没有激励信号,是一个悬空状态 注:高阻态的实质:电路分析时高阻态可做开路理解。 可以把它看作输出(输入)电阻非常大,对下级电路无任何影响。 若为0、x、z则按照假处理;若为1,按真处理。 【进制】 二进制4'b0101 —4位二进制数0101 十进制数4’d2 —4位十进制数2 十六进制数4’ha —4位十六进制数a Verilog中若不指定位宽,默认32位;若不指定位宽不指定进制,默认32位宽的十进制数。 【标识符】 标识符可以是字母、数字、$和_(下划线)的组合,且开头必须是字母或下划线,区分大小写。不建议大小写混合使用。 【数据类型】 寄存器关键字reg,默认初始值位不定值X; reg[31:0] delay_cnt; //[31:0],指定寄存器位宽32位, reg key_reg; // 默认位宽为1. reg类型数据只能在always和initial语句中被赋值。 线网表示结构实体的物理连线,包括wire和tri类型 参数常量,用parameter定义。 parameter H_SYNC = 11'd41; 【运算符】 [条件操作符] ?: 例,a?b:c //如果a为真就选b,否则选择c。 result=(a>=b)?a:b; [逻辑运算符] !&& || [位运算符] ~ & | ^(按位异或) a&b; //自动将位宽小的数高位补零至较大数的位宽,然后按位与操作。[移位运算符] << >> 用0填补移出的空位。左移时位宽增加,右移位宽不变。 [位拼接运算符] {} 例,{a,b} //将a和b拼接起来,作为一个新信号,a为高位。 c={a,b[3:0]}; //a、b位宽均为8位,c为8+4=12位。

verilog课程设计—交通灯

课程论文 论文题目基于DE2的交通灯设计完成时间 课程名称Verilog语言设计 任课老师 专业 年级

1.交通信号控制器设计要求与思路 1.1设计背景 FPGA是一种用户根据各自需要而自行构造逻辑功能的数字集成电路,其种类很多,内部结构也不同,但共同的特点是体积小、使用方便。本文介绍了用VerilogHDL语言设计交通灯控制器的方法,并在QuartusII系统对FPGA芯片进行编译下载,由于生成的是集成化的数字电路,没有传统设计中的接线问题,所以故障率低、可靠性高,而且体积非常小。本文通过EDA设计,利用VerilogHDL语言模拟仿真交通灯控制电路。 1.2设计要求 根据交通灯控制器要实现的功能,考虑用两个并行执行的always语句来分别控制A方向和B方向的3盏灯。这两个always语句使用同一个时钟信号,以进行同步,也就是说,两个进程的敏感信号是同一个。每个always语句控制一个方向的3种灯按如下顺序点亮,并往复循环:绿灯----黄灯----红灯,每种灯亮的时间采用一个减法计数器进行计数,计数器用同步预置数法设计,这样只需改变预置数据,就能改变计数器的模,因此每个方向只要一个计数器进行预置数就可以。为便于显示灯亮的时间,计数器的输出均采用BCD码,显示由4个数码管来完成,A方向和B方向各用两个数码管。设定A方向红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s,B方向的红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s。假如要改变这些时间,只需要改变计数器的预置数即可。 1.3设计思路 两个方向各种灯亮的时间能够进行设置和修改,此外,假设B方向是主干道,车流量大,因此B方向通行的时间应该比A方向长。交通灯控制器的状态转换表见下表。表中,1表示灯亮,0表示灯不亮。A方向和B方向的红黄绿分别用R1、Y1、G1、R2、Y2、G2来表示。

FPGA夏宇闻Verilog学习笔记1

V erilog 数字系统设计教程 学习笔记 1 FPGA 学习 由于工作上的需要,现在又开始学习新的芯片,估计以后会在FPGA 和DSP 这两个方向有发展,以前学的ARM 现在可以待业休息了等待新的起点。虽然大学的时候学习过《EDA 技术与VHDL 》这门课程,但是我至今才知道VHDL 语言是FPGA 的设计语言之一。有一个好的指导老师是非常重要的,进入公司后由于实行的是导师制,指导我的导师就让我看《V erilog 数字系统设计教程》,学习一样东西有一本好书是非常重要的,就如同学习C 语言看谭浩强老师的教程,同样学习FPGA 看夏宇闻老师的书一样,确实学到了很多东西,而且会一直研读。 不管学习单片机,ARM ,DSP 还是FPGA 上机练习是非常重要的,所以在学习夏宇闻老师的教程时我就把书中的上机练习题自己练习一遍,并做简要的记录。 设计平台:Quartus II 11.1sp2 Web Edition 仿真平台:ModelSin10.0c Starter Editon 上机练习一 简单的组合逻辑设计 由于是第一个练习,我会将具体的软件使用过程都列出来,方便同我一样的学习者学习。 1、建立一个新的工程 弹出对话框,直接 Next

设置工程目录F:/FPGA V erilog test/lesson1,工程名compare,顶层设计模块名compare 如果你已经有一些要加入工程的文件,可以再该步将文件加入到工程中,没有则直接Next 这一步是选择你需要的设计芯片,由于我们只学习V erilog语言,所以芯片选择随意

V erilog 数字系统设计教程 学习笔记 3 选择仿真语言和综合工具 最后显示我们选择的信息,确认填写是否正确

基于VerilogHDL语言的可综合性设计

基于Verilog HDL语言的可综合性设计 1 引言 逻辑综合带来了数字设计行业的革命,有效地提高了生产率,减少了设计周期时间。在手动转换设计的年代,设计过程受到诸多限制,结更容易带来人为的错误。而一个小小的错误就导致整个模块需进行重新设计,设计转换工作占去了整个设计周期的大部分时间,验证工作进行困难,设计技术无法重用等等。而自动逻辑综合工具的出现,突破了上述种种限制,使得设计者从繁琐的转换工作中解脱出来,将更多的时间用于验证和优化,不仅保证了功能的实现,而且有利于提高性能。可见,综合在逻辑设计中具有举足轻重的作用。 2 综合的概念及其过程 2.1 逻辑综合概述 综合就是在给定标准元件库和一定的设计约束条件下,把用语言描述的电路模型转换成门级网表的过程。要完成一次综合过程,必须包含三要素:RTL级描述、约束条件和工艺库。 2.2 RTL级描述 RTL级描述是以规定设计中采用各种寄存器形式为特征,然后在寄存器之间插入组合逻辑,其可以用如图1所示的“寄存器和云图”方式来表示。 图1 RTL级描述 2.3 约束条件 为了控制优化输出和映射工艺要用约束,它为优化和映射试图满足的工艺约束提供了目标,并且它们控制设计的结构实现方式。目前综合工具中可用的约束包括面积、速度、功耗和可测性约束,未来我们或许会看到对封装的约束和对布图的约束等,但是,目前的最普遍的约束是按面积和按时间的约束。 时钟限制条件规定时钟的工作频率,面积限制条件规定该设计将花的最大面积。综合工具将试图用各种可能的规则和算法尽可能地满足这些条件。 2.4 工艺库 按照所希望的逻辑行为功能和有关的约束建立设计的网表时,工艺库持有综合工具必须的全部信息。工艺库含有允许综合进程为建立设计做正确选择的全部信息,工艺库不仅含有ASIC单元的逻辑功能,而且还有该单元的面积、单元输入到输出的定时关系、有关单元扇出的某种限制和对单元所需的定时检查。

Verilog HDL数字时钟课程设计

课程设计报告 课程设计名称:EDA课程设计课程名称:数字时钟 二级学院:信息工程学院 专业:通信工程 班级:12通信1班 学号:1200304126 姓名:@#$% 成绩: 指导老师:方振汉 年月日

目录 第一部分 EDA技术的仿真 (3) 1奇偶校验器 (3) 1.1奇偶校验器的基本要求 (3) 1.2奇偶校验器的原理 (3) 1.3奇偶校验器的源代码及其仿真波形 (3) 28选1数据选择器 (4) 2.18选1数据选择器的基本要求 (4) 2.28选1数据选择器的原理 (4) 2.38选1数据选择器的源代码及其仿真波形 (5) 34位数值比较器 (6) 3.14位数值比较器的基本要求 (6) 3.24位数值比较器的原理 (6) 3.34位数值比较器的源代码及其仿真波形 (7) 第二部分 EDA技术的综合设计与仿真(数字时钟) (8) 1概述 (8) 2数字时钟的基本要求 (9) 3数字时钟的设计思路 (9) 3.1数字时钟的理论原理 (9) 3.2数字时钟的原理框图 (10) 4模块各功能的设计 (10) 4.1分频模块 (10) 4.2计数模块(分秒/小时) (11) 4.3数码管及显示模块 (13) 5系统仿真设计及波形图........................... 错误!未定义书签。5 5.1芯片引脚图.................................... 错误!未定义书签。5 5.2数字时钟仿真及验证结果 (16) 5.3数字时钟完整主程序 (17) 6课程设计小结 (23) 7心得与体会 (23) 参考文献 (24)

FPGA CPLD设计学习笔记(特权同学完整版)

1、FPGA\CPLD设计学习笔记(特权同学完整版) 题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD 来的,首先对整理者表示感谢。这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一个有志于FPGA/CPLD方面发展的工程师学习的。 1、硬件设计基本原则 (1)、速度与面积平衡和互换原则:一个设计如果时序余量较大,所能跑的频率远高于设计要求,能可以通过模块复用来减少整个设计消耗的芯片面积,这就是用速度优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么可以通过数据流串并转换,并行复制多个操作模块,对整个设计采用“乒乓操作”和“串并转换”的思想进行处理,在芯片输出模块处再对数据进行“并串转换”。从而实现了用面积复制换取速度的提高。 (2)、硬件原则:理解HDL本质 (3)、系统原则:整体把握 (4)、同步设计原则:设计时序稳定的基本原则 2、Verilog作为一种HDL语言,对系统行为的建模方式是分层次的。比较重要的层次有系统级(system)、算法级(Algorithm)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)、电路开关级(Switch)。 3、实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。一般常用case语句代替。 4、if…else…和case在嵌套描述时是有很大区别的,if…else…是有优先级的,一般来说,第一个if的优先级最高,最后一个else的优先级最低。而case语句是平行语句,它是没有优先级的,而建立优先级结构需要耗费大量的逻辑资源,所以能用case的地方就不要用if…else…语句。 补充:1.也可以用if…; if…; if…;描述不带优先级的“平行”语句。(但是这样容易引入锁存器) 5、FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富。 6、FPGA和CPLD的组成: FPGA基本有可编程I/O单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等6部分组成。 CPLD的结构相对比较简单,主要由可编程I/O单元、基本逻辑单元、布线池和其他辅助功能模块组成。 7、Block RAM: 3种块RAM结构,M512 RAM(512bit)、M4K RAM(4Kbit)、M-RAM(64Kbit). M512 RAM:适合做一些小的Buffer、FIFO、DPRAM、SPRAM、ROM等; M4K RAM: 适用于一般的需求 M-RAM: 适合做大块数据的缓冲区。 Xlinx 和Lattice FPGA的LUT可以灵活配置成小的RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM。补充:但是在一般的设计中,不提倡用FPGA/CPLD的片内资源配置成大量的存储器,这是处于成本的考虑。所以尽量采用外接存储器。

Verilog课程设计

一.实验目的 (1)学习RISC_CPU的基本结构和原理; (2)了解Verilog HDL仿真和综合工具的潜力; (3)展示Verilog设计方法对软/硬件联合设计和验证的意义; (4)学习并掌握一些常用的Verilog语法和验证方法。 二.实验原理 CPU即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为两个步骤: (1)将数据和程序(即指令序列)输入计算机的存储器中。 (2)从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控制计算机的各个部件并执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下基本功能。 ①取指令——当程序忆在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。 ②分析指令——即指令译码,这是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。 ③执行指令——根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。 将CPU的功能进一步细化,可概括如下: (1)能对指令进行译码并执行规定的动作; (2)可以进行算术和逻辑运算; (3)能与存储器和外设交换数据; (4)提供整个系统所需要的控制。 尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:(1)算术逻辑运算部件(ALU); (2)累加器; (3)程序计数器;

(4)指令寄存器和译码器; (5)时序和控制部件。 三.实验内容 通过我们自己动手,设计出一个CPU的软核和固核。这个CPU是一个简化的专门为教学目的而设计的RISC_CPU。在设计中我们不但关心CPU总体设计的合理性,而且还使得构成这个RISC_CPU的每一个模块不仅是可仿真的也都可以综合成门级网表。因而从物理意义上说,这也是一个能真正通过具体电路结构而实现的CPU。为了能在这个虚拟的CPU上运行较为复杂的程序并进行仿真,把寻址空间规定为8K(即13们地址线)字节。 四.实验代码 1.源代码 //----------------------------------clk_gen.v------------------------------ `timescale 1ns/1ns //时间单位1ns,时间单位1ns module clk_gen(clk,reset,fetch,alu_ena); //模块名clk_gen,参数列表(clk,reset,fetch,alu_ena)input clk,reset; //输入clk,reset output fetch,alu_ena; //输出fetch,alu_ena wire clk,reset; //wire型变量clk,reset reg fetch,alu_ena; //reg寄存器型变量fetch,alu_ena reg[7:0]state; //reg寄存器型变量8位的state parameter S1=8'b00000001,S2=8'b00000010,S3=8'b00000100,S4=8'b00001000,S5=8'b00010000,S6=8'b001 00000,S7=8'b01000000,S8=8'b10000000,idle=8'b00000000; //参数型定义8位二进制常量s1,s2,s3,s4,s5,s6,s7,s8,idle always@(posedge clk) //always块时钟触发 if(reset) //如果reset为真 begin //执行begin,and顺序块 fetch<=0; //fetch非阻塞赋值赋为0 alu_ena<=0; //alu_ena非阻塞赋值赋为0 state<=idle; //idle非阻塞赋值给state end else //reset为假执行下面begin语句 begin case(state) //case表达式(state) S1:begin alu_ena<=1; //alu_ena非阻塞赋值赋为1 state<=S2; //state非阻塞赋值赋为S2 end S2:begin alu_ena<=0; //alu_ena非阻塞赋值赋为0 state<=S3; //state非阻塞赋值赋为S3 end

verilog综合心得

综合:不可综合的运算符:= = = ,!= =,/(除法),%(取余数)。 1、不使用初始化语句。 2、不使用带有延时的描述。 3、不使用循环次数不确定的循环语句,如:forever、while等。 4、尽量采用同步方式设计电路。 5、除非是关键路径的设计,一般不调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 6、用always过程块描述组合逻辑,应在信号敏感列表中列出所有的输入信号。 7、所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 8、在verilog模块中,任务(task)通常被综合成组合逻辑的形式,每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。 9、用户自定义原语(UDP)是不可综合的,它只能用来建立门级元件的仿真模型。 一般综合工具支持的V erilog HDL结构

移位运算符:V erilog HDL提供向右(>>)及向左(<<)两种运算符,运算符高位或地位一旦移出即予丢弃,其空缺的位则予以补零。 连续赋值语句(assign)、case语句、if…else语句都是可以综合的 initial 语句内若包含有多个语句时,必须以begin end 作聚合;单一的初值赋值,因此并不需以begin end做聚合。 循环(Loops)并不能单独地在程序中存在,而必须在initial和always块中才能使用。initial过程块中的语句仅执行一次,而always块中的语句是不断重复执行的。 编写顶层模块的注意事项 每个端口除了要声明是输入、输出还是双向外,还要声明其数据类型,是连线型(wire)还是寄存器型(reg),如果没有声明则综合器默认为wire型。 1、输入和双向端口不能声明为寄存器型。 2、在测试模块中不需要定义端口。 编写testbentch所归纳的心得

基于Verilog的课程设计

基于Verilog的课程设计 直流电机的PWM控制 指导老师:翁嘉民 班级:1031电气自动化技术成员:李高峰9112 王俊才9186 孟令朋9143

目录 1.绪论 (3) 直流电机介绍 (3) 1.1.1直流电机的特点 (3) 1.1.2直流电机的应用 (3) 介绍 (4) 介绍 (4) V ERILOG HDL硬件描述语言 (5) 1.4.1V ERILOG HDL硬件描述语言介绍 (5) 1.4.2V ERILOG HDL功能 (5) PWM脉冲宽度调制介绍 (6) 直流电机的PWM控制 (7) 2.设计原理 (8) 设计原理框图 (8) 原理图 (9) 模块设计 (9) 2.3.1 MOTO_TEST模块 (9) 2.3.4计数器模块 (12) 7实训心得 (13) 参考文献 (13)

直流电机的PWM控制器的设计 1.绪论 直流电机介绍 直流电机是实现直流电能与机械能之间相互转换的一种电力机械,按照直流电机的用途分为直流电动机和直流发电机两类。能够将机械能转换成直流电能的电机称为直流发电机;能够将直流电能转换成机械能的电机称为直流电动机。 1.1.1直流电机的特点 从直流电机与交流电机相比中可以看出,直流电机具有优良的调速性能和启动性能。直流电机具有宽广的调速范围,平滑的无级调速特性,可实现频繁的无级快速启动、制动和反转;过载能力大,能承受频繁的冲击负载;能满足自动化生产系统中各种特殊运行的要求。而直流发电机则能提供无脉动的大功率直流电源,且输出电压可以精确地调节和控制。 1.1.2直流电机的应用 直流电机是交通、工矿、建筑等行业中的常见动力机械,是机电行业人员的重要工作对象和工具。在某些要求调速范围广、速度快、精密度高、控制性能优异的场合,直流电机的应用目前仍占有较大的比重,如大型可逆式轧钢机、内燃机车、矿井卷扬机、造纸和印刷机械、宾馆高速电梯、城市电车、电动自行车、龙门刨床、电力机车、地铁列车、船舶机械、大型精密机床和大型起重机等生产机械中。

verilog语句可综合vs不可综合

1)所有综合工具都支持的结构: always,assign,begin,end,case,wire,tri,supply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 2)所有综合工具都不支持的结构: time,defparam,$finish,fork,join,initial,delays,UDP,wait。 3)有些工具支持有些工具不支持的结构: casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: 1)不使用initial。 2)不使用#10。 3)不使用循环次数不确定的循环语句,如forever、while等。 4)不使用用户自定义原语(UDP元件)。 5)尽量使用同步方式设计电路。 6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对

Verilog HDL课程设计

人民武装学院Verilog HDL课程设计洗衣机控制器的设计 学生姓名: 周云 学号: PB102027115 专业: 电子信息科学与技术 年级: 2010 级 指导老师: 周骅老师 时间: 2011年12月22日

目录 引言...................................................................................................................... - 3 - 一、设计内容...................................................................................................... - 4 - 1.设计内容.................................................................................................... - 4 - 2.功能............................................................................................................ - 4 - 二、洗衣机控制器的工作原理.......................................................................... - 6 - 1. 洗衣机的工作状态.................................................................................. - 6 - 2. 全自动洗衣过程...................................................................................... - 7 - 3.单独执行某个洗衣程序............................................................................ - 8 - 三、洗衣机的状态转换图.................................................................................. - 9 - 1.洗衣机的状态转换图................................................................................ - 9 - 2. 设计思路.................................................................................................. - 9 - 四、设计程序.................................................................................................... - 11 - 1.全自动洗衣机主程序.............................................................................. - 11 - 2.全自动洗衣机测试程序.......................................................................... - 15 - 五、步骤及仿真图............................................................................................ - 17 - 1.在代码提示框架中完成核心子模块wash_ctrl.v的设计 ................... - 17 - 2.对核心子模块wash_ctrl.v 进行时序仿真 ........................................... - 17 - 六、功能图........................................................................................................ - 20 - 1.设计顶层图形文件,编译.................................................................... - 20 - 2.功能引脚锁定.......................................................................................... - 20 - 心得体会............................................................................................................ - 22 -

capture学习笔记

Capture Allegro学习笔记 Allegro中常见的文件格式 .brd 工具:PCB Design Expert PCB布线 .ddb 工具:Protel .art 工具:CAM350 Allegro PCB Design file/impot ARTwork .d 工具:pads2005 .drl 工具:Protel .opj 设计项目工程 .olb 创建新的元件库 allegro/APD.jrl :记录开启Allegro/APD 期间每一个执行动作的command . 产生在每一次新开启Allegro/APD 的现行工作目录下 .env :存在pcbenv 下,无扩展名,环境设定档. allegro/APD.ini :存在pcbenv 下,记录menu 的设定. allegro/APD.geo :存在pcbenv 下,记录窗口的位置. master.tag :开启Allegro/APD 期间产生的文字文件,记录最后一次存盘的database文件名称,下次开启Allegro/APD 会将档案load 进来. 从Allegro/APD.ini搜寻directory = 即可知道Master.tag 存在的位置 . lallegro.col :存在pcbenv 下,从设定颜色的调色盘Read Local 所写出的档案.只会影响到调色盘的24 色而不会影响class/subclass 的设定. .brd :board file (Allegro). .mcm :multi-chip module (APD) ,design file. .log :记录数据处理过程及结果. .art :artwork 檔. .txt :文字文件,如参数数据,device 文件 .. 等. .tap :NC drill 的文字文件. .dat :资料文件. .scr :script 或macro 记录文件. .pad :padstack 檔. .dra :drawing 档, create symbol 前先建drawing ,之后再compiled 成

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课程设计—交通灯1

课程设计 课程名称__EDA技术综合设计与实践__ 题目名称交通灯控制系统 学生学院信息工程学院 专业班级通信工程08(4) 学号 3108002925 学生姓名高高 指导教师李学易 2011 年12 月26 日

基于FPGA 的交通灯控制器的设计 摘要:Verilog 是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的CPLD 结构,成为设计专用集成电路和其他集成电路的主流。现代城市在日常运行控制中,越来越多的使用红绿灯对交通进行指挥和管理。而一套完整的交通灯控制系统通常要实现自动控制和手动控制去实现其红绿灯的转换。 基于FPGA 设计的交通灯控制系统电路简单、可靠性好。本设计利用Verilog HDL 语言、采用层次化混合输入方式,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。在QUARTUSⅡ下对系统进行了综合与仿真。仿真结果表明系统可实现十字路口红绿灯及左转弯控制和倒计时显示,并能够自动控制交通灯转变。通过应用Verilog HDL 对交通灯控制器的设计,达到对Verilog HDL 的理解 关键词:FPGA;交通灯自动控制;V erilog HDL;Quartus Ⅱ 1.交通信号控制器设计要求与思路 1.1设计要求 在交通灯系统中(图1),路口1、2、3、4均需要红、黄、绿、左转四盏灯(用RYGL分别表示) ,并且每个路口都需要一个倒数的计时器,假设绿灯每次维持的时间是40 s ,黄灯为5 s ,左转灯10s,红灯60s,黄灯亮时以一定的频率闪动。交通灯系统大多是自动控制来指挥交通的,但有时需要由交警手动控制红绿灯,所以要求设 计的该交通信号系统需要具有该功能。 实现设计目标如下: (1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿交通信号灯,通过电路对十字路口的两组交通灯的状态实现自动循环控制; (2)实现东西车道和南北车道上的车辆交替运行,绿灯每次维持的时间是40 s ,黄灯为5 s ,左转灯10s,红灯60s; (3)要求黄灯亮5 秒后,红灯才能转为绿灯,黄灯亮时以一定的频率闪动; (4)东西车道和南北车道每次通行的时间不同且可调; 图1 交通灯系统示意图

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

LCD1602显示源程序如下: module lcd1602(input clk, //60M input rst_n, output lcd_p, //Backlight Source + lcd屏幕背光 output lcd_n, //Backlight Source - output reg lcd_rs, //0:write order; 1:write data output lcd_rw, //0:write data; 1:read data output reg lcd_en, //negedge 在lcd_en下降沿需保证数据有效 output reg [7:0] lcd_data); mux16 mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done));//端口名称关联 //--------------------lcd1602 order---------------------------- parameter Mode_Set = 8'h31, //功能设置, Cursor_Set = 8'h0c, //光标设置 Address_Set = 8'h06, //输入模式设置 Clear_Set = 8'h01; //清屏设置 /****************************LCD1602 Display Data****************************/ wire [7:0] data_r0,data_r1,data_r2; //乘数、被乘数 wire [15:0]data0,data1; //结果显示 wire [31:0]data2; wire [7:0] addr; //write address wire start,done; assign data_r0 = 8'h30 + data0[7:0] ; // 8'h30在LCD1602上显示值为0。 assign data_r1 = 8'h30 + data1[7:0] ; assign data_r2 = 8'h30 + data2[7:0]; //-------------------address------------------ assign addr = 8'h80; /****************************LCD1602 Driver****************************/ //-----------------------lcd1602 clk_en--------------------- reg [31:0] cnt; reg lcd_clk_en; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin cnt <= 1'b0; lcd_clk_en <= 1'b0;

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