FPGA学习日志5(时序电路基础,流水灯)

总览:本文是基于 Xilinx 的zynq-7010开发板实现简单的4个led灯流水,并附上相应代码注释以及一些基本语法知识

`timescale 1ns / 1ps

#500 :延时500ns,精度为1ps

加位宽’d数字会变颜色,更好看,推荐加位宽

 a<='d1:非阻塞式赋值


        begin

                                //多条赋值语句
        end

数据类型:

1.top.v

其中第一行是时间刻度,与之前仿真文件不同的是,我的源文件无论是单位还是精度都 采用了 1ps,首先我们要知道,延迟是无法被综合的,也就是代码中的延迟,在综合时会被 忽略,我们在源代码中添加延迟,主要是为了模拟一个寄存器的延迟,因为实际的硬件中, 寄存器赋值本身就不是一瞬间的事情,一般来说,7 系列 a 架构的 FPGA 寄存器延迟大概在

50ps 左右。 定义了两个 parameter 参数,一个是时钟频率,一个是 LED 的流水时间,设置成

parameter 类型的参数方便在上层模块或者换了板卡时,或者想要改变流水速度时方便修改。 端口定义了三个端口,因为是时序逻辑电路,所以最主要的便是时钟端口,通过输入一 个稳定的时钟,让内部逻辑有个统一的时间刻度,并让其在规定时间内完成规定的事。输入 了一个复位端口,通过复位信号给整个时序逻辑一个固定的初值。输出了四个 LED 端口。 定义了一个 localparam 参数用来计算当前 LED 流水速度下时钟需要计数的次数,由于这 个参数是根据时钟频率和流水速度共同决定,所以并不是一个外部能够直接修改的值,所以 采用 localparam 的形式。

16 行的 always 语句定义了一个计数器,触发信号为时钟上升沿或者复位下降沿,当复位 时将计数器的值清 0,在未复位时让计数器不断加 1,直到加满 localparam 计算出的计数最大 值时清 0,反复此操作。21 行运行的是流水灯控制器,每当计数器计数到最大值时,就让

LED 的状态循环移位一位,达到流水灯的效果。 可以发现,在每个赋值语句中,采用了非阻塞赋值的同时还添加了一个#1 的延迟,这 个延迟就是用于模拟真实寄存器延迟,当然,这个延迟并不与寄存器延迟相同,只是起到一 个延迟的效果,并且这段延迟是无法被综合的。

50M转化位二进制有26位宽,所以用[25:0]给其26位宽的资源

接下来添加仿真文件,与 1.1 仿真文件不同的是,时序逻辑电路的仿真文件需要模拟时 钟激励和复位激励。

在 9 行给时钟和复位赋了初值,并让复位信号在 500ns 后取消复位状态,我们使用的板 卡上的按键是按下为低电平,所以低电平为复位状态。在 13 行紧跟了一行 always 语句,由于 时钟是不断变化的,所以需要 always 一直执行,板卡采用的是 50M 的时钟,也就是 20ns 的 周期,所以时钟在 10ns 就需要翻转一次。

2.tb_top

仿真文件中:

*用点引出参数

*参数可以直接填值,只有输入端口可以直接填值,输出端口必须填一个信号或者是不连

*输入端口可以是wire和reg信号,因为我们要用initial 和always去驱动时钟和复位,因为时钟是一个反复的信号,用assign只是一个赋值的语句,只是一个连线的过程,而不是一个有时序的功能的语句,所以我们只能用initial和always语句,所以说我们只能把输入改成一个reg信号

*输出端口只能是wire信号

*50M时钟频率的的周期是20ns,翻转一次是10ns

统一写时钟和复位的激励:

综合与仿真互不影响

3.仿真结果

4.约束

4.0时序约束

*现学一个最简单的:创造一个主时钟约束,告诉我的系统我的这个clk它是多少兆的时钟,它就会按照我的时钟是多找兆去给我生成电路

创造一个主时钟约束->时钟名字system_clk->时钟周期20ns->选择时钟是对于我们代码中的哪个接口->Find(clk)->create_clock -period 20.000 -name system_clk -waveform {0.000 10.000} [get_ports clk]->保存

在 1.1 的学习中,约束完引脚,实现、生成 bit 流后就可以下板验证了,但是那个是组合 逻辑,在时序逻辑中,我们还要对时序进行分析,所以在实现步骤后,我们要添加时钟约束。 在进行引脚约束前,我们可以先对其进行时序约束,打开 Open Synthesized Design,并打 开 Constraints Wizard,并点击 Define Target。

创建一个 XDC 文件,命名为 system,用来存放时序约束。

在 Target 选中刚刚创建的 XDC 文件,并点击 OK。然后 Reload 以下综合页面(重新加载 一下)。

然后打开 Edit Timing Constraints。然后双击 Creat Clock。在弹出的对话框中,Clock name

输入 system_clk,并且在 Period 中输入 20,设定时钟周期为 20ns,然后点击 Source objects 左 边的...。

在新的对话框中点击 Find,然后在 Found 中就会出现可以选择的端口,选中 clk,并点 击 Move the selected items to the right,将 clk 从左边移到右边,最后点击 Append。 然后点击 OK。 然后保存一下当前的时序信息,在弹出的对话框中选择 OK 即可。

此时,我们看到 XDC 文件中多了下面这条语句,我们也可以直接在文件中写入这样的一 条语句,此时我们重新综合、实现、生成 bit 流,就可以看到我们的时序信息。

然后,我们再按照重复的步骤添加引脚约束,综合实现、生成 bit 流,最终我们就可以 从 Projecet Summary 页面中看到时序信息,当然不止时序信息,包括资源占用、综合和实现 阶段信息、功耗信息均在此界面上。 如图 1.32 所示,其中 Synthesis 中便是综合信息;Implementation 中便是实现信息;在

Timing 中显示了时序信息,其中 Worst Negative Slack(WNS)便是最糟糕的时序裕量,当此 值为正时,说明还可以提升时钟频率,当此值为负时,说明具有时序违例(时钟不满足要 求),即使代码逻辑没有问题,但是最终实现的电路不一定没有存在问题;Utilization 中显 示了所耗费的资源和最大的资源,一般来说,我们尽量使用 80%以下的 LUT 资源有利于时序 收敛(不产生时序违例);Power 中显示功耗信息。

4.1引脚约束

*fpga在vivado中,它给你提供的约束的功能他会默认给你生成在被标记了target的文件中

*我们一般要将约束不同信息的文件分开存

*优先级:时序在前,pin优先级放在后面

*reload

*如果我要直接通过软件进行位置约束的话,我需要将这个文件改成target

资源用了LUT,ff(触发器),IO,BUFG(时钟资源,全局时钟总线)

持续最糟糕的时序余量(NA)=16.802ns

也就是说我的最糟糕的路径我都还有16.802ns的空余,也就是我的时钟在提升3.198ns都是可以的

实物:(视频发不了,我单独上传到了我的视频上了)

作业:

时序要求在复杂电路中是必需的

时序学了会用到哪些地方?

保持时间,建立时间,时序的时间的路径分析

仿真:5个

一:功能仿真,没有任何延迟,不会存在任何时序上的问题

二~五:延时太严重,一般不用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值