移位寄存器设计—FDRE、SRL16E及原语约束

信号处理中,实现数据对齐时,常常对单bit或多bit信号进行打拍操作,这个可以通过移位寄存器实现,SLICEM中的SRL即为移位寄存器。

这里主要记录下不同写法的效果。

 1 //同步复位2 module static_multi_bit_sreg_poor #(3     parameter   DEPTH = 8 ,4                 WIDTH = 1            5 )6 (7     input                   i_clk ,8     input                   i_rst ,9     input                   i_ce  ,
10     input    [WIDTH-1:0]    i_d   ,
11     output   [WIDTH-1:0]    o_d
12 );
13 reg [WIDTH-1:0] ri_d [DEPTH];
14 always @(posedge i_clk) begin
15     if(i_rst) begin
16         for(int i=0; i < DEPTH; i++) begin
17             ri_d[i] <= 'd0;
18         end
19     end
20     else if(i_ce)begin
21         ri_d[0] <= i_d;
22         for(int i=1; i < DEPTH; i++) begin
23             ri_d[i] <= ri_d[i-1];
24         end      
25     end
26     else
27         ri_d <= ri_d;
28 end
29 assign o_d = DEPTH==0 ? i_d : ri_d[WIDTH-1];
30 endmodule
上述代码综合出来的结果如下图所示。

在这里插入图片描述

 

上图显示,并没有生成SRL,而是生成了FDRE,即同步复位触发器,并不符合使用SRL的预期。

而且,代码中在else中写了ri_d<=ri_d的自保持逻辑,如果把自保持的else去掉,综合出的结果会变吗?

在这里插入图片描述

 

 没变。时序逻辑用的触发器,自带自保持功能,不会产生锁存器,所以else中,如果是自保持语句,可以不写,写上的话只是显得逻辑完整,可读性提高。

回到最开始的问题,SRL并没有综合出来,因为其不支持任何复位。修改代码如下,去掉复位。

 1 module static_multi_bit_sreg_poor #(2     parameter   DEPTH = 4 ,3                 WIDTH = 1            4 )5 (6     input                   i_clk ,7     input                   i_rst ,8     input                   i_ce  ,9     input    [WIDTH-1:0]    i_d   ,
10     output   [WIDTH-1:0]    o_d
11 );
12 reg [WIDTH-1:0] ri_d [DEPTH];
13 always @(posedge i_clk) begin
14     if(i_ce)begin
15         ri_d[0] <= i_d;
16         for(int i=1; i < DEPTH; i++) begin
17             ri_d[i] <= ri_d[i-1];
18         end      
19     end
20 end
21 assign o_d = DEPTH==0 ? i_d : ri_d[DEPTH-1];
22 endmodule

上述代码综合出的结果如下图所示。

在这里插入图片描述

 用了一个SRL16E了,如果增加综合约束语句(* SRL_STYLE = "srl" *),就会只使用SRL16E,区别就是A0 A1 A2 A3的值变了,把上面的两个FDRE都免了,直接用SRL移位4位。

在这里插入图片描述

 

 类似的综合约束语句总共有6条,这里列出,就不尝试了。

“SRL_STYLE”属性有六个可选值,分别是:

1、register

使用纯寄存器(Flip-Flops)实现SRL,默认是这个属性。

这种方式通常提供较好的时序性能,因为寄存器的时钟到输出的延迟(Tco)较小。

2、srl

使用查找表(LUT)来实现SRL。

这种方式可以节省寄存器资源,适用于小深度的SRL。

3、srl_reg

使用LUT和触发器的组合来实现SRL,最后一级深度使用触发器。

这种方式结合了LUT和寄存器的优点,适用于中等深度的SRL。

4、reg_srl

同时使用寄存器和LUT资源实现SRL,寄存器放在第一级。

这种方式适用于需要在SRL的输出端提供较好的时序特性的场景。

5、reg_srl_reg

第一级和最后一级深度使用触发器,中间级别使用LUT。

这种方式在SRL的两端使用寄存器,中间使用LUT,适用于需要两端时序保证的SRL。

6、block

使用块RAM(BRAM)来实现SRL。

对于大深度的SRL,这种方式可以有效节省LUT资源,并且提供稳定的存储能力。

 

 现在能按照要求综合出SRL了,还有一个问题,就是Depth这个参数,本意是当其为0时,不进行任何移位,直接输出等于输入。但是设置为0时,综合会报错

在这里插入图片描述

 数组的深度必须是正整数,为了修改这个问题,可以使用generate for语句,代码如下

module static_multi_bit_sreg_poor #(parameter   DEPTH = 0 ,WIDTH = 1            
)
(input                   i_clk ,input                   i_rst ,input                   i_ce  ,input    [WIDTH-1:0]    i_d   ,output   [WIDTH-1:0]    o_d
);
generateif (DEPTH > 0) begin(* srl_style = "srl" *) reg [WIDTH-1:0] sreg [DEPTH];always @(posedge i_clk) beginif (i_ce) beginsreg[0] <= i_d;for (int i = 1; i < DEPTH; i++) beginsreg[i] <= sreg[i - 1];endendendassign o_d = sreg[DEPTH - 1];end else beginassign o_d = i_d;end
endgenerate
endmodule

 

 当DEPTH等于0时,不会生成sreg[DEPTH]的代码,因此不会让综合器报错。

在这里插入图片描述
在这里插入图片描述

 总结

  1. 想使用SRL就不能用复位,否则无法综合出SRL器件。(流水的移位寄存器复位没有意义)
  2. 使用约束语句可以调整移位寄存器的资源使用,根据需求选择。
  3. 使用generate if 语句,可以实现选择生成不同的代码,不满足if条件的会被综合器忽略。




 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习笔记之虚拟机操作

Linux简介 Linux是一种开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发得到业界认可。Linux在服务器领域可以说是最强的&#xff0c;并且具有可定制&#xff0c;可裁剪&#xff0c;适用于嵌入式领域的特点。对于linux系统&#xff0c;它最大的的特点就是一切皆…

middleware中间件概述

中间件定义 中间件&#xff08;middleware&#xff09;是基础软件的一大类&#xff0c;属于可复用软件的范畴。顾名思义&#xff0c;中间件处在操作系统、网络和数据库之上&#xff0c;应用软件的下层&#xff08;如图 15-1 所示&#xff09;​&#xff0c;也有人认为它应该属…

《清宫辞Ⅱ》开机:陈欣予旗装惊艳回归 重新演绎宫闱传奇

演员陈欣予&#xff0c;1993年11月24日出生&#xff0c;多年来在影视剧方面取得了不错的成绩&#xff0c;在演戏的道路上&#xff0c;陈欣予不断挑战自我&#xff0c;凭借对不同角色的塑造&#xff0c;收获好评无数。 11月6日&#xff0c;由北京七耀文化传媒有限公司出品制作&a…

Linux sed命令详解-结构(清楚结构便于理解记忆)-选项-模式空间与暂存区(多示例、多图)

文章目录 sed基本结构选项-n(静默模式)-e、;(多点编辑,多条命令)-f(指定脚本文件)-i(直接修改文件与备份)-E(扩展正则表达式) 常用动作p(print,打印)i(插入内容)与a(追加内容)c、y(替换)d(delete,删除)s(替换) 其他动作l(小写L,打印特殊字符)r(在匹配行后插入指定文件内容)w(将…

开箱即用!265种windows渗透工具合集--灵兔宝盒

【渗透工具箱】灵兔宝盒-Rabbit_Treasure_Box_V1.0.1 介绍 Rabbit_Treasure_Box_V1.0.1是一款Windows渗透工具箱&#xff0c;集成Dawn Launcher管理&#xff0c;便捷备份更新。内含脚本工具及在线安全工具&#xff0c;覆盖信息收集、漏洞利用、逆向破解、蓝队防御等多领域&am…

对标 Windows Copilot 的 UOS AI,升级后更能打了

进入 2024 年&#xff0c;AI 应用迎来大爆发&#xff0c;不仅各类应用纷纷宣称“AI 赋能”&#xff0c;操作系统也不例外。前有 Windows Copilot&#xff0c;后有 Apple Intelligent&#xff0c;手机行业更是积极&#xff0c;各种 AI 手机纷纷发布。国产信创系统自然也不甘落后…

【LeetCode】每日一题 2024_11_2 使两个整数相等的位更改次数(位运算/模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;使两个整数相等的位更改次数 代码与解题思路 先读题&#xff1a; 题目要我们把 n 这个数字转换成 k 这个数字&#xff0c;但是只能是二进制位 1 转换成 0 纯模拟的解法&#xff1a; f…

2024 开源社年度评选

开源社&#xff08;英文名称为“KAIYUANSHE”&#xff09;成立于2014年&#xff0c;是由志愿贡献于开源事业的个人志愿者&#xff0c;依 “贡献、共识、共治” 原则所组成的开源社区。开源社始终维持 “厂商中立、公益、非营利” 的理念&#xff0c;以 “立足中国、贡献全球&am…

【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 语音降噪技术的目的是改善语音信号的质量&#xff0c;通过减少或消除背景噪声&#xff0c;使得语音更清晰&#xff0c;便于听者理解或进一步的语音处理任务&#xff0c;如语音识别和语音通讯。在许多实际应用中&#xff0c;如…

C语言 | Leetcode C语言题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…

[SWPUCTF 2022 新生赛]Power! 反序列化详细题解

知识点: PHP反序列化(执行顺序) 构造POP链 代码审计 题目主页: 输入框可以输入内容,习惯性先查看一下页面的源代码,收集信息 发现源码中有提示参数source 先不急,再看一下其他信息 是apache服务器,php版本为7.4.30 url传参 ?sourceindex.php 回显了index.php的源码 …

docker下迁移elasticsearch的问题与解决方案

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 docker下迁移elasticsearch的问题与解决方案 数据挂载报错解决权限问题节点故障 直接上图&#x…

Spark 的介绍与搭建:从理论到实践

目录 一、分布式的思想 &#xff08;一&#xff09;存储 &#xff08;二&#xff09;计算 二、Spark 简介 &#xff08;一&#xff09;发展历程 &#xff08;二&#xff09;Spark 能做什么&#xff1f; &#xff08;三&#xff09;spark 的组成部分 &#xff08;四&…

Python GUI 编程:tkinter 初学者入门指南——微调框

在本教程中&#xff0c;将介绍如何创建 Tkinter Spinbox 微调框小部件。 Python 中 Tkinter 中的 Spinbox 小部件用于从指定的给定值范围内选择一个值。 此外&#xff0c;可以直接在 Spinbox 小组件中输入值&#xff0c;就像使用单行文本框小组件一样。 要创建 Spinbox 小部件…

人保财险(外包)面试分享

前言&#xff1a; 这是本月面的第三家公司&#xff0c;太难了兄弟们&#xff0c;外包都不好找了&#xff0c;临近年底&#xff0c;金九银十已经错过了&#xff0c;金三银四虽然存在&#xff0c;但按照这几年的行情&#xff0c;金九银十和金三银四其实已经是不复存在了&#xf…

Redis - 数据库管理

Redis 提供了⼏个⾯向Redis数据库的操作&#xff0c;分别是dbsize、select、flushdb、flushall命令&#xff0c; 本机将通过具体的使⽤常⻅介绍这些命令。 一、切换数据库 select dbIndex 许多关系型数据库&#xff0c;例如MySQL⽀持在⼀个实例下有多个数据库存在的&#…

大数据挖掘有哪些技术要点?

大数据挖掘的主要方法和技术有&#xff1a;分类、聚类、关联规则、回归分析、时间序列分析、文本挖掘、社交网络分析、可视化技术等。通过大数据挖掘&#xff0c;企业和研究机构能够从海量数据中提取有价值的信息和知识&#xff0c;促进决策优化和业务创新。 一、分类 分类是大…

Python小游戏23——捕鱼达人

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; 【bash】 pip install pygame 运行效果展示 接下来是示例代码&#xff1a; 【python】 import pygame import random # 初始化Pygame pygame.init() # 屏幕尺寸 SCREEN…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

GS-SLAM论文阅读--High-Fidelity SLAM Using Gaussian Splatting

前言 这篇文章是几个月之前的IROS2024了&#xff0c;之前忘记看了&#xff0c;但是最近看到&#xff0c;觉得有一些值得参考的部分&#xff0c;接下来仔细阅读一下。 文章目录 前言1.背景介绍2.关键内容2.1 建图2.2 跟踪2.3总体流程 3.文章贡献 1.背景介绍 3DGS的连续建图存在…