怎样解决外键约束_时序约束是如何影响数字系统的,具体如何做时序分析?

本文详细解析了数字电路设计中的时序分析,特别是建立时间和保持时间对系统性能的影响。重点介绍了FPGA设计中的时序约束策略,如何通过合理设置满足高速系统需求,并通过实例展示时序约束在接口电路中的实际作用。直播讲座邀请将深入探讨时序约束在FPGA设计中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行数字电路系统的设计时,时序是否能够满足要求直接影响着电路的功能和性能。本文首先讲解了时序分析中重要的概念,并将这些概念同数字系统的性能联系起来,最后结合FPGA的设计指出时序约束的内容和时序约束中的注意事项。

一、时序分析中的重要概念

在数字系统中有两个非常重要的概念:建立时间和保持时间,其示意图如图1所示。一个数字系统能否正常工作跟这两个概念密切相关。只有建立时间和保持时间都同时得到满足时,数字系统才能可靠的、正常的工作。

1ee6564401067320384c4bad1c3de111.png

当寄存器的建立时间或保持时间不能得到满足时,寄存器有可能会进入亚稳态( Metastable)。亚稳态是一种电压的中间态,假设寄存器的输出电压大于3V判决为逻辑1,小于0.3V判决为逻辑0,那么电压处于0.3V到3V之间并且能够短时间稳定的状态就是亚稳态。寄存器在进入亚稳态一段时间后会回复到正常的状态,但是有可能回到逻辑1的状态,也有可能回到逻辑0的状态。这种不确定性就有可能引起数字系统的错误。

建立时间和保持时间是一个寄存器的固有属性,是由其内部的结构、工艺等因素决定的,因而在进行数字系统设计时只能通过改变电路结构使其满足建立时间和保持时间的要求,而不能改变建立时间和保持时间的值。

二、建立时间和保持时间对电路性能的影响

首先来看一个典型的同步数字系统的示意图,见图2。

86effa7d1e4e3a9e0347695f5299778d.png

在图2中,FF1和FF2代表两个寄存器,在两个寄存器中间存在组合逻辑。同步的数字系统正是由许多的寄存器,以及寄存器中间的组合逻辑构成的(也包括寄存器间的直接连接)。

显然,如果要数字系统正常工作,每个寄存器的建立时间和保持时间都必须得到满足。假设时钟信号ck到达所有寄存器的时间相同,图3画出了这两个寄存器间的时序关系。

bed430f96849dfc155da619639da3225.png

从图中可以看到,如果要FF2的建立时间和保持时间得到满足,必须要满足以下公式:

af76754673525bdfd9d8ce0a0a5535c0.png

其中Ts建立时间,Th为保持时间,Tclock为时钟周期,Tclk2q为寄存器的传输延时(从时钟有效沿到输出的时间),Tdelay为两个寄存器之间的组合逻辑延时。

从公式(1)中可以看出,建立时间是否能得到满足取决于3个参数:时钟周期、寄存器传输延时以及组合逻辑延时。其中寄存器的输出延时是寄存器的固有属性,不可更改,因而在设计中只能靠调节时钟周期和组合逻辑的延时来满足寄存器对于建立时间的要求。

从公式(2)中可以看出,保持时间能否得到满足取决于2个参数:寄存器的传输延时和组合逻辑的延时,设计者能做的仅仅是调节组合逻辑的延时。

图3仅仅是两个寄存器之间的时序关系,在一个数字系统中往往包含有成千上万个寄存器,任意两个相邻的寄存器之间的时序关系都必须满足公式(1)和公式(2)的约束,只有如此数字系统才能正常工作。在数字系统可以正常工作的前提下,组合逻辑的延时就决定了数字系统能够工作的时钟频率的上限。组合逻辑的延时越短,系统的工作频率的上限就越高,这里的组合逻辑的延时指的是任意两个相邻的寄存器之间的最长的组合逻辑延时,也就是关键路径的延时。当然,组合逻辑的延时也不能无限短,必须要满足公式(2) 的要求。

三、在FPGA中对时序进行约束

在FPGA设计中,时序约束占有重要的地位。时序约束主要有两方面的作用:第一,EDA工具会根据设计者的约束努力尝试布局布线,尽量满足设计者提出的时序方面的要求;第二,在EDA工具经过努力仍不能满足设计者提出的时序要求时会给出警告信息,用以提示设计者。

在对设计进行约束时要做到恰到好处,太松或者太紧的约束都不能使电路达到最好的状态。约束过松自不必提,约束过紧之后EDA软件经过努力尝试仍不能达到要求,但其不会取最接近目标的一次,而是将最后一次作为结果,可能导致电路性能更加恶化。

当今的FPGA设计中时序约束主要包括3种:一是寄存器到寄存器的约束,二是引脚到寄存器的约束,三是寄存器到引脚的约束。

寄存器到寄存器的约束是对时钟周期的约束,对应于公式(1)中的Tclk2q+Tdelay+Ts,通常来讲设计者应该对其所设计的系统需要多快的时钟频率有所了解,只要结合需求给出时钟周期的约束即可。

在约束时钟周期时,实际上保证的是两个寄存器中后一级的寄存器。第一级寄存器连接在FPGA的外部引脚上,那么第一级寄存器能否满足其建立时间和保持时间的约束就取决于引脚上时钟和数据的关系以及各自到达寄存器的延时。假设引脚时钟和内部时钟是同步的(频率和相位都同步),那么数据引脚和时钟引脚的时序关系以及从引脚到寄存器输入端的延时共同决定了第一个寄存器的建立时间和保持时间能否得到满足,设计者可以对数据引脚到寄存器输入端的延时进行约束。

为了保证FPGA的输出信号和时钟的时序关系达到预期的效果,比如达到后一级芯片对时钟和数据时序关系的要求,设计者可以对寄存器的输出到引脚所经历的延时进行约束。

以上三种约束就可以涵盖设计中的所有寄存器。但是在某些特定的情况下,比如异步时钟域时,我们清楚地知道某些寄存器会发生建立时间或者保持时间不满足的情况,但这是不可避免的,设计者也已经对其进行了处理。在这种情况下,设计者最好告诉EDA软件忽略这些路径,否则EDA软件会努力尝试解决这些路径的时序冲突,既费时又没有效果。

为帮助更多的新手学员,入门工程师深入掌握FPGA时序分析与约束,熟练掌握FPGA时钟信号与寄存器设计,本周三晚上8点,我将在电子发烧友直播间举行《时序约束在FPGA高速数字系统中的重要作用》直播在线讲座,欢迎大家提前报名参加直播!

直播主题:时序约束在FPGA高速数字系统中的重要作用

直播时间:2020年8月12日 (周三)晚8点

直播嘉宾:小梅哥,资深FPGA工程师,武汉芯路恒科技CEO,常年全功能FPGA平台电商销量TOP1

直播简介:

在上一场直播之后,很多参与直播的网友都提问,表示对时序分析和时序约束的知识感兴趣,但是又存在一些很合理的疑问,比如怎样的系统才算是高速系统,时序约束的方法在实际应用中究竟能够起到怎样的效果,所以特安排本次直播进一步介绍。

本次直播内容将通过几个具体的实例,来演示时序约束对高速并行接口电路的工作情况的影响。通过这次直播,希望能让大家一定要重视时序约束的内容,在调试过程中,很多问题,可能并不是你的代码功能写的不对,而是接口时序没有满足要求。

FPGA从零入门资料(硬件基础+入门基础篇)

d7fca8c0de200bec173fbf96f3235dfb.png

FPGA基础应用实例与开发

ece8bf4d6ce3499faa8dc68d819d83a8.png

FPGA实战项目分享

c2e0d4847bb8699116203411234e5fb3.png 00a7e5fdfb3a1d6d617e52653c4ab58b.png 3ba779fbd0931c5eb4a6250a085a5b4b.png
嗯,用户让我根据提供的Java代码生成对应的数据库表结构。首先,我需要仔细阅读代码,理解各个实体类的字段以及它们之间的关系。 代码里有两个实体类:PriceHistory和Product。用户可能用的是JPA或者类似的ORM框架,所以每个实体类对应数据库中的一张表。首先看Product类,它可能包含id、部ID(externalId)、最新价格(latestPrice)、更新时间(updatedTime)等字段。PriceHistory应该记录每次抓取的价格,包括产品ID、来源(source)、价格、抓取时间等。 接下来,我需要分析每个实体类的字段类型。Product的id是Long类型,对应数据库的BIGINT。externalId可能用于构建抓取URL,是字符串类型,所以VARCHAR。latestPrice是BigDecimal,对应DECIMAL,通常需要指定精度和小数位数,比如DECIMAL(10,2)。updatedTime是LocalDateTime,对应TIMESTAMP。 PriceHistory表需要主id,可能也是BIGINT。product_id作为关联到Product表的id,所以是BIGINT。source是来源名称,VARCHAR(50)应该足够。price同样用DECIMAL(10,2),crawl_time是TIMESTAMP。此,可能还需要索引来提高查询效率,比如在product_id和crawl_time上建立索引,方便按时间和产品查询历史价格。 还要注意事务处理,代码中使用了@Transactional,说明在保存价格历史和更新产品价格时需要在同一个事务中,确保数据一致性。表结构设计时,约束可能要考虑,但具体是否启用取决于项目需求。 可能需要检查是否有其他字段,比如产品名称或其他属性,但根据代码,Product实体可能只有上述提到的字段。如果有其他字段,用户需要补充,但当前代码中只涉及latestPrice和updatedTime,以及externalId。 总结一下,Product表需要存储产品基本信息,PriceHistory表记录每次抓取的价格数据,两者通过product_id关联。字段类型和长度需要合理设置,确保数据准确性和性能。 根据代码实现的价格爬虫功能,需要以下核心数据库表结构设计: $$ -- 商品信息表 CREATE TABLE product ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主ID', external_id VARCHAR(255) NOT NULL COMMENT '部平台商品ID', latest_price DECIMAL(10,2) COMMENT '最新价格', updated_time DATETIME COMMENT '最后更新时间', -- 其他商品基本信息字段... INDEX idx_external_id (external_id) ) COMMENT '商品基本信息表'; -- 价格历史表 CREATE TABLE price_history ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主ID', product_id BIGINT NOT NULL COMMENT '关联商品ID', source VARCHAR(50) NOT NULL COMMENT '价格来源平台', price DECIMAL(10,2) NOT NULL COMMENT '抓取价格', crawl_time DATETIME NOT NULL COMMENT '抓取时间', FOREIGN KEY (product_id) REFERENCES product(id), INDEX idx_crawl_time (crawl_time) ) COMMENT '商品价格历史记录表'; $$ 表结构说明: 1. **product表** - `id`: 主,对应代码中的`Product`实体ID - `external_id`: 对应`Product.getExternalId()`,用于拼接抓取URL - `latest_price`: 对应`product.setLatestPrice()`,记录最新价格 - `updated_time`: 对应`product.setUpdatedTime()`,记录最后更新时间 2. **price_history表** - `product_id`: 关联商品表,对应`PriceHistory.productId` - `source`: 价格来源平台,对应`crawlerSources`的key - `price`: 实际抓取价格,对应`priceHistoryRepository.save()`的price字段 - `crawl_time`: 抓取时间,自动记录时间戳 关设计点: 1. 价格字段使用`DECIMAL(10,2)`确保精确存储金额 2. 建立`external_id`索引加速URL拼接时的查询 3. 价格历史表建立时间索引`idx_crawl_time`便于按时间维度分析 4. 使用约束保证数据完整性(根据实际需要可选) 补充说明: - 建议添加`created_time`字段记录记录创建时间 - 可添加`status`字段标识价格有效性 - 可根据业务需求扩展商品表的其他字段(品牌、分类等) - 高频访问时可考虑分表或使用时序数据库存储价格历史给出sql语句
03-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值