北邮电子院专业实验报告_北邮操作系统实验报告

2020-02-28 其他范文 下载本文

北邮电子院专业实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“北邮操作系统实验报告”。

电子工程学院

ASIC专业实验报告

班级: 姓名:

学号: 班内序号:

第一部分 语言级仿真

LAB 1:简单的组合逻辑设计一、二、实验目的 实验原理 掌握基本组合逻辑电路的实现方法。

本实验中描述的是一个可综合的二选一开关,它的功能是当sel = 0时,给出out = a,否则给出结果out = b。在Verilog HDL中,描述组合逻辑时常使用aign结构。equal=(a==b)?1:0是一种在组合逻辑实现分支判断时常用的格式。parameter定义的size参数决定位宽。测试模块用于检测模块设计的是否正确,它给出模块的输入信号,观察模块的内部信号和输出信号。

三、源代码

mux.v module scale_mux(out,sel,b,a);parameter size=1;output[size-1:0] out;input[size-1:0]b,a;input sel;aign out =(!sel)?a:

(sel)?b:

{size{1'bx}};endmodule

mux_test.v `define width 8 `timescale 1 ns/1 ns module mux_test;

reg[`width:1]a,b;

wire[`width:1]out;

reg sel;

scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a));

initial

begin

$monitor($stime,“sel=%b a=%b b=%b out=%b”,sel,a,b,out);

$dumpvars(2,mux_test);

sel=0;b={`width{1'b0}};a={`width{1'b1}};

#5sel=0;b={`width{1'b1}};a={`width{1'b0}};

#5sel=1;b={`width{1'b0}};a={`width{1'b1}};

#5sel=1;b={`width{1'b1}};a={`width{1'b0}};

#5 $finish;

end endmodule

四、仿真结果与波形

LAB 2:简单时序逻辑电路的设计一、二、实验目的 实验原理 掌握基本时序逻辑电路的实现。

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

在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了正确地观察到仿真结果,在可综合的模块中我们通常定义一个复位信号rst-,当它为低电平时对电路中的寄存器进行复位。

三、源代码

counter.v `timescale 1 ns/100 ps module counter(cnt,clk,data,rst_,load);output[4:0]cnt;input [4:0]data;input

clk;input

rst_;input

load;reg

[4:0]cnt;

always@(posedge clk or negedge rst_)

if(!rst_)

#1.2 cnt

else

if(load)

cnt

else

cnt

endmodule

counter_test.v `timescale 1 ns/1 ns module counter_test;

wire[4:0]cnt;

reg [4:0]data;

reg

rst_;

reg

load;

reg

clk;

counter c1

(.cnt(cnt),.clk(clk),.data(data),.rst_(rst_),.load(load));

initial begin

clk=0;

forever begin

#10 clk=1'b1;

#10 clk=1'b0;

end

end

initial begin

$timeformat(-9,1,“ns”,9);

$monitor(“time=%t,data=%h,clk=%b,rst_=%b,load=%b,cnt=%b”,$stime,data,clk,rst_,load,cnt);

$dumpvars(2,counter_test);

end task expect;input [4:0]expects;

if(cnt!==expects)begin

$display(“At time %t cnt is %b and should be %b”,$time,cnt,expects);

$display(“TEST FAILED”);

$finish;

end endtask initial begin

@(negedge clk)

{rst_,load,data}=7'b0_X_XXXXX;@(negedge clk)expect(5'h00);

{rst_,load,data}=7'b1_1_11101;@(negedge clk)expect(5'h1D);

{rst_,load,data}=7'b1_0_11101;

repeat(5)@(negedge clk);

expect(5'h02);

{rst_,load,data}=7'b1_1_11111;@(negedge clk)expect(5'h1F);

{rst_,load,data}=7'b0_X_XXXXX;@(negedge clk)expect(5'h00);

$display(“TEST PASSED”);

$finish;

end endmodule

四、仿真结果与波形

五、思考题

该电路中,rst-是同步还是异步清零端?

在counter.v的always块中reset没有等时钟,而是直接清零。所以是异步清零端。

LAB 3:简单时序逻辑电路的设计一、二、实验目的 实验原理 使用预定义的库元件来设计八位寄存器。

八位寄存器中,每一位寄存器由一个二选一MUX和一个触发器dffr组成,当load=1,装载数据;当load=0,寄存器保持。对于处理重复的电路,可用数组条用的方式,使电路描述清晰、简洁。

三、源代码

clock.v `timescale 1 ns /1 ns module clock(clk);reg clk;output clk;initial begin clk=0;forever begin #10 clk=1'b1;#10 clk=1'b0;end end endmodule

mux及dffr模块调用代码

mux mux7(.out(n1[7]),.sel(load),.b(data[7]),.a(out[7]));dffr dffr7(.q(out[7]),.d(n1[7]),.clk(clk),.rst_(rst_));mux mux6(.out(n1[6]),.sel(load),.b(data[6]),.a(out[6]));dffr dffr6(.q(out[6]),.d(n1[6]),.clk(clk),.rst_(rst_));mux mux5(.out(n1[5]),.sel(load),.b(data[5]),.a(out[5]));dffr dffr5(.q(out[5]),.d(n1[5]),.clk(clk),.rst_(rst_));mux mux4(.out(n1[4]),.sel(load),.b(data[4]),.a(out[4]));dffr dffr4(.q(out[4]),.d(n1[4]),.clk(clk),.rst_(rst_));

mux mux3(.out(n1[3]),.sel(load),.b(data[3]),.a(out[3]));dffr dffr3(.q(out[3]),.d(n1[3]),.clk(clk),.rst_(rst_));mux mux2(.out(n1[2]),.sel(load),.b(data[2]),.a(out[2]));dffr dffr2(.q(out[2]),.d(n1[2]),.clk(clk),.rst_(rst_));mux mux1(.out(n1[1]),.sel(load),.b(data[1]),.a(out[1]));dffr dffr1(.q(out[1]),.d(n1[1]),.clk(clk),.rst_(rst_));mux mux0(.out(n1[0]),.sel(load),.b(data[0]),.a(out[0]));dffr dffr0(.q(out[0]),.d(n1[0]),.clk(clk),.rst_(rst_));

例化寄存器

register r1(.data(data),.out(out),.load(load),.clk(clk),.rst_(rst_));例化时钟

clock c1(.clk(clk));

添加检测信号 initial begin $timeformat(-9,1,“ns”,9);$monitor(“time=%t,clk=%b,data=%h,load=%b,out=%h”, $stime,clk,data,load,out);$dumpvars(2,register_test);end

四、仿真结果与波形

LAB 4:用always块实现较复杂的组合逻辑电路

一、实验目的掌握用always实现组合逻辑电路的方法;

了解aign与always两种组合逻辑电路实现方法之间的区别。

二、实验原理

仅使用aign结构来实现组合逻辑电路,在设计中会发现很多地方显得冗长且效率低下。适当地使用always来设计组合逻辑,会更具实效。

本实验描述的是一个简单的ALU指令译码电路的设计示例。它通过对指令的判断,对输入数据执行相应的操作,包括加、减、或和传数据,并且无论是指令作用的数据还是指令本身发生变化,结果都要做出及时的反应。

示例中使用了电平敏感的always块,电平敏感的触发条件是指在@后括号内电平列表的任何一个电平发生变化就能触发always块的动作,并且运用了case结构来进行分支判断。

在always中适当运用default(在case结构中)和else(子if…else结构中),通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型。如果不使用default或else对缺省项进行说明,易产生意想不到的锁存器。

三、源代码

电路描述

always@(opcode or data or accum)begin if(accum==8'b00000000)#1.2 zero=1;else #1.2 zero=0;

case(opcode)PASS0: #3.5 out =accum;PASS1: #3.5 out =accum;ADD: #3.5 out = data + accum;AND: #3.5 out =data&accum;XOR: #3.5 out =data^accum;PASSD: #3.5 out=data;PASS6:#3.5 out=accum;PASS7:#3.5 out=accum;default:#3.5 out=8'bx;endcase end

四、仿真结果与波形

LAB 5:存储器电路的设计一、二、实验目的 实验原理 设计和测试存储器电路。

本实验中,设计一个模块名为mem的存储器仿真模型,该存储器具有双线数据总线及异步处理功能。由于数据是双向的,所以要注意,对memory的读写在时序上要错开。

三、源代码

自行添加的代码

aign data=(read)?memory[addr]:8'hZ;

always @(posedge write)begin memory[addr]

四、仿真结果与波形

LAB 6:设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别

一、实验目的明确掌握阻塞赋值与非阻塞赋值的概念和区别; 了解阻塞赋值的使用情况。

二、实验原理

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

三、源代码

blocking.v `timescale 1 ns/ 100 ps

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(“Blocking: a=%d,b=%d,c=%d.”,a,b,c);

end endmodule

non_blocking.v `timescale 1 ns/ 100 ps module non_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

四、仿真结果与波形

LAB 7:利用有限状态机进行复杂时序逻辑的设计一、二、实验目的 实验原理 掌握利用有限状态机(FSM)实现复杂时序逻辑的方法。

控制器是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。CPU何时进行读指令,何时进行RAM和I/O端口的读写操作等,都由控制器来控制。

三、源代码

补充代码

nexstate

control_test.v /***************************** * TEST BENCH FOR CONTROLLER * *****************************/

`timescale 1 ns / 1 ns

module control_test;

reg [8:0] response [0:127];

reg [3:0] stimulus [0:15];

reg [2:0] opcode;

reg

clk;

reg

rst_;

reg

zero;

integer

i,j;

reg[(3*8):1] mnemonic;

// Instantiate controller

control c1(rd , wr , ld_ir , ld_ac , ld_pc , inc_pc , halt , data_e , sel , opcode , zero , clk , rst_);

// Define clock

initial begin

clk = 1;

forever begin

#10 clk = 0;

#10 clk = 1;

end

end

// Generate mnemonic for debugging purposes

always @(opcode)

begin

case(opcode)

3'h0

: mnemonic = “HLT”;

3'h1

: mnemonic = “SKZ”;

3'h2

: mnemonic = “ADD”;

3'h3

: mnemonic = “AND”;

3'h4

: mnemonic = “XOR”;

3'h5

: mnemonic = “LDA”;

3'h6

: mnemonic = “STO”;

3'h7

: mnemonic = “JMP”;

default : mnemonic = “???”;

endcase

end

// Monitor signals

initial

begin

$timeformat(-9, 1, “ ns”, 9);

$display(“ time

rd wr ld_ir ld_ac ld_pc inc_pc halt data_e sel opcode zero state”);

$display(“--------------------------------------------------------------”);//

$shm_open(“waves.shm”);//

$shm_probe(“A”);//

$shm_probe(c1.state);

end

// Apply stimulus

initial

begin

$readmemb(“stimulus.pat”, stimulus);

rst_=1;

@(negedge clk)rst_ = 0;

@(negedge clk)rst_ = 1;

for(i=0;i

@(posedge ld_ir)

@(negedge clk)

{ opcode, zero } = stimulus[i];

end

// Check response

initial

begin

$readmemb(“response.pat”, response);

@(posedge rst_)

for(j=0;j

@(negedge clk)

begin

$display(“%t %b %b %b

%b

%b

%b

%b

%b %b

%b

%b”,$time,rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel,opcode,zero,c1.state);

if({rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel}!==

response[j])

begin : blk

reg [8:0] r;

r = response[j];

$display(“ERRORTEST1 PASSED!

111_00000

// 18

JMP BEGIN //run test again

@1A 00000000

// 1A

DATA_1:

//constant 00(hex)

11111111

// 1B

DATA_2:

//constant FF(hex)

10101010

// 1C

TEMP:

//variableTEST2 PASSED!

111_00000

// 11

JMP BEGIN

//run test again

@1A 00000001

// 1A

DATA_1:

//constant 1(hex)

10101010

// 1B

DATA_2:

//constant AA(hex)

11111111

// 1C

DATA_3:

//constant FF(hex)

00000000

// 1D

TEMP:

CPUtest3.dat //opcode_operand // addr

aembly code //--------------//-------------------------

111_00011

// 00

JMP LOOP

//jump to the addre of LOOP @03 101_11011

// 03

LOOP:

LDA FN2

//load value in FN2 into accum

110_11100

// 04

STO TEMP

//store accumulator in TEMP

010_11010

// 05

ADD FN1

//add value in FN1 to accumulator

110_11011

// 06

STO FN2

//store result in FN2

101_11100

// 07

LDA TEMP

//load TEMP into the accumulator

110_11010

// 08

STO FN1

//store accumulator in FN1

100_11101

// 09

XOR LIMIT //compare accumulator to LIMIT

001_00000

// 0A

SKZ

//if accum = 0, skip to DONE

111_00011

// 0B

JMP LOOP

//jump to addre of LOOP

000_00000

// 0C

DONE:

HLT

//end of program

101_11111

// 0D

AGAIN: LDA ONE

110_11010

// 0E

STO FN1

101_11110

// 0F

LDA ZERO

110_11011

// 10

STO FN2

111_00011

// 11

JMP LOOP

//jump to addre of LOOP

@1A 00000001

// 1A

FN1:

//variablestores 2nd Fib.No.00000000

// 1C

TEMP:

//temporary variable

10010000

// 1D

LIMIT:

//constant 144stores 1st Fib.No.00000101

// 1B

data2:

//5

variablemax value

00000110

// 1E

LIMIT:

// 6

constant 1

11111111

// 1F

AND1:

//FF and

四、仿真结果与波形

第二部分 电路综合一、二、三、四、实验目的 实验内容 源代码

门级电路仿真结果与波形 掌握逻辑综合的概念和流程,熟悉采用Design Compiler进行逻辑综合的基本方法。采用SYNOPSYS公司的综合工具Design Compiler对实验7的control.v做综合。与实验指导书中相同。

五、思考题

1.control_pad.v文件是verilog语言及的描述还是结构化的描述?

是结构化的描述。

2.control_pad.sdf文件中,对触发器的延迟包括哪些信息?

包括对逻辑单元和管脚的上升/下降时延的最大值、最小值和典型值。

第三部分 版图设计

一、二、三、四、实验目的 实验内容 源代码

仿真结果与波形 掌握版图设计的基本概念和流程,熟悉采用Sysnopsys ICC工具进行版图设计的方法。对电路综合输出的门级网表control_pad.v进行布局布线。与实验指导书中相同。布局规划后结果

未产生core ring和mesh前

产生core ring和mesh后

电源线和电影PAD连接后

filler PAD填充后

布局后结果

时钟树综合后结果

布线后结果

寄生参数的导出和后仿

五、思考题

1.简述ICC在design setup阶段的主要工作。

创建设计库,读取网表文件并创建设计单元,提供并检查时间约束,检查时钟。在对之前的数据与信息进行读取与检查后保存设计单元。2.为什么要填充filler pad?

filler pad把分散的pad单元连接起来,把pad I/O区域供电连成一个整体。使它们得到持续供电并提高ESD保护能力。3.derive_pg_connection的作用是什么?

描述有关电源连接的信息。4.简述floorplan的主要任务。

对芯片大小、输入输出单元、宏模块进行规划,对电源网络进行设计。5.简述place阶段的主要任务。

对电路中的延时进行估计与分析,模拟时钟树的影响,按照时序要求,对标准化单元进行布局。

6.简述CTS的主要步骤。

设置时钟树公共选项;综合时钟树;重新连接扫描链;使能传播时钟;Post-CTS布局优化;优化时钟偏移;优化时序。

实验总结

经过数周的ASIC专业实验,我对芯片设计流程、Verilog HDL语言、Linux基本指令和Vi文本编辑器有了基本的了解。虽然之前对芯片设计、VHDL一无所知,但通过实验初步熟悉了ASIC的体系结构和VHDL的基本语法,对电路中时钟、寄生参数、元件布局带来的影响也有了了解。我在实验中也遇到了许多问题,但我在老师、助教、同学的帮助下解决了这些问题,也有了更多收获。通过这次ASIC专业实验,我加深了对本专业的认识。我会继续努力成为合格的电子人。

《北邮电子院专业实验报告.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
北邮电子院专业实验报告
点击下载文档
相关专题 北邮操作系统实验报告 实验报告 北邮 专业 北邮操作系统实验报告 实验报告 北邮 专业
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文