时钟、复位与上电初始化

目录

  • 1. 复位
    • 2.1. 异步复位 同步释放
    • 2.2. Xilinx FPGA复位设计
      • 尽量少用复位
      • reg信号初始值
      • 基于PLL锁定(locked)复位设计
  • 2. 时钟


1. 复位

FPGA中复位设计总结
深入理解复位—同步复位,异步复位,异步复位同步释放(含多时钟域)

  • 同步复位:优点是时序简单,不受毛刺影响。缺点是大部分逻辑器件库内的DFF都只有异步复位端口,同步复位需要额外加入组合逻辑,整个芯片设计会消耗大量组合逻辑资源。

  • 异步复位:优点是实现简单,无需额外组合逻辑,复位启动不受时钟影响。缺点是复位释放的时候,时钟若采样复位信号跳变时刻,寄存器信号容易出现亚稳态。

例如

always@(posedge clk or negedge rst_n) begin
	if(!rst_n) 
     	b <= 1'b0;
 	else 
     	b <= a;
end

在这里插入图片描述

因此为了保证全局复位不消耗太多组合逻辑,也能保证避免异步复位释放导致的亚稳态,如何作?

2.1. 异步复位 同步释放

  • 异步复位,同步释放:复位信号到来的时候不受时钟信号影响,复位信号释放的时候受到时钟信号的同步。

例如下面代码中rst_sync_n就实现了异步置0、同步置1

// rst_async_n为异步复位信号
always@(posedge clk or negedge rst_async_n) begin
   if(!rst_async_n) begin
       rst_s1     <= 1'b0;
       rst_sync_n <= 1'b0;
   end
   else begin
       rst_s1     <= 1'b1;
       rst_sync_n <= rst_s1;
   end
end

  //由于rst_sync_n复位启动还是异步的,所以必须加入敏感列表中
     always@(posedge clk or negedge rst_sync_n) begin
         if (!rst_sync_n) 
         	dout <= 1'b0;
         else          
         	dout <= din;
     end

出现亚稳态的波形图如下

在这里插入图片描述

如上图所示:

  • T1时刻:rst_async_n异步复位启动,rst_s1和rst_sync_n全部拉低,与clk无关

注意T1时刻是异步的,不涉及clk采样,因此rst_s1和rst_sync_n不会出亚稳态

  • T2时刻:rst_async_n异步复位释放,此时clk采样rst_async_n边沿,采样值不定,因此rst_s1出现0、1之间的亚稳态。rst_sync_n仍然保持0
  • T3时刻:rst_s1可能恢复也可能还是亚稳态,但clk采样到rst_async_n为1,因此rst_s1恢复为1。rst_sync_n则相当于对T2时刻的rst_async_n打两拍处理,因此会稳定至0或1两种状态,并处于clk时钟域下!

发现没有T2时刻本质上是对rst_async_n作电平同步!!!那么rst_sync_n一定会稳定在clk时钟域下的高电平。
参考异步时钟亚稳态 的解决方案——单bit信号

即T2时刻的逻辑可以看成:

always@(posedge clk) begin
       rst_s1     <= rst_async_n;
       rst_sync_n <= rst_s1;
end

2.2. Xilinx FPGA复位设计

Xilinx FPGA异步复位同步释放——同步后的复位当作同步复位还是异步复位?【FPGA探索者】

Xilinx复位准则:

  • 尽量少用复位
  • FPGA上电后所有触发器和RAM均有初始值
  • 确保高电平复位
  • 采用同步复位

尽量少用复位

全局复位信号高扇出会造成布局布线困难,部分逻辑是无需复位的,例如数据流中间信号

reg信号初始值

Vivado寄存器初始值问题
不得不读的 FPGA 设计白皮书——Xilinx FPGA 复位策略白皮书翻译(WP272)【FPGA探索者】

Xilinx FPGA上电后,所有触发器和RAM都具备初始值,比任何的逻辑复位都要全面,不需要全局复位。

reg信号上电初始值可配置,可通过reg [2:0] a = 3;配置上电初值。

默认规则如下:

  1. 不赋初始值、不复位,上电后寄存器值为0
  2. 赋初始值、不复位,上电后寄存器值为初始值
  3. 不赋初始值、复位,上电后寄存器值为复位值
  4. 赋初始值、复位,上电后寄存器值为初始值,复位后为复位值

综合后,可在synthesis/schematic网表中点击触发器,Cell Properties/Properties/INIT设置初始值

基于PLL锁定(locked)复位设计

无论是PLL产生的时钟还是外部输入的时钟,同步复位信号按如下产生。注意reg a=1;表示上电后该值为1,复位后可能为其他值

`timescale 1ns / 1ps

module clk_rst_gen(
	input clk_in,
	
	input clk_in2,					
	output clk_a,					
	output clk_b,					
	output clk_c,					
	output clk_d,					
	
	output reg rst_in2,					
	output reg rst_a,					
	output reg rst_b,				
	output reg rst_c,					
	output reg rst_d,					
	);
	
	//--------------------------------------------------------------------------------------------------------
	// pll
	//--------------------------------------------------------------------------------------------------------
	wire locked;
	
	pll		pll(
		.clk_in1		( clk_in	),
		.clk_out1       ( clk_a   	),
		.clk_out2       ( clk_b   	),
		.clk_out3       ( clk_c 	),
		.clk_out4       ( clk_d   	),
		.locked         ( locked    )
	);
	
	//--------------------------------------------------------------------------------------------------------
	// locked_temp attends to eliminate jitter of signal locked
	//--------------------------------------------------------------------------------------------------------
	reg	[15:0]	cnt;
	
	always@(posedge clk_in or negedge locked) begin
		if(!locked)
			cnt <= 0;
		else if(cnt[15])
			cnt <= cnt;
		else
			cnt <= cnt + 1;
	end
	
	wire locked_temp = cnt[15];
	
	//--------------------------------------------------------------------------------------------------------
	// async reset and sync release
	//--------------------------------------------------------------------------------------------------------
	reg 		rst_in2_d1 = 1;					
	reg 		rst_in2_d2 = 1;					
	
	always@(posedge clk_in2 or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_in2_d1 <= 1'b1;
			rst_in2_d2 <= 1'b1;
			rst_in2    <= 1'b1;
		end
		else begin	
			rst_in2_d1 <= 1'b0;
			rst_in2_d2 <= rst_in2_d1;
			rst_in2    <= rst_in2_d2;
		end
	end
	
	reg 		rst_a_d1 = 1;					
	reg 		rst_a_d2 = 1;					
	
	always@(posedge clk_a or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_a_d1 <= 1'b1;
			rst_a_d2 <= 1'b1;
			rst_a    <= 1'b1;
		end
		else begin	
			rst_a_d1 <= 1'b0;
			rst_a_d2 <= rst_a_d1;
			rst_a    <= rst_a_d2;
		end
	end
	
	reg 		rst_b_d1 = 1;					
	reg 		rst_b_d2 = 1;					
	
	always@(posedge clk_b or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_b_d1 <= 1'b1;
			rst_b_d2 <= 1'b1;
			rst_b    <= 1'b1;
		end
		else begin	
			rst_b_d1 <= 1'b0;
			rst_b_d2 <= rst_b_d1;
			rst_b    <= rst_b_d2;
		end
	end
	
	reg 		rst_c_d1 = 1;					
	reg 		rst_c_d2 = 1;					
	
	always@(posedge clk_c or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_c_d1 <= 1'b1;
			rst_c_d2 <= 1'b1;
			rst_c    <= 1'b1;
		end
		else begin	
			rst_c_d1 <= 1'b0;
			rst_c_d2 <= rst_c_d1;
			rst_c    <= rst_c_d2;
		end
	end
	
	reg 		rst_d_d1 = 1;					
	reg 		rst_d_d2 = 1;					
	
	always@(posedge clk_d or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_d_d1 <= 1'b1;
			rst_d_d2 <= 1'b1;
			rst_d    <= 1'b1;
		end
		else begin	
			rst_d_d1 <= 1'b0;
			rst_d_d2 <= rst_d_d1;
			rst_d    <= rst_d_d2;
		end
	end
	
endmodule

2. 时钟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/664205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

认识Oracle v$mystat视图

v$mystat就是当前用户的各种统计信息&#xff0c; sid就是session的id(也就是当前用户),STATISTIC#就是统计量的编号(用来唯一确定统计量的名称)&#xff0c;value是统计量的值&#xff1b; desc命令在Oracle中通常用于查看表结构&#xff1b; v$mystat视图中只会有当前用户…

pdf拆分成有图和无图的pdf(方便打印)

pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印&#xff0c;每次都要手动弄&#xff0c;打印的时候很麻烦&#xff1b; 随着打印次数的增加&#xff0c;时间就越来越多 为解决此问题&#xff0c;使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 目录 Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 一、简单介…

Linux前奏-预热版本

一、操作系统概述 1.1 了解操作系统的作用 我们所熟知的计算机&#xff0c;也就是电脑&#xff0c;就是由硬件和软件来组成的 硬件&#xff1a;计算机系统中由电子机械&#xff0c;和各种光电元件等组成的各种物理装置的总称 软件是什么呢&#xff1f; 软件&#xff1a;用…

视频汇聚平台EasyCVR对接GA/T 1400视图库结构化数据:人员/人脸、非/机动车、物品

在信息化浪潮席卷全球的背景下&#xff0c;公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中&#xff0c;GA/T 1400标准作为公安视频图像信息应用系统的核心规范&#xff0c;以其结构化数据处理与应用能力&#xff0c;为公安信息化建设注入了强大的动力。…

skywalking介绍及搭建

链路追踪框架比对&#xff1a; skywalking安装部署&#xff1a; 下载地址&#xff1a;Downloads | Apache SkyWalking 配置微服务与skywalking整合&#xff1a; copy agent/optional-plugins/apm-spring-cloud-getway-xx.jar到plugins&#xff0c;然后重启skywalking 监控界面…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

Web程序设计-实验05 DOM与BOM编程

题目 【实验主题】 影视网站后台影视记录管理页设计 【实验任务】 1、浏览并分析多个网站后台的列表页面、编辑页面&#xff08;详见参考资源&#xff0c;建议自行搜索更多后台页面&#xff09;的主要元素构成和版面设计&#xff0c;借鉴并构思预期效果。 2、新建 index.h…

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑位置快捷键&#xff1a; pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑…

在IDEA中使用Git在将多次commit合并为一次commit

案例&#xff1a; 我想要将master分支中的 测试一、测试二、测试三三次commit合并为一次commit 1. 点击Git 2. 双击点击commit所在的分支 3. 右键要合并的多个commit中的第一次提交的commit 4. 点击右键后弹出的菜单中的Interactively Rebase From Here选项 5. 点击测试二…

elementui el-tooltip文字提示组件弹出层内容格式换行处理

1、第一种 1.1 效果图 1.2、代码 <template><div class"wrapper"><el-tooltip class"content" effect"dark" placement"top"><div slot"content"><div v-html"getTextBrStr(text)"&…

数据可视化:解析其在现代生活中的日益重要地位

数据可视化为什么对我们的生活影响越来越大&#xff1f;这是一个值得探讨的话题。在信息化时代&#xff0c;数据无处不在&#xff0c;海量的数据不仅改变了商业模式&#xff0c;也深刻影响了我们的日常生活。数据可视化作为一种将复杂数据转化为直观图表、图形的技术&#xff0…

CLIP模型NAN问题解决

早有耳闻&#xff0c;clip模型会在fp16下发生NAN的问题&#xff0c;但是今天基于2080Ti测试&#xff0c;发现在单精度下的tensorrt推理同样存在NAN的问题&#xff0c;我甚至一度怀疑是tensorrt的推理代码有问题。 之后&#xff0c;决定从python代码的角度去寻找问题的答案&…

PostgreSQL常用插件

PostgreSQL 拥有许多常用插件&#xff0c;这些插件可以大大增强其功能和性能。以下是一些常用的 PostgreSQL 插件&#xff1a; 性能监控和优化 pg_stat_statements 1.提供对所有 SQL 语句执行情况的统计信息。对调优和监控非常有用。 2.安装和使用&#xff1a; pg_stat_k…

SOLIDWORKS参数化开发 慧德敏学

传统的设计模式下大规模定制型产品结构设计周期长&#xff0c;问题多&#xff0c;以及大量重复性工作让工程师疲于应对&#xff0c;这些严重阻碍了公司订单承接能力和技术创新能力&#xff0c;难以响应市场需求。 什么是参数化设计&#xff1f; 1、它是一种设计的方式&#x…

oracle mysql索引区别

文章目录 1.引言1.1 索引的基本概念1.2 Oracle和MySQL的简介 2.Oracle索引2.1 Oracle索引的类型**B-Tree索引****Bitmap索引****Function-Based索引****Partitioned索引****Text索引** 2.2 Oracle索引的工作原理2.3 Oracle索引的实例代码 3.MySQL索引3.1 MySQL索引的类型**B-Tr…

Linux开发工具(个人使用)

Linux开发工具 1.Linux yum软件包管理器1.1Linux安装程序有三种方式1.2注意事项1.3如何查看&#xff0c;安装&#xff0c;卸载软件包1.3.1查看软件包1.3.2安装软件包1.3.3卸载软件 2.Linux vim编辑器2.1vim的基本操作2.2vim正常模式命令集2.3vim底行模式命令集2.4vim配置 3.Lin…

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节&#xff1a; 1、SD卡分区 提示&#xff1a;我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况&#xff0c;NXP官方给的镜像布局结构如下所示&#xff1a; 可以看到&#xff0c…

微服务架构-微服务治理基础

目录 一、服务治理由来 1.1 概述 1.2 微服务治理的几个维度 1.2.1 服务定义和SLA 1.2.2 服务注册中心 1.2.3 服务生命周期管理 1.2.4 服务通信和链路治理 1.2.5 服务授权和通信安全 二、服务治理的目标与愿景 2.1 服务治理的愿景 2.2 服务治理的目标 2.2.1 标准化 …

vue3使用vue3-print-nb打印

打印效果 1.下载插件 Vue2.0版本安装方法 npm install vue-print-nb --saveVue3.0版本安装方法&#xff1a; npm install vue3-print-nb --save2.main.js引入 vue2引入 import Print from vue-print-nb Vue.use(Print)vue3引入 import print from vue3-print-nb // 打印…