Verilog HDL语言设计实验指导书(2004)

更新时间:2024-03-26 14:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

第1章 课程简介,实验项目及学时安排 ............................................ 1 第2章 实验设备简介 ....................................................................................... 2 第3章 Verilog HDL语言设计课程实验 .............................................. 3

实验一 简单的组合逻辑和时序逻辑的设计 ...................................................................................................... 3 实验二 复杂时序逻辑电路的设计 ..................................................................................................................... 8 实验三 函数和任务的应用设计 ...................................................................................................................... 14 实验四 有限状态机(FSM)的设计 ............................................................................................................... 20 实验五 基于模块多层次引用的结构化电路设计 ............................................................................................. 26

1

第1章 课程简介,实验项目及学时安排

1.课程简介

本课程是电子信息工程和通信工程两个专业的选修专业课。Verilog HDL程序设计是电子信息类专业学生在学习完数字电子技术和微机原理与接口技术后的选修专业课程,主要内容是学习利用Verilog HDL进行数字逻辑电路和系统的开发和设计。

通过对该课程的学习,学生应该掌握Verilog HDL的词法、语法、句法,可综合程序的编写,仿真程序的编写,一般数字逻辑的实现,复杂数字逻辑和算法的实现,并能够初步的利用Verilog HDL进行数字逻辑电路和系统的设计,并对寄存器传输级(RTL)上的数字设计有所掌握和理解。

Verilog HDL语言设计是一门理论与实践联系紧密的课程,所以本课程安排5个实验,以帮助学生掌握Verilog HDL程序设计技术,提高学生分析问题和解决问题的能力,并通过实验培养学生的创新意识。

本实验课的基本要求如下:

1.学会用Verilog HDL语言编写数字电路和系统的程序,通过上机实习加深对课堂所学知识的理解; 2.上机前应按照要求把实验内容准备好,即编好程序及需要改变的参数,能预计出可能出现的结果; 3.观察实验结果,得出结论; 4.实验结束时提交实验报告。

2.实验项目及学时安排

序号 1 项目 简单的组合逻辑和时序逻辑的设计 学时 验证 2 √ 实验性质 综合 设计 2 3 4 5 复杂时序逻辑电路的设计 函数和任务的应用设计 有限状态机(FSM)的设计 基于模块多层次引用的结构化电路设计 2 2 2 2 √ √ √ √

1

第2章 实验设备简介

1.Modelsim6.0和Sypnify Pro7.3及以上版本EDA软件

Modelsim是美国Mentor Graphics公司的子公司Model Technology的产品,属于编译型的Verilog/VHDL混合型仿真器。Mentor Graphics公司是世界最著名的从事电子设计自动化(EDA)系统设计、制造、销售和服务的厂家之一。Modelsim可以在同一个设计中单独或混合使用Verilog和VHDL,允许Verilog模块调用VHDL的实体,或VHDL调用Verilog。由于Modelsim是编译型仿真器,使用编译后的HDL库进行仿真,因此在进行仿真前,必须编译所有的待仿真的HDL文件成为HDL仿真库,在编译时使源文件获得优化,提高了仿真速度。Modelsim 可以完成三个层次的Verilog仿真,分别为RTL级仿真、综合后门级仿真、适配后门级仿真。因为其功能的强大和完善,Modelsim已成为基于PC机Windows平台的最流行的HDL仿真和验证工具。

Synplify Pro/Synplify是由位于美国加州的Synplicity公司推出的专门用于FPGA/CPLD的逻辑综合工具,它支持Verilog HDL和VHDL高层次设计描述,在综合优化方面性能优异,应用广泛。Synplify Pro/Synplify支持Verilog 1364-1995标准,能以很高的效率将Verilog设计文件转换为针对选定器件的标准网表,并提供相应设计环境的配置文件,在综合后还可以生成Verilog仿真网表,以便对原设计进行功能仿真。

需要指出的是,最专业和强大的EDA软件都是基于服务器的UNIX软件,限于已有条件,本课程只能选择PC机Windows平台下最流行的Modelsim 和Synplify Pro这两种分别用于仿真和综合的EDA软件。

2.计算机系统(PC机)

系统配置的基本需求:

CPU: Intel奔腾系列,或AMD Athlon/XP; 操作系统:Windowns NT/2000/XP; 内存:256M或以上;

显卡:支持256色的8位显卡或以上; 硬盘:20G以上。

2

第3章 Verilog HDL语言设计课程实验

实验一 简单的组合逻辑和时序逻辑的设计

一、实验目的

1、掌握基本组合逻辑电路的实现方法,掌握连续赋值语句和条件赋值语句的使用方法; 2、掌握基本时序逻辑电路的实现,掌握always语句的使用方法。

二、实验原理、内容及步骤

1、简单组合逻辑设计

描述组合逻辑电路通常利用assign连续赋值语句的数据流方式。连续赋值语句将值赋给线网(连续赋值不能为寄存器赋值)。连续赋值语句只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算,如果结果值有变化,新结果就赋给左边的线网。

连续赋值的目标类型如下:1) 标量线网;2) 向量线网;3) 向量的常数型位选择;4) 向量的常数型部分选择;5) 上述类型的任意的拼接运算结果。

组合逻辑设计示例:可综合的数据比较器。它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。描述组合逻辑时常使用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

测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。

3

begin end

j <= 0;

F500K <= ~F500K;

else

j <= j+1;

endmodule

end

测试模块源代码:

//--------------- fdivision_Top.v ------------------------ `timescale 1ns/100ps `define clk_cycle 50 module division_Top;

reg F10M_clk,RESET; wire F500K_clk; always

#`clk_cycle F10M_clk = ~ F10M_clk; initial

begin

RESET=1; F10M=0; #100 RESET=0; #100 RESET=1; #10000 $stop;

end

fdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk)); endmodule 仿真波形:

2.设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别

非阻塞赋值语句(<=)右端表达式计算完后并不立即赋值给左端,而是同时启动下一条语句继续执行,而阻塞赋值语句(=)在每个右端表达式计算完成后立即赋值给左端变量。非阻塞赋值不能用于

9

assign语句中,而只能用于对寄存器型变量进行赋值,只能在intial和always等过程过程块中。阻塞赋值既能用于assign语句,也能用于intial和always等过程赋值中。对于时序逻辑的描述和建模,应尽量使用非阻塞赋值方式。若在同一个always过程块中描述时序和组合逻辑混合电路时也最好使用非阻塞赋值方式。

在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。

可综合设计中阻塞赋值和非阻塞赋值设计要点:

1)非阻塞赋值不能用于assign持续赋值中,一般只出现在initial和always等过程块中,对reg型变量进行赋值;

2)当用always块来描述组合逻辑时,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值;

3)在向函数funtion的返回值赋值时,应使用阻塞赋值;

4)不能在一个以上的always过程块中对同一个变量赋值,这样会引起冲突,在综合时会报错; 5)在一个模块中,严禁对同一个变量既进行阻塞赋值,又进行非阻塞赋值,这样会在综合时报错;

6)对时序逻辑的描述和建模,应尽量使用非阻塞赋值方式,此外,若在同一个always过程块中描述时序和组合逻辑混合电路时,最好使用非阻塞赋值方式。

阻塞赋值与非阻塞赋值示例:分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块blocking.v和non_blocking.v来阐明两者之间的区别。 模块源代码:

// ------------- blocking.v --------------- module blocking(clk,a,b,c);

output [3:0] b,c; input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk)

begin b = a; c = b;

$display(\

end

endmodule

//------------- non_blocking.v ------------------- module non_blocking(clk,a,b,c);

10

output [3:0] b,c;

input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk) end

begin b <= a; c <= b;

$display(\

endmodule 测试模块源代码:

//------------- compareTop.v ----------------------------- `timescale 1ns/100ps `include \`include \module compareTop;

wire [3:0] b1,c1,b2,c2;

reg [3:0] a; reg clk; initial

begin end

clk = 0;

forever #50 clk = ~clk;

initial

begin a = 4'h3;

$display(\# 100 a = 4'h7;

$display(\# 100 a = 4'hf;

$display(\# 100 a = 4'ha;

$display(\# 100 a = 4'h2;

11

end

$display(\# 100 $display(\$stop;

non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);

endmodule 仿真波形(部分):

三、实验设备及实验注意事项

1.Modelsim6.0和Sypnify Pro7.3及以上版本EDA软件

Modelsim是美国Mentor Graphics公司的子公司Model Technology的产品,属于编译型的Verilog/VHDL混合型仿真器。Mentor Graphics公司是世界最著名的从事电子设计自动化(EDA)系统设计、制造、销售和服务的厂家之一。Modelsim可以在同一个设计中单独或混合使用Verilog和VHDL,允许Verilog模块调用VHDL的实体,或VHDL调用Verilog。由于Modelsim是编译型仿真器,使用编译后的HDL库进行仿真,因此在进行仿真前,必须编译所有的待仿真的HDL文件成为HDL仿真库,在编译时使源文件获得优化,提高了仿真速度。Modelsim 可以完成三个层次的Verilog仿真,分别为RTL级仿真、综合后门级仿真、适配后门级仿真。因为其功能的强大和完善,Modelsim已成为基于PC机Windows平台的最流行的HDL仿真和验证工具。

Synplify Pro/Synplify是由位于美国加州的Synplicity公司推出的专门用于FPGA/CPLD的逻辑综合工具,它支持Verilog HDL和VHDL高层次设计描述,在综合优化方面性能优异,应用广泛。Synplify Pro/Synplify支持Verilog 1364-1995标准,能以很高的效率将Verilog设计文件转换为针对选定器件的标准网表,并提供相应设计环境的配置文件,在综合后还可以生成Verilog仿真网表,以便对原设计进行功能仿真。

需要指出的是,最专业和强大的EDA软件都是基于服务器的UNIX软件,限于已有条件,本课程只能选择PC机Windows平台下最流行的Modelsim 和Synplify Pro这两种分别用于仿真和综合的EDA软件。

2.计算机系统(PC机) 系统配置的基本需求:

CPU: Intel奔腾系列,或AMD Athlon/XP;

12

操作系统:Windowns NT/2000/XP; 内存:256M或以上;

显卡:支持256色的8位显卡或以上; 硬盘:20G以上。

四、实验报告要求

1、简要描述Verilog HDL中条件语句的使用,阻塞性赋值和非阻塞性赋值的区别和使用要点; 2、实验报告应包括Modelsim环境下仿真得到的波形。

五、预习要求及思考题

1.分析阻塞性赋值和非阻塞性赋值的区别和使用要点; 2.10M的时钟,设计一个单周期形状如下的周期波形。

20μs 10μs 20μs 13

实验三 函数和任务的应用设计

一 、实验目的

1、掌握函数在模块设计中的使用;

2、掌握任务在结构化Verilog HDL设计中的应用。

二、实验原理、内容及步骤

1、 函数在模块设计中的使用

函数可以在模块不同位置执行共同代码。函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其它的任务。

函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函数。 函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定。如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为1位二进制数。函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值必须出现在函数定义中。

函数调用是表达式的一部分。与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在函数的多个调用之间保持它们的值。

下例是函数调用的一个简单示范,采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算。并且在测试模块中,通过调用系统任务$display在时钟的下降沿显示每次计算的结果。

模块源代码:

module tryfunct(clk,n,result,reset);

output[31:0] result; input[3:0] n; input reset,clk; reg[31:0] result;

always @(posedge clk) //clk的上沿触发同步运算。

begin

if(!reset) //reset为低时复位。

result<=0;

else

14

begin end

result <= n * factorial(n)/((n*2)+1);

end

function [31:0] factorial; //函数定义。

input [3:0] operand; reg [3:0] index; begin end

factorial = operand ? 1 : 0;

for(index = 2; index <= operand; index = index + 1) factorial = index * factorial;

endfunction

endmodule

测试模块源代码: `include \`timescale 1ns/100ps `define clk_cycle 50 module tryfuctTop;

reg[3:0] n,i; reg reset,clk; wire[31:0] result; initial

begin end

n=0; reset=1; clk=0; #100 reset=0; #100 reset=1; for(i=0;i<=15;i=i+1)

begin end

#200 n=i;

#100 $stop;

always #`clk_cycle clk=~clk;

15

tryfunct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset)); endmodule

上例中函数factorial(n)实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计中,我们不希望设计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是,我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。

仿真波形(部分):

2、 任务在结构化设计中的应用

一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以包含时序控制,即时延控制,并且任务也能调用其它任务和函数。

任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义在模块说明部分中编写。

任务调用:

? 一个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变量值; ? 任务调用语句是过程性语句,可以在always 语句或initial 语句中使用;

? 任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序匹配。

此外,参数要按值传递,不能按地址传递;

? 任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值;

? 任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器类型的; ? 任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出时才传

递给调用参数。

实例应用:利用task和电平敏感的always块设计比较后重组信号的组合逻辑。可以看到,利用task非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余逻辑等问题。

模块源代码:

//----------------- sort4.v ------------------ module sort4(ra,rb,rc,rd,a,b,c,d);

output[3:0] ra,rb,rc,rd; input[3:0] a,b,c,d; reg[3:0] ra,rb,rc,rd; reg[3:0] va,vb,vc,vd;

16

always @ (a or b or c or d)

begin end

{va,vb,vc,vd}={a,b,c,d};

sort2(va,vc); //va 与vc互换。 sort2(vb,vd); //vb 与vd互换。 sort2(va,vb); //va 与vb互换。 sort2(vc,vd); //vc 与vd互换。 sort2(vb,vc); //vb 与vc互换。 {ra,rb,rc,rd}={va,vb,vc,vd};

task sort2;

inout[3:0] x,y; reg[3:0] tmp; if(x>y)

begin end

tmp=x; //x与y变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。 x=y; y=tmp;

endtask

endmodule

值得注意的是task中的变量定义与模块中的变量定义不尽相同,它们并不受输入输出类型的限制。如此例,x与y对于task sort2来说虽然是inout型,但实际上它们对应的是always块中变量,都是reg型变量。

测试模块源代码: `timescale 1ns/100ps `include \module task_Top;

reg[3:0] a,b,c,d;

wire[3:0] ra,rb,rc,rd; initial

begin

a=0;b=0;c=0;d=0; repeat(5) begin

#100 a ={$random};

17

end

b ={$random}; c ={$random}; d ={$random};

#100 $stop;

sort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd));

endmodule

仿真波形(部分):

三、 实验设备及实验注意事项

1.Modelsim6.0和Sypnify Pro7.3及以上版本EDA软件

Modelsim是美国Mentor Graphics公司的子公司Model Technology的产品,属于编译型的Verilog/VHDL混合型仿真器。Mentor Graphics公司是世界最著名的从事电子设计自动化(EDA)系统设计、制造、销售和服务的厂家之一。Modelsim可以在同一个设计中单独或混合使用Verilog和VHDL,允许Verilog模块调用VHDL的实体,或VHDL调用Verilog。由于Modelsim是编译型仿真器,使用编译后的HDL库进行仿真,因此在进行仿真前,必须编译所有的待仿真的HDL文件成为HDL仿真库,在编译时使源文件获得优化,提高了仿真速度。Modelsim 可以完成三个层次的Verilog仿真,分别为RTL级仿真、综合后门级仿真、适配后门级仿真。因为其功能的强大和完善,Modelsim已成为基于PC机Windows平台的最流行的HDL仿真和验证工具。

Synplify Pro/Synplify是由位于美国加州的Synplicity公司推出的专门用于FPGA/CPLD的逻辑综合工具,它支持Verilog HDL和VHDL高层次设计描述,在综合优化方面性能优异,应用广泛。Synplify Pro/Synplify支持Verilog 1364-1995标准,能以很高的效率将Verilog设计文件转换为针对选定器件的标准网表,并提供相应设计环境的配置文件,在综合后还可以生成Verilog仿真网表,以便对原设计进行功能仿真。

需要指出的是,最专业和强大的EDA软件都是基于服务器的UNIX软件,限于已有条件,本课程只能选择PC机Windows平台下最流行的Modelsim 和Synplify Pro这两种分别用于仿真和综合的EDA软件。

18

2.计算机系统(PC机) 系统配置的基本需求:

CPU: Intel奔腾系列,或AMD Athlon/XP; 操作系统:Windowns NT/2000/XP; 内存:256M或以上;

显卡:支持256色的8位显卡或以上; 硬盘:20G以上。

四、实验报告要求

1、简要描述Verilog HDL中任务和函数的区别和使用要点;

2、实验报告应包括Modelsim环境下仿真得到的波形和Synplify Pro环境下综合得到RTL级电路图。

五、预习要求及思考题

1、分析Verilog HDL中任务和函数的区别和使用要点;

2、设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和阶乘的运算。编写测试模块,并给出仿真波形。

3、设计一个模块,通过任务完成3个8位2进制输入数据的冒泡排序。要求:时钟触发任务的执行,每个时钟周期完成一次数据交换的操作。

19

实验四 有限状态机(FSM)的设计

一 、实验目的

1、了解FSM的应用范围和两种类型的不同特点; 2、掌握FSM的电路结构和设计要点。

二、实验原理、内容及步骤

1、 FSM相关概念和设计要点

FSM适合于设计数字系统的控制模块。用Verilog HDL的case/if-else等语句能很好地描述基于状态机的设计。状态机可以认为是组合逻辑和时序逻辑的特殊组合。时序逻辑部分用于存贮状态,组合电路用于状态译码和产生输出信号。状态机的下一个状态不仅与输入信号有关,还与状态寄存器当前所处的状态有关。

状态机分为Mealy和Moore两种类型,前者的输出只是当前状态的函数,也就是状态的转换与输入信号无关,后者的输出则是当前状态和当前输入的函数,即状态的转换与输入信号有关。

状态机的表示方法:状态图、状态表和流程图。 状态机设计要点

? 一般采用同步时序方式,在时钟信号的触发下完成状态转移;

? 起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁、高效,有的

综合器会自动为状态机的设计选择一个最佳的起始状态; ? 状态编码的方式主要有二进制编码、格雷编码和一位热码编码等:

?

二进制编码(Binary State Machine):采用普通的二进制数代表每个状态,如4个状态state0/state1/state2/state3对应编码为00/01/10/11。这种编码的缺点是相邻状态的转换有可能有多个比特发生变化(如01->10),瞬变次数多,容易产生毛刺,引起逻辑错误;

?

格雷编码(Gray Code State Machine): 4个状态state0/state1/state2/state3对应编码为00/01/11/10即为格雷编码方式。格雷码节省逻辑单元,而且在状态的顺序转换中相邻状态每次只有一个比特发生变化,这样减少了瞬变的次数,也减少了产生毛刺和一些暂态的可能。

?

一位热码编码(One-Hot State Machine Encoding):采用n位来编码具有n个状态的状态机 。如4个状态state0/state1/state2/state3对应编码为1000/0100/0010/0001。采用一位热码编码,虽然多用了触发器,但可以有效节省和简化组合电路。对于寄存器数量多而门逻辑相对缺乏的FPGA来说,采用一位热码编码可以有效地提高电路地速度和可靠性,也有利于提高器件资源的利用率。因此,对于FPGA器件,建议采用这种编码方式。采用这种编码

20

会出现一些多余的状态,即一些无效的状态,需要增加default分支项,以便这些状态下能自动回到起始状态。

? 状态编码的定义可以用parameter或者`define语句。建议采用前者。尽量采用同步电路设计;

`define state0 2’b00 //不要加分号 `define state1 2’b01 …. case (state)

`state0: …; //不能少“`” ….

? 状态转换一般使用case/casex/casez描述。Case语句比if-else语句更清晰明了。此外,case

语句的最后不要忘了default分支语句以避免锁存器的产生。

2、状态机设计实例

功能是检测一个5位二进制序列“10010”。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。

模块源代码: //seqdet.v

module seqdet(x,z,clk,rst,state);

input x,clk,rst; output z; output[2:0] state; reg[2:0] state; wire z;

parameter IDLE='d0, A='d1, B='d2,C='d3, D='d4,E='d5, F='d6,G='d7;

assign z = ( state==E && x==0 )? 1 : 0; //当x=0时,状态已变为E, //状态为D时,x仍为1。因此

//输出为1的条件为( state==E && x==0 )。

always @(posedge clk)

if(!rst)

begin end

state <= IDLE;

else

casex(state)

IDLE : if(x==1)

begin

21

end

state <= A;

A: if(x==0)

begin end

state <= B;

B: if(x==0)

begin end

state <= C;

else

begin end

state <= F;

C: if(x==1)

begin end

state <= D;

else

begin end

state <= G;

D: if(x==0)

begin end

state <= E;

else

begin end

state <= A;

E: if(x==0)

begin end

state <= C;

else

begin

22

end

state <= A;

F: if(x==1)

begin end

state <= A;

else

begin end

state <= B;

G: if(x==1)

begin end

state <= F;

default:state=IDLE; //缺省状态为初始状态。

endcase

endmodule

测试模块源代码:

//------------------ seqdet.v ------------------- `timescale 1ns/1ns `include \module seqdet_Top;

reg clk,rst; reg[23:0] data; wire[2:0] state; wire z,x;

assign x=data[23]; always #10 clk = ~clk; always @(posedge clk)

data={data[22:0],data[23]};

initial

begin

clk=0; rst=1; #2 rst=0;

23

end

#30 rst=1;

data ='b1100_1001_0000_1001_0100; #500 $stop;

seqdet m(x,z,clk,rst,state);

endmodule 仿真波形:

三、 实验设备及实验注意事项

1.Modelsim6.0和Sypnify Pro7.3及以上版本EDA软件

Modelsim是美国Mentor Graphics公司的子公司Model Technology的产品,属于编译型的Verilog/VHDL混合型仿真器。Mentor Graphics公司是世界最著名的从事电子设计自动化(EDA)系统设计、制造、销售和服务的厂家之一。Modelsim可以在同一个设计中单独或混合使用Verilog和VHDL,允许Verilog模块调用VHDL的实体,或VHDL调用Verilog。由于Modelsim是编译型仿真器,使用编译后的HDL库进行仿真,因此在进行仿真前,必须编译所有的待仿真的HDL文件成为HDL仿真库,在编译时使源文件获得优化,提高了仿真速度。Modelsim 可以完成三个层次的Verilog仿真,分别为RTL级仿真、综合后门级仿真、适配后门级仿真。因为其功能的强大和完善,Modelsim已成为基于PC机Windows平台的最流行的HDL仿真和验证工具。

Synplify Pro/Synplify是由位于美国加州的Synplicity公司推出的专门用于FPGA/CPLD的逻辑综合工具,它支持Verilog HDL和VHDL高层次设计描述,在综合优化方面性能优异,应用广泛。Synplify Pro/Synplify支持Verilog 1364-1995标准,能以很高的效率将Verilog设计文件转换为针对选定器件的标准网表,并提供相应设计环境的配置文件,在综合后还可以生成Verilog仿真网表,以便对原设计进行功能仿真。

需要指出的是,最专业和强大的EDA软件都是基于服务器的UNIX软件,限于已有条件,本课程只能选择PC机Windows平台下最流行的Modelsim 和Synplify Pro这两种分别用于仿真和综合的EDA软件。

2.计算机系统(PC机) 系统配置的基本需求:

CPU: Intel奔腾系列,或AMD Athlon/XP; 操作系统:Windowns NT/2000/XP;

24

内存:256M或以上;

显卡:支持256色的8位显卡或以上; 硬盘:20G以上。

四、实验报告要求

1、简要描述Verilog HDL中状态机的相关概念和设计要点;

2、实验报告应包括Modelsim环境下仿真得到的波形和Synplify Pro环境下综合得到RTL级电路图。

五、预习要求及思考题

1、分析Verilog HDL中状态机的设计要点;

2、设计一个串行数据检测器。要求是:连续4个或4个以上的1时输出为1,其他输入情况下为0。编写测试模块并给出仿真波形。

25

实验五 基于模块多层次引用的结构化电路设计

一 、实验目的

1、了解复杂电路与系统的“top-down”设计思想; 2、掌握简单多层次电路的描述方法。

二、实验原理、内容及步骤

1、多层次结构电路的设计

复杂数字系统可采用“top-down”的方法进行设计:首先把系统分为几个模块,每个模块在分为几个子模块,依次类推,知道易于实现为止。

这种“top-down”的方法能够把复杂的设计分为许多简单的设计来实现,同时也适合于多人进行合作开发。

多层次结构电路的描述既可以采用文本方式,也可以采用图形和文本混合设计的方式。 被调用模块的指定方式:1)文件复制方式;2)使用`include语句;3)库管理方式。 2、 设计实例分析

这个实例的功能是将并行数据转化为串行数据送交外部电路编码,并将解码后得到的串行数据转化为并行数据交由CPU处理。显而易见,这实际上是两个独立的逻辑功能,分别设计为独立的模块,然后再合并为一个模块显得目的明确、层次清晰。

模块源代码

// ---------------- p_to_s.v --------------------------------- module p_to_s(D_in,T0,data,SEND,ESC,ADD_100);

output D_in,T0; // D_in是串行输出,T0是移位时钟并给

// CPU中断,以确定何时给出下个数据。

[7:0] data; //并行输入的数据。

SEND,ESC,ADD_100; //SEND、ESC共同决定是否进行并到串

input input

//的数据转化。ADD_100决定何时置数。

wire D_in,T0;

reg [7:0] DATA_Q,DATA_Q_buf;

assign T0 = ! (SEND & ESC); //形成移位时钟。. assign D_in = DATA_Q[7]; //给出串行数据。

always @(posedge T0 or negedge ADD_100) //ADD_100下沿置数,T0上沿移位。

26

begin

if(!ADD_100)

DATA_Q = data;

else

begin end

DATA_Q_buf = DATA_Q<<1; //DATA_Q_buf作为中介,以令综合器 DATA_Q = DATA_Q_buf; //能辨明。

end

endmodule

在p_to_s.v中,由于移位运算虽然可综合,但是不是简单的RTL级描述,直接用DATA_Q<=DATA_Q<<1的写法在综合时会令综合器产生误解。另外,在该设计中,由于时钟T0的频率较低,所以没有象以往那样采用低电平置数,而是采用ADD_100的下降沿置数。

//--------------------- s_to_p.v --------------------------- module s_to_p(T1, data, D_out,DSC,TAKE,ADD_101);

output T1; //给CPU中断,以确定CPU何时取转化 //得到的并行数据。 output [7:0] data;

input D_out, DSC, TAKE, ADD_101; //D_out提供输入串行数据。DSC、TAKE //共同决定何时取数。 wire [7:0] data; wire T1,clk2;

reg [7:0] data_latch, data_latch_buf;

assign clk2 = DSC & TAKE ; //提供移位时钟。 assign T1 = !clk2;

assign data = (!ADD_101) ? data_latch : 8'bz; always @(posedge clk2) begin

data_latch_buf = data_latch << 1; //data_latch_buf作缓冲 data_latch = data_latch_buf; //,以令综合器能辩明。 data_latch[0] = D_out; end

endmodule

将上面的两个模块合并起来的sys.v的源代码: //------------------- sys.v ---------------------------

27

`include \`include \

module sys(D_in,T0,T1, data, D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101);

input D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101; inout [7:0] data; output D_in,T0,T1; p_to_s

p_to_s(.D_in(D_in),.T0(T0),.data(data),.SEND(SEND),.ESC(ESC),.ADD_100(ADD_100)); s_to_p

s_to_p(.T1(T1),.data(data),.D_out(D_out),.DSC(DSC),.TAKE(TAKE),.ADD_101(ADD_101)); endmodule

测试模块源代码:

//-------------Top test file for sys.v ------------------ `timescale 1ns/100ps `include \module Top;

reg D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101; reg[7:0] data_buf; wire [7:0] data; wire clk2;

assign data = (ADD_101) ? data_buf : 8'bz;

//data在sys中是inout型变量,ADD_101 //控制data是作为输入还是进行输出。

assign clk2 =DSC && TAKE; initial

begin

SEND = 0; ESC = 0; DSC = 1; TAKE = 1; ADD_100 = 1; ADD_101 = 1;

end

initial

begin

data_buf = 8'b10000001;

28

end

#90 ADD_100 = 0; #100 ADD_100 = 1;

always

begin end

#50;

SEND = ~SEND; ESC = ~ESC;

initial

begin end

#1500 ; SEND = 0; ESC = 0; DSC = 1; TAKE = 1; ADD_100 = 1; ADD_101 = 1; D_out = 0; #1150 ADD_101 = 0; #100 ADD_101 =1; #100 $stop;

always

begin end

#50 ; DSC = ~DSC; TAKE = ~TAKE;

always @(negedge clk2) D_out = ~D_out;

sys sys(.D_in(D_in),.T0(T0),.T1(T1),.data(data),.D_out(D_out),

.ADD_101(ADD_101), .SEND(SEND),.ESC(ESC),.DSC(DSC), .TAKE(TAKE),.ADD_100(ADD_100));

endmodule 仿真波形:

29

三、 实验设备及实验注意事项

1.Modelsim6.0和Sypnify Pro7.3及以上版本EDA软件

Modelsim是美国Mentor Graphics公司的子公司Model Technology的产品,属于编译型的Verilog/VHDL混合型仿真器。Mentor Graphics公司是世界最著名的从事电子设计自动化(EDA)系统设计、制造、销售和服务的厂家之一。Modelsim可以在同一个设计中单独或混合使用Verilog和VHDL,允许Verilog模块调用VHDL的实体,或VHDL调用Verilog。由于Modelsim是编译型仿真器,使用编译后的HDL库进行仿真,因此在进行仿真前,必须编译所有的待仿真的HDL文件成为HDL仿真库,在编译时使源文件获得优化,提高了仿真速度。Modelsim 可以完成三个层次的Verilog仿真,分别为RTL级仿真、综合后门级仿真、适配后门级仿真。因为其功能的强大和完善,Modelsim已成为基于PC机Windows平台的最流行的HDL仿真和验证工具。

Synplify Pro/Synplify是由位于美国加州的Synplicity公司推出的专门用于FPGA/CPLD的逻辑综合工具,它支持Verilog HDL和VHDL高层次设计描述,在综合优化方面性能优异,应用广泛。Synplify Pro/Synplify支持Verilog 1364-1995标准,能以很高的效率将Verilog设计文件转换为针对选定器件的标准网表,并提供相应设计环境的配置文件,在综合后还可以生成Verilog仿真网表,以便对原设计进行功能仿真。

需要指出的是,最专业和强大的EDA软件都是基于服务器的UNIX软件,限于已有条件,本课程只能选择PC机Windows平台下最流行的Modelsim 和Synplify Pro这两种分别用于仿真和综合的EDA软件。

2.计算机系统(PC机) 系统配置的基本需求:

CPU: Intel奔腾系列,或AMD Athlon/XP; 操作系统:Windowns NT/2000/XP; 内存:256M或以上;

显卡:支持256色的8位显卡或以上; 硬盘:20G以上。

四、实验报告要求

30

1、简要描述Verilog HDL中基于模块多层次引用的结构化电路设计要点;

2、实验报告应包括Modelsim环境下仿真得到的波形和Synplify Pro环境下综合得到RTL级电路图。

五、预习要求及思考题

1、分析Verilog HDL中基于模块多层次引用的结构化电路设计要点;

2、设计一个序列发生器。要求根据输入的8位并行数据输出串行数据,如果输入数据在0—127之间则输出一位0,如果输入数据在128—255之间则输出一位1,同步时钟触发;并且和范例8的序列检测器搭接,形成一个封闭系统。编写测试模块,并给出仿真波形。

31

本文来源:https://www.bwwdw.com/article/kjcr.html

Top