集成电路设计实验指导书

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

《集成电路设计技术》 实验指导书

编写人:方 元

电子电气工程系

2012年2月

前言

Verilog HDL就是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,它是由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得Verilog HDL迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得Verilog HDL成为了该公司的独家专利。1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL 成为IEEE标准,即IEEE Standard 1364-1995。

本实验是在学生拥有集成电路设计概念以及数字电路理论学习的基础上,通过ModelSim EDA仿真工具,编写Verilog HDL语言。这有助于学生们对于课堂上所学习的Verilog HDL语言有一个深入的了解,并最终使得学生们能够学会该语言的基本语法,能够编写一些简单的模块。若今后从事集成电路设计工作,能够通过本次实验初窥门径,为今后的工作打下基础。

通过实验能够掌握Verilog HDL语言的基本语法,基本模块,为以后更加深入的学习数字集成电路设计打下基础。同时,让学生们使用最简单的HDL逻辑仿真工具ModelSim,对EDA工具的使用有一个基本概念,这样在学习其他EDA 工具时就不会那么生疏。

本实验通过4次实验,让同学们掌握Verilog模块化设计的理念,学会使用ModelSim软件,学会通过波形图查看电路的时序与逻辑是否正确。

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

(1) 掌握基本组合逻辑电路的实现方法;

(2) 初步了解两种基本组合逻辑电路的生成方法;

(3) 学习测试模块的编写;

二、实验原理及实验步骤

这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign结构。注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。

模块源代码的方法之一:

//--------------- compare.v -----------------

module compare(equal,

a,

b);

input a;

input b;

output equal;

assign equal = (a == b)?1:0;

//a等于b时,equal输出为1;a不等于b时,equal输出为0。

endmodule

模块源代码的方法之二:

module compare(equal,

a,

b);

input a;

input b;

output equal;

reg equal;

always @(a or b)

if(a == b) //a等于b时,equal输出为1

equal = 1;

else //a不等于b时,equal输出为0

equal = 0;

endmodule

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

测试模块源代码:

`timescale 1ns/1ns //定义时间单位。

`include "./compare.v" //包含模块文件。在有的仿真调试环境中并不需要此语句。

//而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest;

reg a;

reg b;

wire equal;

initial //initial常用于仿真时信号的给出。

begin

a=0;

b=0;

#100 a=0; b=1;

#100 a=1; b=1;

#100 a=1; b=0;

#100 $stop; //系统任务,暂停仿真以便观察仿真波形。

end

compare compare1(.equal(equal),.a(a),.b(b)); //调用被测试模块。

endmodule

仿真波形:

测试模块源代码的方法之二:

`timescale 1ns/1ns //定义时间单位。

`include "./compare.v" //包含模块文件。在有的仿真调试环境中并不需要此语句。

//而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest;

reg a;

reg b;

wire equal;

initial //initial常用于仿真时信号的给出。

begin

a = 0;

b = 0;

clock = 0;

end

always #50 clock = ~clock; //产生周期性的时钟

always @(posedge clock) //在每次时钟正跳变沿时刻产生不同的a和b

begin

a = {$random}%2; //每次a是0还是1是随机的

b = {$random}%2; //每次b是0还是1是随机的

end

initial

begin #100000 $stop; //系统任务,暂停仿真以便观察仿真波形

end

compare compare1(.equal(equal),.a(a),.b(b)); //调用被测试模块。

endmodule

练习:

设计一个字节(8位)比较器。

要求:比较两个字节的大小,如a[7:0]大于 b[7:0]输出高电平,否则输出低电平,改写测试

模型,使其能进行比较全面的测试。

实验二 时序逻辑电路的设计

一、实验目的:

掌握基本时序逻辑电路的实现。

二、实验原理及步骤

在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的Verilog HDL模型,我们通常使用always块和 @(posedge clk)或 @(negedge clk)的结构来表述时序逻辑。下面是一个1/2分频器的可综合模型。

// half_clk.v:

module half_clk(reset,clk_in,clk_out);

input clk_in,reset;

output clk_out;

相关文档
最新文档