半定制设计 - 74LS169计数器功能模块分析

发布时间:2018-10-13 00:03:29   来源:文档文库   
字号:

数字集成电路课程设计

实践教学要求与任务:

74ls169计数器:

174LS169计数器功能模块;

2)工作时钟10kHz即可;

3)使用SMIC工艺库smic18mm_1P6M完成设计;

4)完成全部流程:设计规范文档、模块设计、代码输入、功能仿真、约束与综合、布局布线、时序仿真、物理验证等。

工作计划与进度安排:

1-2天:讲解题目,准备参考资料,检查、调试实验软硬件,进入设计环境,开始设计方案和验证方案的准备;

3-5天:完成设计,经指导老师验收后进入模块电路设计(验收设计文档);

6-9天:完成模块电路代码输入,并完成代码的仿真(验收代码与仿真结果);

9-10天:约束设计,综合(验收约束与综合结果);

11-12天:布局布线,完成版图(验收版图结果);

13-14天:物理验证、后仿真,修改设计(验收物理验证结果和时序仿真结果);

15天:整理设计资料,验收合格后进行答辩。

计数器74ls169 为可预置的 4 位二进制同步加/减计数器。当置入控制端(LOAD)为低电平时,在CLOCK上升沿作用下,输出端doutQAQD)与数据输入端dinAD)相一致。169 的计数是同步的,靠CLOCK同时加在 4 个触发器上而实现。当ENPENT均为低电平时,在CLOCK上升沿作用下QAQD同时变化,从而消除了异步计数器中出现的计数尖峰。当计数方式控制(U/D)为高电平时进行加计数,当计数方式控制(U/D)为低电平时进行减计数。169 有超前进位功能。当计数溢出时,进位端(RC OUT)输出一个低电平。

本文介绍了在Design Compiler下进行逻辑综合和脚本相关约束,然后根据DC综合后的网表,使用Encounter进行自动布局布线,再使用ModelSim进行功能后仿真、分析后仿真波形得出结果。完成了功能和时序仿真,从而保证了设计的功能与时序的正确性。

关键词 计数器;Verilog HDL;tcl;仿真; Design Compiler;逻辑综合;Encounter;物理验证;后仿真;



1

1 功能描述及电路设计 2

1.1 电路性能 2

1.2 电路接口 2

1.3 电路结构 3

2功能仿真 4

2.1 仿真的功能列表 4

2.2 顶层仿真平台与激励 4

2.3 电路功能仿真结果 5

3约束及逻辑综合 7

3.1 约束策略 7

3.2 脚本 7

3.3 综合文件 9

3.4 综合环境 10

3.5 综合过程 10

4 布局布线 13

4.1 文件准备 13

4.2 布局布线过程 14

4.3 物理验证 16

5 后仿真 18

6 总结 19

参考文献 20

附录一 21

附录二 23

附录三 26

附录四 27



集成电路是电子工业的基础。以集成电路为基础的电子信息产业的发展,对国民经济发展、产业技术创新能力的提高及现代国防建设都具有极其重要的作用。而集成电路设计业则是集成电路产业链的核心。随着集成电路技术的发展,集成电路设计的手段也经历了从手工设计到计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)。在20世纪90年代开始逐步发展到电子设计自动化(Electronics Design Automation,EDA)阶段。CAD/EDA工具已经成为当今集成电路设计和制造流程中的必不可少的部分[1]

Synopsys是为全球集成电路设计提供电子设计自动化(EDA)软件工具的主导企业。为全球电子市场提供技术先进的IC设计与验证平台,致力于复杂的芯片上系统(SoCs)的开发。同时,Synopsys公司还提供知识产权和设计服务,为客户简化设计过程,提高产品上市速度。

Cadence公司的电子设计自动化(Electronic Design Automation)产品涵盖了电子设计的整个流程,包括系统级设计,功能验证,IC综合及布局布线,模拟、混合信号及射频IC设计,全定制集成电路设计,IC物理验证,PCB设计和硬件仿真建模等。Cadence公司工具SoC encounter是一完整的设计平台,可以完成从RTL输入到GDS输出的所有半定制IC设计流程。我们在设计中主要采用其版图规划(Floorplan)、布局(placement)、布线(route)、时钟树综合(CTS)、信号完整性分析(SI),以及RC提取等功能,也就是完成后端设计。

本设计采用Verilog HDL语言描述,设计一个计数器Design Compiler进行约束及综合。Design Compiler的操作有Tcl命令来实现,使用Encounter进行布局布线,还要用Modelsim进行功能仿真和后仿真,实验环境为Linux操作系统。完成一次RISC程序存储器的全流程设计

1 功能描述及电路设计

1.1 电路性能

四位二进制同步计数器74LS169真值表见下图1.1.其中LD为置数端,当其为低电平时,输出置成d1d2d3d4CTt(ENt)CTp(ENp)为两个计数控制端。U/D为计数控制方式,当其为高电平时进行加计数,当其为低电平时进行减计数。RPPLE CARRY OUT为进位端,当计数溢出时,其为低电平。

1.1真值表

输 入

输 出

LD

ENp

ENt

U/D

Clk

D0

D1

D2

D3

Q0

Q1

Q2

Q3

0

x

x

x

1

d0

d1

d2

d3

d0

d1

d2

d3

1

0

0

1

1

x

x

x

x

加计数

1

0

0

0

1

x

x

x

x

减计数

1

1

x

x

x

x

x

x

x

保 持

1

x

1

x

x

x

x

x

x

保 持

1.2 电路接口

74ls169电路有时钟信号,置数控制信号,计数控制信号,计数方式控制信号等信号。具体接口如下表1.2所示。

1.2 接口信号表

名称

IO属性

描述

备注

clk

in

时钟输入端

上升沿有效

LD

in

输入信号1bit,置数端

低电平有效

Ent/ENp

in

输入信号1bit,计数控制端

低电平有效

U/D

in

输入信号1bit,加/减计数方式控制端

高电平加计数

低电平减计数

din[3:0]

in

输入信号4bit

d1 d2 d3 d4

dout[4:0]

out

输出信号4bit

Qa Qb Qc Qd

1.3 电路结构

依照功能,74ls169电路的功能框图如下所示。

1.1 电路功能框

2 功能仿真

这里使用Mentor公司的ModelsimModelsim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDLVerilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。

2.1仿真的功能列表

功能仿真针对每一条设计需要实现的功能进行。设计中要求实现的、需要仿真列表如下:

1) 时钟信号——当有时钟时电路正常工作;没有时钟信号时,除复位外所有的输入没有响应,所有的输出没有变化。

2)置数功能——当置数控制信号有效时,当前输出为预置值。

3) 加计数功能——当计数方式控制信号为高电平时进行加计数。

4)减计数功能——当计数方式控制信号为低电平时进行减计数。

5)保持功能——当计数控制信号为低电平时保持当前计数。

6)进位功能——当计数溢出时,进位为低电平。

2.2 顶层仿真平台与激励

仿真激励的构造是针对需要验证的功能的,测试文件为ls74_169_tb.v,ls169.v中的激励信号引入,加载到例化的功能模块中,这里采用查看波形的方式确认输出是否正确。激励直接测试输出是否符合74ls147真值表的真值关系。需要查看的波形的功能有以下内容:输入波形是否符合激励设定的值;输出是否符合期待的功能。

2.3 电路功能仿真结果

1)置数功能,这里置数值为91001,ld信号为低电平时,dout输出则为9。如下图3.2.1所示:

3.2.1

2)加计数功能,当ud信号为高电平时,进行加计数,如下图3.2.2所示:

3.2.2

3)减计数功能,当ud信号为低电平时,进行减计数,如下图3.2.3所示:

3.2.3

4)保持功能,当计数控制端为高电平时,保持当前状态。如图3.2.4

3.2.4

5)进位功能,当输出溢出时,rc变为低电平。如图3.2.5

3.2.5

3约束及逻辑综合

3.1 约束策略

约束部分是本次课程设计的重点内容, 对于一个由时钟控制的数字逻辑电路来说,时序是最为重要的。

本电路分为三个module结构(dc_top.dcLabTopiopads)。

主程序文件dc_topv为主要程序模块。

输入输出PAD的文件名为iopads.v。该部分的作用是选择对应的PAD将功能电路的输入输出与外部链接,种类和数量根据功能电路的接口而定,PAD的选择根据需要的电气特性从库中选择。

顶层文件为dcLabTop.v,此部分内部包含了功能电路和PAD,作用为连接主程序和PAD

3.2 脚本

首先是读入源代码,也就是HDL文本描述的设计文件,此处不用制定目录,Design Compiler会在搜索目录中搜索。tcl语句如下:

read_verilog { aa.v dcLabTop.v iopads.v }

读入设计原文件后,一般设定当前设计,这样约束条件才可能有针对性的施加。tcl语句如下:

current_design dcLabTop

设定当前设计后,要完成链接,也就是将设计与库链接起来,用于映射过程中搜索相应的单元,完成综合。tcl语句如下:

Link

检查设计,主要完成检查转换的设计。tcl语句如下:

check_design

然后对设计设定时序约束,这是最重要的一项约束,用于设定设计的工作速度。针对不同的设计部分,有不同的约束方法。针对本次设计,采用全同步,双时钟工作的实际情况。以下语句设定时钟及属性、输入输出信号时间余量。

设定名称为clk0的时钟,由于采用40M的时钟,为了给予一定的余量,故设定时钟周期为24nstcl语句如下:

create_clock -name "CLK" -period 1000000 -waveform { 500000 1000000.000 } { CLK }

告诉综合器不要对时钟网络进行驱动,这个工作将在后续版图布局布线中进行。tcl语句如下:

set_dont_touch_network [get_clocks "CLK"]

设定输入信号最大时间余量。tcl语句如下:

set_input_delay -clock CLK -max -rise 600000 "PRESET EN1 EN2 DATAINT DATAINM"

设定输出信号最大时间余量。tcl语句如下:

set_output_delay -clock CLK -max -rise 600000 "OUT10 OUT6 OUT7 OUT8 OUT9 OUT OUT2 OUT3 OUT4 OUT5"

check_timing

设定综合的操作条件。tcl语句如下:

set_operating_conditions -max slow -max_library slow -min fast -min_library fast

设定线负载模型,本设计选择tsmc18_wl20模型。tcl语句如下:

set_wire_load_model -name tsmc18_wl20 -library slow

设定扇出最大负载能力。tcl语句如下:

set_max_fanout 3285 aa

驱动能力设定。tcl语句如下:

set_max_transition 2.0 aa

设定输出网表的格式规则,输出未优化的设计。tcl语句如下:

set verilogout_no_tri true

set_fix_multiple_port_nets -all -buffer_constants

输出时序报告。tcl语句如下:

rc > ../rpt/tim.log

输出网表。tcl语句如下:

write -f verilog -hier -o ../rpt/dc_top.sv

输出综合数据文件。tcl语句如下:

write -f ddc -hier -o ../rpt/dc_top.ddc

report_area > ../rpt/top.area.log

write_sdc ../rpt/dc_top.sdc

输出延时文件。tcl语句如下:

write_sdf -version 2.1 ../rpt/dc_top.sdf

3.3 综合文件

首先在桌面建立dcLab作为本次实验dc的操作主目录。在dcLab目录下,建立设计存放目录如code、约束文件目录如constrn、输出网表文件目录ntlst、报告输出目录rptlog文件目录logdc启动目录work

在综合前需要准备以下几个文件,以便使软件可以正常工作。

.synopsys_dc.setup文件即启动项文件:

在这个文件中,需要将所用到的库单元文件的路径和电路设计文件所存放的路径写入,以便软件在工作时能够找到这些文件并正确识别。

*.v文件:

因为本次课程设计所使用电路描述语言为verilog HDL语言,所以至少需要将顶层TOP设计文件、功能电路的设计文件、PAD设计文件准备好,即准备好一个正确可用的设计,以便用于约束综合,本设计将*.v文件存放在code目录下。

Tcl语句文件:

在本次课程设计中使用的是命令界面,使用Tcl语言进行操作,所以需要准备好相应的Tcl命令,以便对设计进行约束综合等相应操作,本设计将它存放在constrn目录下。

库文件:

本设计采用的是tsmc公司的0.18um标准单元库的所有文件,存放在目录:/opt/eda/designKit/下面,设计过程中需要查找的话注意路径与示例中的图片上所示路径稍有不同。

3.4 综合环境

本次课程设计所使用的综合工具Design Compiler,是运行在Linux操作环境下。所以要能够运用简单的Linux系统命令,以便于能够正常使用综合工具。Design Compiler(简称DC)是synopsys 公司的ASIC 综合器产品,它可以完成将硬件。描述语言所做的RTL级描述自动转换成优化的门级网表。DC 得到全球60 多个半导体厂商、380 多个工艺库的支持。Synopsys 的逻辑综合工具DC占据91%的市场份额。DC 是工业界标准的逻辑综合工具,也是Synopsys 最核心的产品。它使IC 设计者在最短的时间内最佳的利用硅片完成设计。它根据设计描述和约束条件并针对特定的工艺库将输入的VHDL或者Verilog RTL 描述自动综合出一个优化的门级电路。它可以接受多种输入格式,如硬件描述语言、原理图和网表等,并产生多种性能报告,在缩短设计时间的同时提高设计性能。

3.5 综合过程

3.5.1 综合流程

Design Compiler可以针对层次化的组合电路或者时序电路的速度、面积和可布性进行优化。按照所定义的电路的测量特征所要达到的目标,Design Compiler综合一个电路并将其放入目标库中,这样可以生成适用于你的计算机辅助设计工程(CAE)工具的原理图或网表。

综合的过程如下:

读入设计及其子设计

设置顶层的设计特性参数

设置实际时序和面积目标参数

执行check_design验证设计,识别并且更正错误

进行Design Compiler优化

综合流程如下:

设置启动项文件→读入源代码→链接,设计检查→时序路径约束→编译综合→结束

3.5.2 综合操作过程

首先打开Linux中命令终端。进入以准备好的.synopsys_dc.setup文件所在路径。执行命令,打开Design Compiler。进入Tcl命令界面。

命令如下:

snps_lic

cd Desktop/dcLab/work/

design_vision&

运行后,读入文件将在终端得到如下图图3.1界面,即进入DC的界面。

3.1 Design Compiler的程序界面

因为已经做好了约束文件mamashuomingziyaochang.con。直接通过图3.1中下面的TCL命令栏中输入命令:

Source mamashuomingziyaochang.con

DC软件将会进行一系列管脚约束并生成dc_top.sv网表文件和其他的报告文件。

3.2 生成的dc_top.sv

3.3 TCL命令执行图

4 布局布线

4.1 文件准备

同所有的EDA工具一样,Encounter在进行设计之前也要准备文件。一般必须要有时序文件libSI工具CeltIC进行信号完整性分析的cdb文件、用于RC提取的电容表文件capTbl、综合工具输出的门级综合网表、定义工艺的版图交换文件LEFLibrary Exchange Format)、时序约束的sdcSynthesis Design Constraints)文件、PAD位置约束的io文件。其中经过Design Compiler对其进行综合后获得了网表文件dc_top.sv并修改为dc_top.v文件,以及约束文件dc_top.sdcpad约束的io文件需要手工书写。

这里, I/O PAD已经在综合前添加进入网表中,所以在布局布线前只需在网表中的顶层模块下加入电源PAD和拐角连接PAD,就行了如下图所示。

4.1 在网表中加入电源PAD和拐角连接PAD

然后编写padio.io文件,一般在设计导入到Encounter时,为了在设计导入的时候同时指定设计中各个PAD具体的位置,这可以通过在导入设计的同时导入分配PAD位置的文件来完成。本设计加上VDDVSS6I/O端口和4个拐角连接。

4.2 布局布线过程

首先打开Linux中命令终端,进入启动Encounter的工作目录,执行命令,打开Encounter

SOC Encounter软件正常启动后按照以下流程操作:

1) Design_import,读入设计所需要的库文件和设计文件;

2) FloorPlan,对整个版图进行布局规划;

3) Global Net Connection,把标准单元,电源PAD等版图中用到的cell pin 和电源的net 一一对应起来;

4) Add Power Rings,添加core的电源环和地环,在数字标准单元区域的周围放置power ring,用于提供数字部分的电源和地;

5) Add Stripes,用于在芯片中插入一些横的竖的电源线,保证供电;

6) Special Route (SRoute),把标准单元的电源以及给core 供电的电源pad core 电源环连接起来;

7) Placement Blockage,在电源的Stripes Routing blockage 的地方放置一些blockage,防止在这些地方;

8) Placement,放置标准单元;

9) Trail Routing,进行初步的布线,布线完成进行setup time的时序分析和优化;

10) Create Clock Tree,为大扇出的时钟线布时钟树,完成建立时钟树后进行hold time时序分析和优化;

11) NanoRoute,细节优化布线,是encounter的最强大工具,用于细节、优化布线。

12) SI,对信号有噪声线进行修补和优化;

完成以上操作后得到版图如下。

4.2 可控脉冲发生器的版图

4.3 物理验证

这里物理验证主要是通过EncounterVerify进行几何规则检查(Verify Geometry)、连线的连接性(Verify Connectivity)和金属密度检查(Verify Metal Destiny)。

几何规则检查的报告如下。

4.3 几何规则检查报告

连线的连接性检查报告如下。

4.4 连线的连接性检查报告

因为刚完成的版图金属密度过低,所以要添加对电路没有影响的金属填充物,添加完Matel Filler后,金属密度报告如下。

4.5 金属密度检查报告

5 后仿真

本设计采用的后仿真工具同样是Modelsim。从之前的布局布线中导出电路的网表(*.v)和延时文件(*.sdf),并构建测试平台和激励,在测试平台中通过加入以下句子就会在仿真时引用延时文件:

initial $sdf_annotate("dcLabTop.sdf",dcLabTop.sim);

后仿真结果如图5.1

5.1 后仿真结果

6 总结

这一次课程设计对于没接触过Linux系统的我来说在一开使确实是一个小挑战首先在环境搭建方面,在Linux系统上运行Design Compiler,。但通过反复的尝试,我成功的完成了设计环境的搭建。基本的指令随着不断的应用也渐渐熟悉起来。

通过编写约束文件,更加清楚了集成电路设计中逻辑综合(前端综合)的核心内容。通过广泛地查阅资料和实践,对相应的TCL命令也渐渐熟悉起来。对时序约束、面积约束、工作环境设定有了更深刻的理解。

总的来说,这一次设计还是比较成功的,在老师的指导下,所有问题都迎刃而解了。所以在求解问题的过程中总会遇到问题,我们需要去努力、积极的思考解决问题并总结问题。当遇到阻塞,不要抱怨放弃,要鼓励自己不断尝试新的方法。并且努力提高自学能力和与人交流的能力。

虽然是勉强通过了这次课设的验证,但还是存在很多自身的不足,比如说对仿真软件的不熟练,无法熟练的应用DC。但是这些都是能够克服的,都不算问题,只有发现的问题越来越多,积累的能力也就越来越多。

由衷的感谢老师这学期对我们的严格要求,我觉得只有严格要求自己才能把每件事做到完美。

参考文献

[1] 王金明 数字系统设计与Verilog HDL 电子工业出版社 2011.1

[2] Jan M.Rabaey,Anantha Chandrakasan,Borivoje Nikolic 数字集成电路 电子工业出版社 2012.12

[3] http://bbs.eetop.cn/thread-372921-1-1.html

[4] 李群芳.单片微型计算机与接口技术.电子工业出版社,2013.5

附录一:

module ls169top(LD,ENT,ENP,UD,CLK,RSTN,DIN,DOUT,RC);

//

input LD;

input ENT;

input ENP;

input UD;

input CLK;

input [3:0]DIN;

output [3:0]DOUT;

input RSTN;

output RC;

//

wire LD;

wire ENT;

wire ENP;

wire UD;

wire CLK;

wire[3:0] DIN;

wire[3:0] DOUT;

wire RSTN;

wire RC;

//

wire ldc;

wire entc;

wire enpc;

wire udc;

wire clkc;

wire [3:0]dinc;

wire [3:0]doutc;

wire rstnc;

wire rcc;

//

iopads iopads (

.LD_PAD ( LD ), // I

.ENT_PAD ( ENT ), // I

.ENP_PAD ( ENP ), // I

.UD_PAD ( UD ), // I

.CLK_PAD ( CLK ), // I

.DIN_PAD_0 ( DIN[0] ), // I

.DIN_PAD_1 ( DIN[1] ), // I

.DIN_PAD_2 ( DIN[2] ), // I

.DIN_PAD_3 ( DIN[3] ), // I

.DOUT_PAD_0 ( DOUT[0] ), // O

.DOUT_PAD_1 ( DOUT[1] ), // O

.DOUT_PAD_2 ( DOUT[2] ), // O

.DOUT_PAD_3 ( DOUT[3] ), // O

.RSTN_PAD ( RSTN ), // I

.RC_PAD ( RC ), // O

.ld_core ( ldc ), // O

.ent_core ( entc ), // O

.enp_core ( enpc ), // O

.ud_core ( udc ), // O

.clk_core ( clkc ), // O

.din_core ( dinc ), // O

.dout_core ( doutc ), // I

.rstn_core ( rstnc ), // O

.rc_core ( rcc )); // I

ls169 ls169 (

.ld ( ldc ), // I

.ent ( entc ), // I

.enp ( enpc ), // I

.ud ( udc ), // I

.clk ( clkc ), // I

.din ( dinc ), // I

.dout ( doutc ), // O

.rstn ( rstnc ), // I

.rc ( rcc )); // O

//

endmodule

附录二

module ls169 ( ld, ent, enp, ud, clk, rstn, din, dout, rc );

input [3:0] din;

output [3:0] dout;

input ld, ent, enp, ud, clk, rstn;

output rc;

wire N23, N24, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14,

n15, n16, n17, n18, n19, n20, n21, n22, n23, n24, n25, n26, n27, n28,

n29, n30, n31, n32, n34, n35, n36, n37;

AOI221X1 U3 ( .A0(n2), .A1(n3), .B0(n4), .B1(ld), .C0(n5), .Y(n34) );

NOR2X1 U4 ( .A(ld), .B(din[3]), .Y(n5) );

OAI32X1 U5 ( .A0(n3), .A1(n6), .A2(n7), .B0(dout[3]), .B1(n8), .Y(n4) );

AOI22X1 U6 ( .A0(dout[0]), .A1(n9), .B0(dout[2]), .B1(n10), .Y(n8) );

AOI22X1 U7 ( .A0(n11), .A1(n9), .B0(dout[2]), .B1(n12), .Y(n7) );

AOI21X1 U8 ( .A0(n2), .A1(n9), .B0(n13), .Y(n35) );

OAI22X1 U9 ( .A0(ld), .A1(din[2]), .B0(n14), .B1(n15), .Y(n13) );

AOI31X1 U10 ( .A0(n10), .A1(n9), .A2(dout[0]), .B0(n16), .Y(n15) );

INVX1 U11 ( .A(n17), .Y(n16) );

OAI211X1 U12 ( .A0(n12), .A1(n11), .B0(dout[2]), .C0(n18), .Y(n17) );

NOR3X1 U13 ( .A(dout[1]), .B(ud), .C(dout[0]), .Y(n11) );

NOR3X1 U14 ( .A(n10), .B(n19), .C(n20), .Y(n12) );

OAI21XL U15 ( .A0(n14), .A1(n21), .B0(n18), .Y(n2) );

AOI22X1 U16 ( .A0(ud), .A1(n19), .B0(dout[1]), .B1(n20), .Y(n21) );

OAI21XL U17 ( .A0(n22), .A1(n10), .B0(n23), .Y(n36) );

AOI2BB2X1 U18 ( .B0(din[1]), .B1(n14), .A0N(n24), .A1N(dout[1]), .Y(n23) );

AOI221X1 U19 ( .A0(n25), .A1(n19), .B0(n26), .B1(dout[0]), .C0(n6), .Y(n22)

);

INVX1 U20 ( .A(n18), .Y(n6) );

OAI21XL U21 ( .A0(n19), .A1(n18), .B0(n27), .Y(n37) );

AOI22X1 U22 ( .A0(n28), .A1(n19), .B0(din[0]), .B1(n14), .Y(n27) );

OAI21XL U23 ( .A0(ent), .A1(enp), .B0(ld), .Y(n18) );

AND2X1 U24 ( .A(rstn), .B(n28), .Y(N24) );

OAI221XL U25 ( .A0(n29), .A1(n30), .B0(n31), .B1(n32), .C0(n24), .Y(N23) );

AOI22X1 U26 ( .A0(dout[0]), .A1(n25), .B0(n19), .B1(n26), .Y(n24) );

INVX1 U27 ( .A(n30), .Y(n26) );

INVX1 U29 ( .A(n32), .Y(n25) );

NAND2X1 U30 ( .A(n28), .B(ud), .Y(n32) );

NOR3X1 U31 ( .A(n3), .B(n10), .C(n9), .Y(n31) );

NAND2X1 U35 ( .A(n28), .B(n20), .Y(n30) );

INVX1 U36 ( .A(ud), .Y(n20) );

NOR3X1 U37 ( .A(enp), .B(ent), .C(n14), .Y(n28) );

INVX1 U38 ( .A(ld), .Y(n14) );

NOR3X1 U39 ( .A(dout[1]), .B(dout[3]), .C(dout[2]), .Y(n29) );

EDFFX1 rc_reg ( .D(N23), .E(N24), .CK(clk), .Q(rc) );

DFFRX1 dout_reg_0_ ( .D(n37), .CK(clk), .RN(rstn), .Q(dout[0]), .QN(n19) );

DFFRX1 dout_reg_3_ ( .D(n34), .CK(clk), .RN(rstn), .Q(dout[3]), .QN(n3) );

DFFRX1 dout_reg_2_ ( .D(n35), .CK(clk), .RN(rstn), .Q(dout[2]), .QN(n9) );

DFFRX1 dout_reg_1_ ( .D(n36), .CK(clk), .RN(rstn), .Q(dout[1]), .QN(n10) );

endmodule

module iopads ( LD_PAD, ENT_PAD, ENP_PAD, UD_PAD, CLK_PAD, RSTN_PAD, DIN_PAD_0,

DIN_PAD_1, DIN_PAD_2, DIN_PAD_3, DOUT_PAD_0, DOUT_PAD_1, DOUT_PAD_2,

DOUT_PAD_3, RC_PAD, ld_core, ent_core, enp_core, ud_core, clk_core,

rstn_core, din_core, dout_core, rc_core, Port1 );

output [3:0] din_core;

input [3:0] dout_core;

input LD_PAD, ENT_PAD, ENP_PAD, UD_PAD, CLK_PAD, RSTN_PAD, DIN_PAD_0,

DIN_PAD_1, DIN_PAD_2, DIN_PAD_3, rc_core;

output DOUT_PAD_0, DOUT_PAD_1, DOUT_PAD_2, DOUT_PAD_3, RC_PAD, ld_core,

ent_core, enp_core, ud_core, clk_core, rstn_core;

inout Port1;

PDIDGZ ld ( .PAD(LD_PAD), .C(ld_core) );

PDIDGZ ent ( .PAD(ENT_PAD), .C(ent_core) );

PDIDGZ enp ( .PAD(ENP_PAD), .C(enp_core) );

PDIDGZ ud ( .PAD(UD_PAD), .C(ud_core) );

PDIDGZ clk ( .PAD(CLK_PAD), .C(clk_core) );

PDO04CDG rc ( .I(rc_core), .PAD(RC_PAD) );

PDIDGZ din_0 ( .PAD(DIN_PAD_0), .C(din_core[0]) );

PDIDGZ din_1 ( .PAD(DIN_PAD_1), .C(din_core[1]) );

PDIDGZ din_2 ( .PAD(DIN_PAD_2), .C(din_core[2]) );

PDIDGZ din_3 ( .PAD(DIN_PAD_3), .C(din_core[3]) );

PDO04CDG dout_0 ( .I(dout_core[0]), .PAD(DOUT_PAD_0) );

PDO04CDG dout_1 ( .I(dout_core[1]), .PAD(DOUT_PAD_1) );

PDO04CDG dout_2 ( .I(dout_core[2]), .PAD(DOUT_PAD_2) );

PDO04CDG dout_3 ( .I(dout_core[3]), .PAD(DOUT_PAD_3) );

PDIDGZ rstn ( .PAD(RSTN_PAD), .C(rstn_core) );

endmodule

module ls169top ( LD, ENT, ENP, UD, CLK, RSTN, DIN, DOUT, RC );

input [3:0] DIN;

output [3:0] DOUT;

input LD, ENT, ENP, UD, CLK, RSTN;

output RC;

wire ldc, entc, enpc, udc, clkc, rstnc, rcc;

wire [3:0] dinc;

wire [3:0] doutc;

iopads iopads ( .LD_PAD(LD), .ENT_PAD(ENT), .ENP_PAD(ENP), .UD_PAD(UD),

.CLK_PAD(CLK), .RSTN_PAD(RSTN), .DIN_PAD_0(DIN[0]), .DIN_PAD_1(DIN[1]),

.DIN_PAD_2(DIN[2]), .DIN_PAD_3(DIN[3]), .DOUT_PAD_0(DOUT[0]),

.DOUT_PAD_1(DOUT[1]), .DOUT_PAD_2(DOUT[2]), .DOUT_PAD_3(DOUT[3]),

.RC_PAD(RC), .ld_core(ldc), .ent_core(entc), .enp_core(enpc),

.ud_core(udc), .clk_core(clkc), .rstn_core(rstnc), .din_core(dinc),

.dout_core(doutc), .rc_core(rcc) );

ls169 ls169 ( .ld(ldc), .ent(entc), .enp(enpc), .ud(udc), .clk(clkc), .rstn(

rstnc), .din(dinc), .dout(doutc), .rc(rcc) );

PVDD1DGZ PAD_VDD1(.VDD(VDD));

PVDD1DGZ PAD_VDD2(.VDD(VDD));

PVSS1DGZ PAD_VSS1(.VSS(VSS));

PVSS1DGZ PAD_VSS2(.VSS(VSS));

PCORNERDG CORNER1();

PCORNERDG CORNER2();

PCORNERDG CORNER3();

PCORNERDG CORNER4();

endmodule

附录

set sdc_version 1.7

set_operating_conditions -max slow -max_library slow\

-min fast -min_library fast

set_wire_load_model -name tsmc18_wl20 -library slow

set_max_fanout 25 [current_design]

set_load -min -pin_load 2 [get_ports {DOUT[3]}]

set_load -min -pin_load 2 [get_ports {DOUT[2]}]

set_load -min -pin_load 2 [get_ports {DOUT[1]}]

set_load -min -pin_load 2 [get_ports {DOUT[0]}]

set_load -min -pin_load 2 [get_ports RC]

set_ideal_network [get_ports CLK]

set_ideal_network [get_ports RSTN]

create_clock [get_ports CLK] -name clk -period 20 -waveform {0 10}

set_clock_latency -max 0.3 [get_clocks clk]

set_clock_latency -source -max 0.3 [get_clocks clk]

set_clock_uncertainty -setup 0.3 [get_clocks clk]

set_clock_transition -rise 0.2 [get_clocks clk]

set_clock_transition -fall 0.2 [get_clocks clk]

set_input_delay -clock clk -max 12 [get_ports {DIN[3]}]

set_input_delay -clock clk -max 12 [get_ports {DIN[2]}]

set_input_delay -clock clk -max 12 [get_ports {DIN[1]}]

set_input_delay -clock clk -max 12 [get_ports {DIN[0]}]

set_input_delay -clock clk -max 12 [get_ports LD]

set_input_delay -clock clk -max 12 [get_ports UD]

set_input_delay -clock clk -max 12 [get_ports ENT]

set_input_delay -clock clk -max 12 [get_ports ENP]

set_output_delay -clock clk -max 12 [get_ports {DOUT[3]}]

set_output_delay -clock clk -max 12 [get_ports {DOUT[2]}]

set_output_delay -clock clk -max 12 [get_ports {DOUT[1]}]

set_output_delay -clock clk -max 12 [get_ports {DOUT[0]}]

set_output_delay -clock clk -max 12 [get_ports RC]

附录四:

Version: 1

Pad: ld E

Pad: ent E

Pad: enp E

Pad: ud W

Pad: clk W

Pad: rc N

Pad: din_0 S

Pad: din_1 S

Pad: din_2 S

Pad: din_3 S

Pad: dout_0 N

Pad: dout_1 N

Pad: dout_2 N

Pad: dout_3 N

Pad: rstn W

Pad: PAD_VDD1 W 

Pad: PAD_VDD2 W 

Pad: PAD_VSS1 E 

Pad: PAD_VSS2 E 

Pad: CORNER1 NW 

Pad: CORNER2 NE 

Pad: CORNER3 SE 

Pad: CORNER4 SW

本文来源:https://www.2haoxitong.net/k/doc/1bd4d05b4a35eefdc8d376eeaeaad1f3469311d2.html

《半定制设计 - 74LS169计数器功能模块分析.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式