北邮电子院专业实验报告Word格式文档下载.docx
《北邮电子院专业实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北邮电子院专业实验报告Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
regsel;
scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a));
initial
begin
$monitor($stime,,"
sel=%ba=%bb=%bout=%b"
sel,a,b,out);
$dumpvars(2,mux_test);
sel=0;
b={`width{1'
b0}};
a={`width{1'
b1}};
#5sel=0;
#5sel=1;
#5$finish;
end
四、仿真结果与波形
LAB2:
简单时序逻辑电路的设计
掌握基本时序逻辑电路的实现。
在VerilogHDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的VerilogHDL模型中,我们常使用always块和@(posedgeclk)或@(negedgeclk)的结构来表述时序逻辑。
在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。
为了正确地观察到仿真结果,在可综合的模块中我们通常定义一个复位信号rst-,当它为低电平时对电路中的寄存器进行复位。
`timescale1ns/100ps
modulecounter(cnt,clk,data,rst_,load);
output[4:
0]cnt;
input[4:
0]data;
inputclk;
inputrst_;
inputload;
reg[4:
0]cnt;
always@(posedgeclkornegedgerst_)
if(!
rst_)
#cnt<
=0;
else
if(load)
cnt<
=#3data;
=#4cnt+1;
endmodule
modulecounter_test;
wire[4:
reg[4:
regrst_;
regload;
regclk;
counterc1
(
t(cnt),
.clk(clk),
.data(data),
.rst_(rst_),
.load(load)
);
initialbegin
clk=0;
foreverbegin
#10clk=1'
b1;
b0;
initial
$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);
taskexpect;
0]expects;
if(cnt!
==expects)begin
$display("
Attime%tcntis%bandshouldbe%b"
$time,cnt,expects);
TESTFAILED"
);
$finish;
endtask
@(negedgeclk)
{rst_,load,data}=7'
b0_X_XXXXX;
@(negedgeclk)expect(5'
h00);
b1_1_11101;
h1D);
b1_0_11101;
repeat(5)@(negedgeclk);
expect(5'
h02);
b1_1_11111;
h1F);
TESTPASSED"
五、思考题
该电路中,rst-是同步还是异步清零端?
在的always块中reset没有等时钟,而是直接清零。
所以是异步清零端。
LAB3:
使用预定义的库元件来设计八位寄存器。
八位寄存器中,每一位寄存器由一个二选一MUX和一个触发器dffr组成,当load=1,装载数据;
当load=0,寄存器保持。
对于处理重复的电路,可用数组条用的方式,使电路描述清晰、简洁。
`timescale1ns/1ns
moduleclock(clk);
regclk;
outputclk;
initialbegin
clk=0;
foreverbegin
#10clk=1'
end
mux及dffr模块调用代码
muxmux7
(.out(n1[7]),
.sel(load),
.b(data[7]),
.a(out[7])
dffrdffr7
(.q(out[7]),
.d(n1[7]),
.clk(clk),
.rst_(rst_)
muxmux6
(.out(n1[6]),
.b(data[6]),
.a(out[6])
dffrdffr6
(.q(out[6]),
.d(n1[6]),
muxmux5
(.out(n1[5]),
.b(data[5]),
.a(out[5])
dffrdffr5
(.q(out[5]),
.d(n1[5]),
muxmux4
(.out(n1[4]),
.b(data[4]),
.a(out[4])
dffrdffr4
(.q(out[4]),
.d(n1[4]),
muxmux3
(.out(n1[3]),
.b(data[3]),
.a(out[3])
dffrdffr3
(.q(out[3]),
.d(n1[3]),
muxmux2
(.out(n1[2]),
.b(data[2]),
.a(out[2])
dffrdffr2
(.q(out[2]),
.d(n1[2]),
muxmux1
(.out(n1[1]),
.b(data[1]),
.a(out[1])
dffrdffr1
(.q(out[1]),
.d(n1[1]),
muxmux0
(.out(n1[0]),
.b(data[0]),
.a(out[0])
dffrdffr0
(.q(out[0]),
.d(n1[0]),
例化寄存器
registerr1
(
.data(data),
.out(out),
.load(load),
.clk(clk),
.rst_(rst_)
例化时钟
clockc1
.clk(clk)
添加检测信号
begin
$timeformat(-9,1,"
$monitor("
time=%t,clk=%b,data=%h,load=%b,out=%h"
$stime,clk,data,load,out);
$dumpvars(2,register_test);
LAB4:
用always块实现较复杂的组合逻辑电路
掌握用always实现组合逻辑电路的方法;
了解assign与always两种组合逻辑电路实现方法之间的区别。
仅使用assign结构来实现组合逻辑电路,在设计中会发现很多地方显得冗长且效率低下。
适当地使用always来设计组合逻辑,会更具实效。
本实验描述的是一个简单的ALU指令译码电路的设计示例。
它通过对指令的判断,对输入数据执行相应的操作,包括加、减、或和传数据,并且无论是指令作用的数据还是指令本身发生变化,结果都要做出及时的反应。
示例中使用了电平敏感的always块,电平敏感的触发条件是指在@后括号内电平列表的任何一个电平发生变化就能触发always块的动作,并且运用了case结构来进行分支判断。
在always中适当运用default(在case结构中)和else(子if…else结构中),通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型。
如果不使用default或else对缺省项进行说明,易产生意想不到的锁存器。
电路描述
always@(opcodeordataoraccum)
if(accum==8'
b00000000)
#zero=1;
else
#zero=0;
case(opcode)
PASS0:
#out=accum;
PASS1:
ADD:
#out=data+accum;
AND:
#out=data&
accum;
XOR:
#out=data^accum;
PASSD:
#out=data;
PASS6:
#out=accum;
PASS7:
default:
#out=8'
bx;
endcase
LAB5:
存储器电路的设计
设计和测试存储器电路。
本实验中,设计一个模块名为mem的存储器仿真模型,该存储器具有双线数据总线及异步处理功能。
由于数据是双向的,所以要注意,对memory的读写在时序上要错开。
自行添加的代码
assigndata=(read)?
memory[addr]:
8'
hZ;
always@(posedgewrite)
memory[addr]<
=data[7:
0];
LAB6:
设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别
明确掌握阻塞赋值与非阻塞赋值的概念和区别;
了解阻塞赋值的使用情况。
在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为并发执行的。
实际时序逻辑设计中,一般情况下非阻塞赋值语句被更多的使用,有时为了在同一周期实现相互关联的操作,也使用阻塞赋值语句。
`timescale1ns/100ps
moduleblocking(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
always@(posedgeclk)
b=a;
c=b;
Blocking:
a=%d,b=%d,c=%d."
a,b,c);
modulenon_blocking(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
reg[3:
always@(posedgeclk)
b<
=a;
c<
=b;
$display("
Non_blocking:
a=%d,b=%d,c=%d"
modulecompareTop;
wire[3:
0]b1,c1,b2,c2;
reg[3:
forever#50clk=~clk;
$dumpvars(2,compareTop);
a=4'
h3;
_______________________________"
#100a=4'
h7;
hf;
ha;
h2;
#100$display("
$finish;
non_blockingnonblocking(clk,a,b2,c2);
blockingblocking(clk,a,b1,c1);
LAB7:
利用有限状态机进行复杂时序逻辑的设计
掌握利用有限状态机(FSM)实现复杂时序逻辑的方法。
控制器是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。
CPU何时进行读指令,何时进行RAM和I/O端口的读写操作等,都由控制器来控制。
补充代码
nexstate<
=state+1'
h01;
case(state)
beginsel=1;
rd=0;
ld_ir=0;
inc_pc=0;
halt=0;
ld_pc=0;
data_e=0;
ld_ac=0;
wr=0;
2:
rd=1;
3:
ld_ir=1;
4:
5:
beginsel=0;
inc_pc=1;
if(opcode==`HLT)
halt=1;
6:
rd=alu_op;
7:
data_e=!
alu_op;
if(opcode==`SKZ)
inc_pc<
=zero;
if(opcode==`JMP)
ld_pc=1;
0:
ld_ac=alu_op;
inc_pc=(opcode==`SKZ)&
zero||(opcode==`JMP);
if(opcode==`STO)
wr=1;
No.
00000000No.
00000101No.
00000001//1CTEMP:
//1temporaryvariable
00000001//1Dtime:
//1constant144-maxvalue
00000110//1ELIMIT:
//6constant1
一、
仿真结果与波形
第二部分电路综合
掌握逻辑综合的概念和流程,熟悉采用DesignCompiler进行逻辑综合的基本方法。
二、实验内容
采用SYNOPSYS公司的综合工具DesignCompiler对实验7的做综合。
与实验指导书中相同。
四、门级电路仿真结果与波形
1.文件是verilog语言及的描述还是结构化的描述?
是结构化的描述。
2.文件中,对触发器的延迟包括哪些信息?
包括对逻辑单元和管脚的上升/下降时延的最大值、最小值和典型值。
第三部分版图设计
掌握版图设计的基本概念和流程,熟悉采用SysnopsysICC工具进行版图设计的方法。
对电路综合输出的门级网表进行布局布线。
布局规划后结果
未产生corering和mesh前
产生corering和mesh后
电源线和电影PAD连接后
fillerPAD填充后
布局后结果
时钟树综合后结果
布线后结果
寄生参数的导出和后仿
1.简述ICC在designsetup阶段的主要工作。
创建设计库,读取网表文件并创建设计单元,提供并检查时间约束,检查时钟。
在对之前的数据与信息进行读取与检查后保存设计单元。
2.为什么要填充fillerpad?
fillerpad把分散的pad单元连接起来,把padI/O区域供电连成一个整体。
使它们得到持续供电并提高ESD保护能力。
3.derive_pg_connection的作用是什么?
描述有关电源连接的信息。
4.简述floorplan的主要任务。
对芯片大小、输入输出单元、宏模块进行规划,对电源网络进行设计。
5.简述place阶段的主要任务。
对电路中的延时进行估计与分析,模拟时钟树的影响,按照时序要求,对标准化单元进行布局。
6.简述CTS的主要步骤。
设置时钟树公共选项;
综合时钟树;
重新连接扫描链;
使能传播时钟;
Post-CTS布局优化;
优化时钟偏移;
优化时序。
实验总结
经过数周的ASIC专业实验,我对芯片设计流程、VerilogHDL语言、Linux基本指令和Vi文本编辑器有了基本的了解。
虽然之前对芯片设计、VHDL一无所知,但通过实验初步熟悉了ASIC的体系结构和VHDL的基本语法,对电路中时钟、寄生参数、元件布局带来的影响也有了了解。
我在实验中也遇到了许多问题,但我在老师、助教、同学的帮助下解决了这些问题,也有了更多收获。
通过这次ASIC专业实验,我加深了对本专业的认识。
我会继续努力成为合格的电子人。