fpga设计报告模板
成 绩 评 定 表
课程设计任务书
摘 要
本设计实现串行NRZ 码输入,manchester 码输出;manchester 码输入,NRZ 输出。 其中包括NRZ 码字按照编码规则编码;解码恢复NRZ 码;编码时2x 时钟输入,在内部进行分频;解码时钟恢复选作;工作时钟10kHz 即可;自行设计设计下载后的验证方案;完成全部流程:设计文档、模块设计、代码输入、功能仿真、约束与综合、布局布线、下载验证等。
本设计重点采用Verilog HDL 描述、ModelSim 进行功能仿真、QuartusII 进行逻辑综合和适配下载,最后在Altera 公司的Cyclone 的芯片EP20Q240C8上实现并完成测试。
在此设计过程中,完整地建立了测试平台,通过8段数码管的显示与输出波形的验证,完成了功能和时序仿真,成功实现了串行NRZ 码输入,曼彻斯特码输出;曼彻斯特码输入,NRZ 输出。在完成本次设计的同时考虑到其实用性方面,曼彻斯特码是一种数据通讯线性码,它的每一个数据比特都是由至少一次电压转换的形式所表示的。曼彻斯特编码因此被认为是一种自定时码。自定时意味着数据流的精确同步是可行的。每一个比特都准确的在一个预先定义时间时期的时间中被传送。曼彻斯特编码已经被许多高效率且被广泛使用的电信标准所采用,例如以太网电讯标准. 曼彻斯特编码是一种超越传统数字传输的信道编码技术,由于其具有隐含时钟、去除了零频率信号的特性使得它在数据传输等领域中得到广泛的应用。
关键词 曼彻斯特编解码;Verilog HDL;FPGA ;仿真;综合
目 录
摘 要 ....................................................................................................................................... III 引 言 .......................................................................................................................................... 1 1 总体电路结构设计 .............................................................................................................. 1
1.1 曼彻斯特编解码电路原理 ...................................................................................... 2 1.2 主要算法 ................................................................................................................... 2 1.3 功能电路设计 ........................................................................................................... 3 1.4 顶层TOP 的设计 ..................................................................................................... 4 2 功能仿真 .............................................................................................................................. 6
2.1 仿真的功能列表 ...................................................................................................... 6 2.2 顶层仿真平台与激励 .............................................................................................. 6 2.3 电路功能仿真结果 .................................................................................................. 7 3 约束及逻辑综合 .................................................................................................................. 7
3.1 约束策略 .................................................................................................................. 7 3.2 脚本 .......................................................................................................................... 7 3.3 综合文件 ................................................................................................................ 10 3.4 综合环境 ................................................................................................................ 10 3.5 综合过程 ................................................................................................................ 11 4 布局布线 ............................................................................................................................ 13
4.1 文件准备 ................................................................................................................ 13 4.2 布局布线过程 ........................................................................................................ 13 4.3 物理验证 ................................................................................................................ 15 5 后仿真 ................................................................................................................................ 17 6 总结 .................................................................................................................................... 18 参考文献 .................................................................................................................................. 19 附录A :顶层设计源代码 ...................................................................................................... 20 附录B :电路源代码 .............................................................................................................. 21 附录C :设计约束代码 .......................................................................................................... 31 附录D :IOPAD 代码 . ............................................................................................................ 32
引 言
曼彻斯特编码是一种自同步的编码方式,也就是说其时钟同步信号就隐藏在数据波形中。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作为时钟信号,又作为数据信号:从高电平到低电平的跳变表示“0”,从低电平到高电平的跳变表示“1”。还有一种是差分曼彻斯特编码,每位中间的跳变仅仅提供时钟定时,而用每位开始时有跳变为“0”,无跳变为“1”。由于曼彻斯特码既能提供足够的定时分量,又无直流漂移,编码过程相对简单,因而曼彻斯特码被广泛应用于数据传输、局域网以及测井技术等领域。
本设计主要研究的内容是曼彻斯特编解码器的设计和实现。为了能够顺利地完成编解码任务,它应该包括这样2个部分:编码电路,解码电路(即串行NRZ 码输入,manchester 码输出;manchester 码输入,NRZ 输出。),为了验证电路系统能否顺利完成曼彻斯特码的编解码功能,可以采用Altera 公司的集成开发工具QuartusII11.0实现设计。基本流程如下:首先,根据任务书要求,进行方案的设计,包括引脚确定、时序关系、功能框图、模块划分、数据处理流程与方法等;然后依据模块设计进行模块的HDL 代码的输入与功能仿真,功能仿真采用HDL 仿真工具Modelsim 测试平台;完成功能仿真后,在QuartusII 平台下进行电路的约束与综合;综合结果无误后,进行布局布线,生成配置文件;在下载前进行时序分析,最后进行下载,测试与调试,完成本设计方案。本实验输入输出设备简单,可以在实验板上完成功能验证,采用开关和数码管作为输入输出设备完成验证。
1 总体电路结构设计
1.1 曼彻斯特编码电路原理
曼彻斯特编解码电路包括两个部分,即编码电路部分,解码电路部分。其中,编码部分用按照编码规则编码的NRZ 字码作为普通的信号输入,将输入的信号编码为曼彻斯特码,然后输出;解码部分负责将曼彻斯特码解码成普通的二进制数据编码。二个相对独立的模块相互协同工作,共同完成曼彻斯特编解码的工作,同时相互独立的模块结构更有利于查找电路中存在的问题,便于维护。以下曼彻斯特编码电路设计。
(一)曼彻斯特编码电路设计:曼彻斯特码在一个码元的开始时刻要对普通信号进行一次采样,并且有可能会发生一次跳变,在码元的中间位置一定发生跳变,因此编码信号的频率是数据时钟频率的两倍。曼彻斯特码是用“01”和“10”来表示普通二进制数据中的“1”和“0”的,因此现在只需要将二分频的时钟与输入的nrz 码同或,然后再将串行数据输出,这样,输出的串行数据就是曼彻斯特码。
(二)曼彻斯特解码电路设计:曼彻斯特解码电路设计的关键是准确地从曼彻斯特码的数据流中提取出“10”和“01”信号,并且把它们转换成普通二进制编码中的“0”和“1”。为了更准确得解码曼彻斯特码,我们需要一个频率不小于奈奎斯特频率的采样时钟,即采样时钟的频率至少是曼彻斯特码频率的两倍。在实际设计电路时,我们可以采用一个缓存器,储存上一个时钟采集到的信号和当前时钟采集到的信号,用反相器达到效果,当缓存器的内容是“10”时,输出“1”;当缓存器的内容是“01”时,输出“0”。
图1.1 数字信号与曼彻斯特编码波形
1.2 主要算法
本电路设计的主要难点在于时序,也就是在编解曼彻斯特的时间的分频。编曼彻斯特码时,在一个码元的开始时刻要对普通信号进行一次采样,并且有可能会发生一次跳变,在码元的中间位置一定发生跳变,因此编码信号的频率是数据时钟频率的两倍;解码曼彻斯特码时,我们需要一个频率不小于奈奎斯特频率的采样时钟,即采样时钟的频率至少是曼彻斯特码频率的两倍,且曼彻斯特码的频率是普通二进制编码信号频率的两
图1.2曼彻斯特编解码电路系统框图
1.3 功能电路设计
功能电路电路的文件名为rili.v , 根据信号功能将接口分为5部分,分别是时钟信号、复位信号、开关控制信号、输入信号、输出信号。具体接口如下表1.1所示。
表1.2 接口信号表
电路的功能框图如下所示。
图1.1 电路功能框图
1.4 顶层TOP 的设计
因为本设计是要一起综合功能电路和PAD ,所以需要顶层的文件,该文件为dcLabTop.v ,此部分内部包含了功能电路和PAD 。具体接口如下表1.2所示。
表1.3 TOP的接口信号表
电路的功能框图如下所示。
图1.2 TOP的功能框图
根据选用的工艺库,这里输入clk 、rstn 、puls1、puls2、puls3、chose 所选择的PAD 为PDIDGZ ,输出dout 选择的PAD 为PDO04CDG 。
2 功能仿真
2.1 仿真的功能列表
功能仿真要针对每一条设计需要实现的功能进行。设计中要求实现的、需要仿真功能列表如下:
1) 复位功能——当复位信号低有效时,电路应处于复位状态:运行控制信号处于
无效(低电平)、任何输入没有响应、数码管显示0;当复位信号变为高电平时,电路正常工作。
2) 时钟信号——当有时钟时电路正常工作;没有时钟信号时,除复位外所有的输
入没有响应,所有的输出没有变化。
3) 时间调整模块,当分别按下puls1,puls2,puls3三个开关对时分秒或年月日进
行递增处理。
4) 数码显示——8只数码管显示的是数字0——9,个位计到9向十位进1,同时
再从0开始计数。
5) 显示控制开关chose ,当chose 未按下时显示的是时分秒,当chose 按下时显示
的是年月日。
2.2 顶层仿真平台与激励
仿真激励的构造要尽可能多的构造出所有可能,并能验证电路功能。这里构造一个测试平台,相应文件为dcLabTop_tb.v,其中将位于文件dcLabTop_stim.v中的激励信号引入,加载到例化的功能模块中,测试平台设定时间单位为1us ,并引用电路模块。构建激励文件,一是要构造时钟clk 和异步复位信号rstn ,复位信号只要开始为零,之后让电路正常工作即可;二是输入信号puls1,puls2,puls3,这里依次给出的信号各自在一段时间内有效。三是输入信号chose ,这里给出的是开始为0,10000000us 后为1。根据日历电路的原理,通过观察仿真结果,当仿真结果与计算结果一致时,说明电路设计的功
能没有问题。
2.3 电路功能仿真结果
这里仿真结果,如下图。
3 约束及逻辑综合
3.1 约束策略
对于一个由时钟控制的数字逻辑电路来说,时序是最为重要的。dcLabTop.v 是本设计所要约束的文件。本设计定的时钟CLK 的频率为100KHz ,即周期为10000ns 。输入为puls1、puls2、puls3、chose ,输出为dout ,他们都是由CLK 信号同步控制,所以这些信号延时约占时钟信号的60%,即输入输出延时设置为6000ns 。本设计没有输入输出信号都是clk 信号同步控制,故并不存在纯组合逻辑电路。
3.2 脚本
首先是读入源代码,也就是HDL 文本描述的设计文件,此处不用制定目录,Design Compiler 会在搜索目录中搜索。tcl 语句如下:
read_verilog {dcLabTop.v rili.v}
读入设计原文件后,一般设定当前设计,这样约束条件才可能有针对性的施加。tcl 语句如下:
current_design dcLabTop
设定当前设计后,要完成链接,也就是将设计与库链接起来,用于映射过程中搜索相应的单元,完成综合。tcl 语句如下:
Link
检查设计,主要完成检查转换的设计。tcl 语句如下:
check_design
然后对设计设定时序约束,这是最重要的一项约束,用于设定设计的工作速度。针对不同的设计部分,有不同的约束方法。针对本次设计,采用全同步,双时钟工作的实际情况。以下语句设定时钟及属性、输入输出信号时间余量。
设定名称为CLK 的时钟,由于采用100KHz 的时钟,故设定时钟周期为10000ns 。tcl 语句如下:
create_clock -name "clk" -period 10000 [get_ports CLK]
设定时钟的渡越时间为0.2ns 。tcl 语句如下:
set_clock_transition -max 0.2 [get_clocks clk]
设定输入信号最大时间延时。tcl 语句如下:
set_input_delay -max 6000 -clock clk [get_ports PULS1]
set_input_delay -max 6000 -clock clk [get_ports PULS 2]
set_input_delay -max 6000 -clock clk [get_ports PULS 3]
set_input_delay -max 6000 -clock clk [get_ports CHOSE]
设定输出信号最大时间延时。tcl 语句如下:
set_output_delay -max 6000 -clock clk [get_ports SEG_REG]
set_output_delay -max 6000 -clock clk [get_ports LED_SEL]
告诉综合器不要对时钟网络进行驱动,这个工作将在后续版图布局布线中进行。tcl 语句如下:
set_dont_touch_network [get_clocks "clk"]
set_ideal_network [get_ports "CLK"]
告诉综合器不要对复位进行驱动。tcl 语句如下:
set_dont_touch_network [get_ports RSTN]
set_ideal_network [get_ports RSTN]
检查时序。tcl 语句如下:
check_timing
设定综合的操作条件。tcl 语句如下:
set_operating_conditions -max slow -max_library slow -min fast -min_library fast
设定线负载模型,本设计选择tsmc18_wl50模型。tcl 语句如下:
set_wire_load_model -name tsmc18_wl50 -library slow
设定输出负载电容。tcl 语句如下:
set_load -pin_load 2 [get_ports SEG_REG]
set_load -pin_load 2 [get_ports LED_SEL]
设定扇出最大负载能力。tcl 语句如下:
set_max_fanout 6900 dcLabTop
驱动能力设定。tcl 语句如下:
set_drive 2.0 [get_ports "CLK RST PULS1 PULS2 PULS3 CHOSE"]
设定输出网表的格式规则,以消除gate level nelist中的assign 。tcl 语句如下: set verilogout_no_tri true
set_fix_multiple_port_nets -all -buffer_constants
最大能力进行综合。tcl 语句如下:
compile -map high
输出时序报告。tcl 语句如下:
rc > ../output/tim.log
输出网表。tcl 语句如下:
write -f verilog -hier -o ../netlst/ dcLabTop.sv
输出综合数据文件。tcl 语句如下:
write -f ddc -hier -o ../output/ dcLabTop.ddc
输出延时文件。tcl 语句如下:
write_sdf -version 2.1 ../output/ dcLabTop.sdf
输出面积文件。tcl 语句如下:
report_area > ../output/ dcLabTop.area.log
3.3 综合文件
首先在家目录下建立dcLab 作为本次实验dc 的操作主目录。在dcLab 目录下,建立设计存放目录如code 、约束文件目录如constrn 、输出网表文件目录ntlst 、报告输出目录rpt 、log 文件目录log 、dc 启动目录work ,等等。
在综合前需要准备以下几个文件,以便使软件可以正常工作。
.synopsys_dc.setup文件即启动项文件:
在这个文件中,需要将所用到的库单元文件的路径和电路设计文件所存放的路径写入,以便软件在工作时能够找到这些文件并正确识别,本设计将它存放在work 目录下。
rili.v dcLabTop.v文件:
因为本次课程设计所使用电路描述语言为verilog HDL 语言,所以至少需要将顶层TOP 设计文件、功能电路的设计文件,即准备好一个正确可用的设计,以便用于约束综合,本设计将rili.v dcLabTop.v文件存放在code 目录下。
Tcl 语句文件:
在本次课程设计中使用的是命令界面,使用Tcl 语言进行操作,所以需要准备好相应的Tcl 命令,以便对设计进行约束综合等相应操作,本设计将它存放在constrn 目录下。
库文件:
本设计采用的是tsmc 公司的0.18um 标准单元库的所有文件,存放在目录:/opt/eda/designKit/下面。
3.4 综合环境
/opt/eda/designKit/cic_tsmc18/synDC/sow.db
/opt/eda/designKit/cic_tsmc18/synDC/fast.db
/opt/eda/designKit/cic_tsmc18/synDC/ tpz973gwc.db
/opt/eda/designKit/cic_tsmc18/synDC/ tpz973gbc.db
/opt/eda/synopsys/dc2007/libraries/syn/dw_foundation.sldb
/opt/eda/designKit/cic_tsmc18/synDC/typical.db
/opt/eda/synopsys/dc2007/libraries/syn/gtech.db
/opt/eda/synopsys/dc2007/libraries/syn/ standard.sldb
3.5 综合过程
3.5.1 综合流程
按照所定义的电路的测量特征所要达到的目标,Design Compiler综合一个电路并将其放入目标库中,这样可以生成适用于你的计算机辅助设计工程(CAE )工具的原理图或网表。
综合的过程如下:
•
•
•
•
• 读入设计及其子设计 设置顶层的设计特性参数 设置实际时序和面积目标参数 执行check_design验证设计,识别并且更正错误 进行Design Compiler优化
综合流程如下:
设置启动项文件→读入源代码→链接,设计检查→时序路径约束→编译综合→结束
3.5.2 综合操作过程
首先打开Linux 中命令终端。进入以准备好的.synopsys_dc.setup文件所在路径。执行命令,打开Design Compiler。进入Tcl 命令界面,命令如下:
cd dcLab /work
dc_shell-t
运行后,读入文件将在终端得到如下图图4.1界面,即已经进入DC 的Tcl 命令界面。
图3.1 Design Compiler的Tcl 命令界面
因为已经将所要使用的Tcl 语句准备好并形成文件,所以可以使用source 命令来讲Tcl 命令全部读入并执行。命令如下:
source mycon.con
这里我们逐一运行命令,运行后,将在终端得到如下界面,即已经进入约束综合过程。
4 布局布线
4.1 文件准备
同所有的EDA 工具一样,Encounter 在进行设计之前也要准备文件。一般必须要有时序文件lib 、SI 工具CeltIC 进行信号完整性分析的cdb 文件、用于RC 提取的电容表文件capTbl 、综合工具输出的门级综合网表、定义工艺的版图交换文件LEF (Library Exchange Format)、时序约束的sdc (Synthesis Design Constraints)文件、PAD 位置约束的io 文件。其中经过Design Compiler 对其进行综合后获得了网表文件dcLabTop.sv 以及约束文件dcLabTop.sdc ,pad 约束的io 文件需要手工书写。
这里, I/O PAD已经在综合前添加进入网表中,所以在布局布线前只需在网表中的顶层模块下加入电源PAD 和拐角连接PAD ,就行了如下图所示。
图4.1 在网表中加入电源PAD 和拐角连接PAD
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 物理验证
这里物理验证主要是通过Encounter 的Verify 进行几何规则检查(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);
后仿真结果如图5.1。
图5.1 后仿真图
6 总结
做这个课设我就想,按步骤一步一步走吧。从资料收集,到逻辑分析,再到编写程序,时序仿真到最后的上板子实现。一步一步自己慢慢摸索,有时候看到别人做的比我快,就比较烦躁(当时还有考试),想问一下别人吧,同寝室的还忙这自己的,而且他们业没详细的看过我的程序,半桶水业不好给我建议。到最后还是我自己解决,于是我明白了有些事靠别人不靠谱。
这次实验我做的很慢,不过还是做出来了,成就感还是有的,毕竟这是大学第一次最正式的挑战。
总的来说,这次课设是比较难,也比较有收获的一次。它让我明白了做事必须持之以恒。
参考文献
[1] Jan M.Rabaey,Anantha Chandrakasan,Borivoje Nikolic. 数字集成电路. 电子工业出版社,2012.12
[2] 李刚强,田斌,易克初. FPGA设计中关键问题的研究[J]电子技术应用,2003(6)
[3] 杜慧敏 基于Verilog 的FPGA 设计基础 西安电子科技大学出版社, 2006,2
[4] 邹其洪 EDA 技术实验教程 中国电力出版社,2009,2
[5] 江国强 基于EDA 技术与应用 电子工业出版社2004,2
附录A :顶层设计源代码
module dcLabTop(
PULS1,
PULS2,
PULS3,
CHOSE,
CLK,
SEG_REG,
LED_SEL,
RSTN);
//
input PULS1;
input PULS2;
input PULS3;
input CHOSE;
output[7:0] SEG_REG;
input CLK;
output[2:0] LED_SEL;
input RSTN;
//
wire PULS1;
wire PULS2;
wire PULS3;
wire CHOSE;
wire[7:0] SEG_REG;
wire CLK;
wire[2:0] LED_SEL;
wire RSTN;
//
wire puls1c;
wire puls2c;
wire puls3c;
wire chosec;
wire[7:0] seg_regc;
wire clkc;
wire[2:0] led_selc;
wire rstnc;
//
PDIDGZ puls1(.PAD(PULS1),
.C (puls1c));
PDIDGZ puls2(.PAD(PULS2), .C (puls2c)); PDIDGZ puls3(.PAD(PULS3), .C (puls3c)); PDIDGZ chose(.PAD(CHOSE), .C (chosec)); PDIDGZ clk(.PAD(CLK), .C (clkc));
//
PDO04CDG segreg_0 (.I(seg_regc[0]), .PAD(SEG_REG[0])); PDO04CDG segreg_1 (.I(seg_regc[1]), .PAD(SEG_REG[1])); PDO04CDG segreg_2 (.I(seg_regc[2]), .PAD(SEG_REG[2])); PDO04CDG segreg_3 (.I(seg_regc[3]), .PAD(SEG_REG[3])); PDO04CDG segreg_4 (.I(seg_regc[4]), .PAD(SEG_REG[4])); PDO04CDG segreg_5 (.I(seg_regc[5]), .PAD(SEG_REG[5])); PDO04CDG segreg_6 (.I(seg_regc[6]), .PAD(SEG_REG[6])); PDO04CDG segreg_7 (.I(seg_regc[7]), .PAD(SEG_REG[7])); //
PDO04CDG ledsel_0 (.I(led_selc[0]), .PAD(LED_SEL[0])); PDO04CDG ledsel_1 (.I(led_selc[1]), .PAD(LED_SEL[1])); PDO04CDG ledsel_2 (.I(led_selc[2]), .PAD(LED_SEL[2])); //
PDIDGZ rstn(.PAD(RSTN), .C (rstnc));
//
dcLabCore dcLabCore (
.puls1 ( puls1c ), // I
.puls2 ( puls2c ), // I
.puls3 ( puls3c ), // I
.chose ( chosec ), // I
.seg_reg ( seg_regc ), // O
.clk ( clkc ), // I
.led_sel ( led_selc ), // I
.rstn ( rstnc ) ); // I
//
endmodule
附录B :电路源代码
module rili(clk,rstn,seg_reg,puls1,puls2,puls3,chose,led_sel); input clk,rstn,chose;
input puls1,puls2,puls3;
output[2:0] led_sel;
output[7:0]seg_reg;
wire puls1,puls2,puls3;
wire clk,rstn;
reg[7:0]seg_reg;
reg[2:0]led_sel;
reg[3:0]disp_dat;
wire chose;
reg s1,s2,s3;
reg[3:0] qml,qfl,qsl;
reg[3:0] qmh,qfh,qsh;
reg[3:0] qrl,qyl;
reg[3:0] qrh,qyh;
reg[3:0] qn1,qn2,qn3,qn4;
wire[15:0] qn;
reg[3:0] datel,dateh;
wire[7:0] qy;
assign qn={qn4,qn3,qn2,qn1};
assign qy={qyh,qyl};
reg d1,d2,d3,d4,d5,d6,d7,d8,d9;
//clock division
reg a,b,c,d,e,f,h,i,g,k,l,m,n;
wire reset1;
assign reset1=~(~d3&d2)&rstn;
reg dp;
always@(posedge puls1 or negedge reset1) if(!reset1)
dp
else
dp
always@(posedge clk or negedge rstn) if(!rstn)
{s1,d3,d2,d1}
else
{s1,d3,d2,d1}
wire reset2=~(~d6&d5)&rstn;
reg dd;
always@(posedge puls2 or negedge reset2) if(!reset2)
dd
else
dd
always@(posedge clk or negedge rstn) if(!rstn)
{s2,d6,d5,d4}
else
{s2,d6,d5,d4}
wire reset3=~(~d9&d8)&rstn;
reg dh;
always@(posedge puls3 or negedge reset3) if(!reset3)
dh
else
dh
always@(posedge clk or negedge rstn) if(!rstn)
{s3,d9,d8,d7}
else
{s3,d9,d8,d7}
reg[9:0] cnt1000;
always@(posedge clk or negedge rstn) if(!rstn)
cnt1000
else
if(cnt1000==999)
cnt1000
else
cnt1000
//second counter
always @(posedge clk or negedge rstn) if(!rstn)
begin
qml
a
end
else
if (cnt1000==999|(s1==1&chose==0)) if(qml==9)
begin
a
qml
end
else
qml
else a
always @(posedge clk or negedge rstn) if(!rstn)
begin
qmh
b
end
else if(a==1)
if(qmh==5)
begin
qmh
b
end
else
qmh
else b
//minute counter
always @(posedge clk or negedge rstn) if(!rstn)
begin
qfl
c
end
else if (b==1|(s2==1&chose==0)) if(qfl==9)
begin
qfl
c
end
else
qfl
else c
//
always @(posedge clk or negedge rstn) if(!rstn)
begin
qfh
d
end
else if(c==1)
if(qfh==5)
begin
qfh
d
end
else
qfh
else d
//hour counter
always @(posedge clk or negedge rstn) if(!rstn)
begin
qsl
e
end
else if(d==1|(s3==1&chose==0))
if((qsl==3&qsh==2)|qsl==9)
begin
qsl
e
end
else
qsl
else e
//
always @(posedge clk or negedge rstn) if(!rstn)
begin
qsh
f
end
else if(e==1)
if(qsh==2)
begin
qsh
f
end
else
qsh
else f
//day counter
always @(posedge clk or negedge rstn) if(!rstn)
begin
qrl
g
end
else if (f==1|(s1==1&chose==1))
if((qrl==datel&qrh==dateh)|qrl==9) begin
qrl
g
end
else
qrl
else g
//
always @(posedge clk or negedge rstn) if(!rstn)
begin
qrh
h
end
else
if(g==1)
if (qrh==dateh)//(qrh==dateh&qrl==datel) begin
qrh
h
end
else
qrh
else h
//month timer counter
always @(posedge clk or negedge rstn) if(!rstn)
begin
qyl
i
end
else
if(h==1|(s2==1&chose==1))
if((qyl==2&qyh==1)|qyl==9)
begin
qyl
i
end
else
qyl
else i
//
always @(posedge clk or negedge rstn)
if(!rstn)
begin
qyh
n
end
else
if(i==1)
if(qyh==1)
begin
qyh
n
end
else
qyh
else n
always@(posedge clk)
//if(cnt1000==999)
// begin
case(qy)
'h01: begin datel
'h02: begin
if((qn%4==0)&( qn%100!==0)|( qn%400==0))
else begin datel
'h03: begin datel
'h04: begin datel
'h05: begin datel
begin datel
'h06: begin datel
'h07: begin datel
'h08: begin datel
'h09: begin datel
'h10: begin datel
'h11: begin datel
'h12: begin datel
default: begin datel
endcase
// end
//nian
wire yearen;
assign yearen =((qml==9)&(qmh==5)&(qfl==9)&(qfh==5)&(qsl==3)&(qsh==2)&(qrl==datel)&(qrh==dateh)&(qyl==2)&(qyh==1));
always @(posedge clk or negedge rstn)
if(!rstn)
begin
qn1
k
end
else
if(n==1|(s3==1&chose==1))
if(qn1==9)
begin
qn1
k
end
else
qn1
else k
//
always @(posedge clk or negedge rstn)
if(!rstn)
begin
qn2
l
end
else
if(k==1)
if(qn2==9)
begin
qn2
l
end
else
qn2
else l
//
always @(posedge clk or negedge rstn)
if(!rstn)
begin
qn3
m
end
else
if(l==1)
if(qn3==9)
begin
qn3
m
end
else
qn3
else m
//
always @(posedge clk or negedge rstn)
if(!rstn)
qn4
else if(m==1)
if (qn4==9)
qn4
else
qn4
//
//
always@(disp_dat)
begin
case(disp_dat)//xianshi0--9
4'h0:seg_reg
4'h1:seg_reg
4'h2:seg_reg
4'h3:seg_reg
4'h4:seg_reg
4'h5:seg_reg
4'h6:seg_reg
4'h7:seg_reg
4'h8:seg_reg
4'h9:seg_reg
default seg_reg
endcase
end
always@(posedge clk,negedge rstn)
if(!rstn) led_sel
else led_sel
always@(led_sel)
case(led_sel)
0: if(chose)
disp_dat
else disp_dat
1: if(chose)
disp_dat
else disp_dat
2: if(chose)
disp_dat
else disp_dat
3: if(chose)
disp_dat
else disp_dat
4: if(chose)
disp_dat
else disp_dat
5: if(chose)
disp_dat
else disp_dat
6: if(chose)
disp_dat
else disp_dat
7: if(chose)
disp_dat
else disp_dat
endcase
endmodule
附录C :设计约束代码
read_file -format verilog {/home/user24/Desktop/dcLab/code/dcLabCore.v
/home/user24/Desktop/dcLab/code/dcLabTop.v /home/user24/Desktop/dcLab/code/iopads.v } current_design dcLabCore
link
check_design
uplevel #0 check_design
#time constraint
#added yourself,it is sample below
create_clock -name "clk" -period 20 -waveform { 10 20 } { clk }
set_dont_touch_network [ find clock clk ]
set_input_delay -clock clk -max -rise 12 "puls1 puls2 puls3"
set_input_delay -clock clk -max -fall 12 "puls1 puls2 puls3"
set_output_delay -clock clk -max -rise 12 "{seg_reg[7]} {seg_reg[6]} {seg_reg[5]}
{seg_reg[4]} {seg_reg[3]} {seg_reg[2]} {seg_reg[1]} {seg_reg[0]} {seg_reg[7]} {seg_reg[2]} {seg_reg[5]} {seg_reg[0]} {seg_reg[3]} {seg_reg[6]} {seg_reg[1]} {seg_reg[4]}" set_output_delay -clock clk -max -fall 12 "{seg_reg[7]} {seg_reg[6]} {seg_reg[5]}
{seg_reg[4]} {seg_reg[3]} {seg_reg[2]} {seg_reg[1]} {seg_reg[0]} {seg_reg[7]} {seg_reg[2]} {seg_reg[5]} {seg_reg[0]} {seg_reg[3]} {seg_reg[6]} {seg_reg[1]} {seg_reg[4]}"
set_max_delay 5 -fall -to { {led_sel[2]} {led_sel[1]} {led_sel[0]} {led_sel[2]} {led_sel[0]} {led_sel[1]} }
set_driving_cell -lib_cell PDIDGZ -pin C -from_pin PAD -library tpz973gwc { puls1 puls2 puls3 }
set_load 3.000000 [get_ports "puls1"]
set_load 3.000000 [get_ports "puls2"]
set_load 3.000000 [get_ports "puls3"]
set_operating_conditions -min_library fast -min fast -max_library fast -max fast set_wire_load_model -name umc18_wl20 -library fast
set_max_fanout 20 dcLabCore
set_max_transition 2 dcLabCore
#compile -exact_map
#uplevel #0 { report_constraint -all_violators -significant_digits 8 -max_area -max_delay -max_capacitance -max_transition -max_fanout -cell_degradation -max_dynamic_power -max_leakage_power -multiport_net -nosplit }
#
change_names -hierarchy -rules name_rule
set verilogout_no_tri true
set_fix_multiple_port_nets -all -buffer_constants
compile -map high
#
rc > ../output/tim.log
write -f verilog -hier -o ../netlst/dc_top.sv
write -f ddc -hier -o ../output/dc_top.ddc
write_sdc ../output/dc_top.sdc
report_area > ../output/top.area.log
wirte_sdf -verison 2.1 ..rpt/dc_top.sdf
#
附录D :IOPAD 代码
module iopads(
PULS1_PAD,
PULS2_PAD,
PULS3_PAD,
CHOSE_PAD,
CLK_PAD,
SEG_REG_PAD,
LED_SEL_PAD,
RSTN_PAD,
//
puls1_core,
puls2_core,
puls3_core,
chose_core,
clk_core,
seg_reg_core,
led_sel_core,
rstn_core);
input PULS1_PAD;
input PULS2_PAD;
input PULS3_PAD;
input CHOSE_PAD;
output[7:0] SEG_REG_PAD;
input CLK_PAD;
output[2:0] LED_SEL_PAD;
input RSTN_PAD;
//
output puls1_core;
output puls2_core;
output puls3_core;
output chose_core;
input[7:0] seg_reg_core;
output clk_core;
input[2:0] led_sel_core;
output rstn_core;
//
wire PULS1_PAD;
wire puls1_core;
wire PULS2_PAD;
wire puls2_core;
wire CLK_PAD;
wire clk_core;
wire PULS3_PAD;
wire puls3_core;
wire CHOSE_PAD;
wire chose_core;
wire[7:0] SEG_REG_PAD;
wire[7:0] seg_reg_core;
wire[2:0] LED_SEL_PAD;
wire[2:0] led_sel_core;
wire RSTN_PAD;
wire rstn_core;
//************************************************** PDIDGZ puls1(.PAD(PULS1_PAD), .C (puls1_core)); PDIDGZ puls2(.PAD(PULS2_PAD), .C (puls2_core)); PDIDGZ puls3(.PAD(PULS3_PAD), .C (puls3_core)); PDIDGZ chose(.PAD(CHOSE_PAD), .C (chose_core)); PDIDGZ clk(.PAD(CLK_PAD), .C (clk_core)); //
PDO04CDG segreg_0 (.I(seg_reg_core[0]), .PAD(SEG_REG_PAD[0])); PDO04CDG segreg_1 (.I(seg_reg_core[1]), .PAD(SEG_REG_PAD[1])); PDO04CDG segreg_2 (.I(seg_reg_core[2]), .PAD(SEG_REG_PAD[2])); PDO04CDG segreg_3 (.I(seg_reg_core[3]), .PAD(SEG_REG_PAD[3]));
PDO04CDG segreg_4 (.I(seg_reg_core[4]), .PAD(SEG_REG_PAD[4])); PDO04CDG segreg_5 (.I(seg_reg_core[5]), .PAD(SEG_REG_PAD[5])); PDO04CDG segreg_6 (.I(seg_reg_core[6]), .PAD(SEG_REG_PAD[6])); PDO04CDG segreg_7 (.I(seg_reg_core[7]), .PAD(SEG_REG_PAD[7])); //
PDO04CDG ledsel_0 (.I(led_sel_core[0]), .PAD(LED_SEL_PAD[0])); PDO04CDG ledsel_1 (.I(led_sel_core[1]), .PAD(LED_SEL_PAD[1])); PDO04CDG ledsel_2 (.I(led_sel_core[2]), .PAD(LED_SEL_PAD[2])); //
PDIDGZ rstn(.PAD(RSTN_PAD), .C (rstn_core));
//
//PDIDGZ dum0 ();
//PDO04CDG dum1 ();
//
//PCORNERDG Pcornerlr();
//PCORNERDG Pcornerll();
//PCORNERDG Pcornerur();
//PCORNERDG Pcornerul();
//PVDD1DGZ Pvdd1();
//PVDD1DGZ Pvdd0();
//PVSS1DGZ Pvss1();
//PVSS1DGZ Pvss0();
//
endmodule