数字系统设计与Verilog HDL 下载本文

模24方向可控计数器电路

lpm_counter计数器功能仿真波形

锁相环电路

功能仿真波形 习 题

4.1 采用Quartus II软件的宏功能模块lpm_counter设计一个模为60的加法计数器,进行编译和仿真,查看仿真结果。

4.2 采用Quartus II软件的宏功能模块lpm_rom,用查表的方式设计一个实现两个8位无符号数加法的电路,并进行编译和仿真。

4.3 先利用LPM_ROM设计4位×4位和8位×8位乘法器各一个,然后用Verilog语言分别设计4位×4位和8位×8位乘法器,比较两类乘法器的运行速度和资源耗用情况。

4.4 用数字锁相环实现分频,假定输入时钟频率为10MHz,想要得到6MHz的时钟信号,试用altpll宏功能模块实现该电路。

第5章 Verilog HDL设计初步

5.2 Verilog设计举例

【例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 p36

Verilog程序的特点

(1)Verilog程序是由模块构成的。每个模块的内容都嵌在module和endmodule两个关键字之间;每个模块实现特定的功能;模块是可以进行层次嵌套的。

(2)每个模块首先要进行端口定义,并说明输入和输出口(input、output或inout),然后对模块功能进行描述。

(3)Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。 (4)除了endmodule等少数语句外,每个语句的最后必须有分号。

(5)可以用 /*??*/ 和 //?? 对Verilog程序作注释。好的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。 p37

Verilog 模块的模板

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 p38

习 题

5.1 用Verilog设计一个8位加法器,并进行综合和仿真,查看综合结果和仿真结果。 5.2 用Verilog设计一个8位计数器,并进行综合和仿真,查看综合结果和仿真结果。

第6章 Verilog HDL语法与要素

标识符(Identifiers) 标识符(Identifiers)

Verilog中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。 Examples: count

COUNT //COUNT与count是不同的 _A1_d2 //以下划线开头 R56_68 FIVE p41 ◆ 整数 ◆ 实数 ◆ 字符串 6.2 常量

程序运行中,值不能被改变的量称为常量(constants),Verilog中的常量主要有如下3种类型: p42

整数按如下方式书写: +/- '

即 +/-<位宽>'<进制><数字>

size 为对应二进制数的宽度;base为进制;value是基于进制的数字序列。 进制有如下4种表示形式: ◆ 二进制(b或B)

◆ 十进制(d或D或缺省) ◆ 十六进制(h或H) ◆ 八进制(o或O) 整数(integer) p43

Examples:

8'b11000101 //位宽为八位的二进制数11000101 8'hd5 //位宽为八位的十六进制数d5; 5'O27 //5位八进制数 4'D2 //4位十进制数2 4'B1x_01 //4位二进制数1x01 5'Hx //5位x(扩展的x),即xxxxx 4'hZ //4位z,即zzzz

8□'h□2A /*在位宽和'之间,以及进制和数值之间允许出现空格,但'和进制之间,数值间是不允许出现空格的,比如8'□h2A、8'h2□A等形式都是不合法的写法 */ 整数(integer) p44

实数(Real)有下面两种表示法。

◆ 十进制表示法。例如: 2.0

0.1 //以上2例是合法的实数表示形式 2. //非法:小数点两侧都必须有数字 ◆ 科学计数法。例如:

43_5.1e2 //其值为43510.0

9.6E2 //960.0 (e与E相同) 5E-4 //0.0005 实数(Real) p45

6.3 数据类型

Verilog有下面四种基本的逻辑状态。 ◆ 0:低电平、逻辑0或逻辑非 ◆ 1:高电平、逻辑1或“真” ◆ x或X:不确定或未知的逻辑状态 ◆ z或Z:高阻态

Verilog中的所有数据类型都在上述4类逻辑状态中取值,其中x和z都不区分大小写,也就是说,值0x1z与值0X1Z是等同的。

数据类型(Data Type)是用来表示数字电路中的物理连线、数据存储和传输单元等物理量的。 p46 net型

Net型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持续赋值语句assign对其进行赋值。 wire是最常用的Net型变量。 wire型变量的定义格式如下:

wire 数据名1,数据名2,??数据名n;

例如: wire a,b; //定义了两个wire型变量a和b Examples:

wire[7:0] databus; //databus的宽度是8位 wire[19:0] addrbus; //addrbus的宽度是20位 p47

Variable型

variable型变量必须放在过程语句(如initial、always)中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号也必须定义成variable型。

注意:variable型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,variable型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。

reg型变量是最常用的一种variable型变量。定义格式如下: reg 数据名1,数据名2,??数据名n;

例如:reg a,b; //定义了两个reg型变量a,b Examples:

reg[7:0] qout; //定义qout为8位宽的reg型向量 reg[8:1] qout; p48

6.4 参数(parameter) 在Verilog语言中,用参数parameter来定义符号常量,即用parameter来定义一个标志符代表一个常量。参数常用来定义时延和变量的宽度。 其定义格式如下:

parameter 参数名1=表达式1,参数名2=表达式2,参数名3=表达式3, ?? ; 例如:

parameter sel=8,code=8'ha3;

//分别定义参数sel代表常数8(10进制),参数code代表常量a3(16进制) p49

6.5 向量 1.标量与向量

宽度为1位的变量称为标量,如果在变量声明中没有指定位宽,则默认为标量(1位)。举例如下:

wire a; //a为标量

reg clk; //clk为标量reg型变量

线宽大于1位的变量(包括net型和variable型)称为向量(vector)。向量的宽度用下面的形式定义: [msb : lsb] 比如:

wire[3:0] bus; //4位的总线 p50

6.6 运算符(Operators)

1.算术运算符(Arithmetic operators) 常用的算术运算符包括: + 加 - 减 * 乘 / 除 % 求模 p51

2.逻辑运算符(Logical operators) && 逻辑与 || 逻辑或 ! 逻辑非 p52

3.位运算符(Bitwise operators)

位运算,即将两个操作数按对应位分别进行逻辑运算。 ~ 按位取反 & 按位与 | 按位或 ^ 按位异或