移位寄存器设计—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.mzph.cn/news/885694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AFK架构设计思想概述

一、AKF的核心思想 AKF架构设计的核心思想源于对系统可扩展性、可用性和灵活性的深刻理解。AKF&#xff08;Availability, Scalability, Flexibility&#xff09;架构模型由Martin L. Abbott和Michael T. Fisher在《The Art of Scalability》一书中提出&#xff0c;旨在帮助工…

【layui】echart的简单使用

图表类型切换&#xff08;柱形图和折线图相互切换&#xff09; <title>会员数据</title><div class"layui-card layadmin-header"><div class"layui-breadcrumb" lay-filter"breadcrumb"><a lay-href""&g…

期权开户难不难?期权开户成功后当天是否能交易

期权开户难不难&#xff1f;这取决于投资者的准备情况和所选的开户途径。对于满足一定资金和经验要求的投资者来说&#xff0c;通过正规期货公司或期权交易平台进行开户&#xff0c;虽然流程相对复杂&#xff0c;但只要遵循步骤&#xff0c;仍然可以顺利完成&#xff0c;下文为…

Java并发无锁篇--乐观锁(非阻塞)

共享模型之无锁 问题提出 package com.zjy.unlock;import java.util.ArrayList; import java.util.List;public class AccountDemo {public static void main(String[] args) {Account account new AccountUnsafe(10000);Account.demo(account);} }class AccountUnsafe impl…

分享三个python爬虫案例

一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 获取网页数据的函数&#xff0c;包括以…

第8章利用CSS制作导航菜单

8.1 水平顶部导航栏 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><center><h3>简单水平菜单导航栏</h3></center><hr /><nav><ul&g…

Spring Plugin与策略模式:打造动态可扩展的应用

目录 一、策略模式 二、Spring Plugin 2.1 Spring Plugin 实现策略模式开发 2.2 策略模式优缺点 三、Spring Plugin 原理 一、策略模式 策略模式是一种设计模式&#xff0c;它允许程序在运行中动态的选择不同的行为方式进行动态执行。策略模式的核心思想是将行为封装在一个个…

spark的学习-05

SparkSql 结构化数据与非结构化数据 结构化数据就类似于excel表中的数据&#xff08;统计的都是结构化的数据&#xff09;一般都使用sparkSql处理结构化的数据 结构化的文件&#xff1a;JSON、CSV【以逗号分隔】、TSV【以制表符分隔】、parquet、orc 结构化的表&#xff1a;…

Android 源码的下载与编译

Android 源码的下载与编译 本章节主要介绍安卓系统的编译以及编译产物&#xff0c;根据我自己的经验只总结个人觉得重要的部分。 有价值的博客&#xff1a; https://blog.csdn.net/wuye110/article/details/8463409 https://juejin.cn/post/7288166472131018786 值得一看的…

基于Python的药房管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Golang | Leetcode Golang题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; type point struct{x, y int }var dirs []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func updateMatrix(mat [][]int) [][]int {var m, n len(mat), len(mat[0])var res make([][]int, m)var visited make([][]bool, m)var queue []poin…

vscode通过remote-ssh连接远程开发机

文章目录 安装扩展注意事项:tips其他参数安装扩展 安装VS Code和SSH-Remote扩展:首先,需要确保你已经在本地计算机上安装了VS Code,并且在扩展市场中搜索并安装了"Remote - SSH"扩展。配置SSH:在本地计算机上,打开VS Code的命令面板(使用快捷键"Ctrl+Shi…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

关于CountDownLatch失效问题

一、项目背景 这几天要开发一个类似支付宝那种年度账单统计的功能&#xff0c;就是到元旦后支付完会把用户这一年的消费情况从各个维度&#xff08;我们把这一个维度称作一个指标&#xff09;统计分析形成一张报告展示给用户。 这个功能实现用到了CountDownLatch。假如统计分析…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

「Mac畅玩鸿蒙与硬件30」UI互动应用篇7 - 简易计步器

本篇将带你实现一个简易计步器应用&#xff0c;用户通过点击按钮增加步数并实时查看步数进度&#xff0c;目标步数为 10000 步。该项目示例展示了如何使用 Progress 组件和 Button 组件&#xff0c;并结合状态管理&#xff0c;实现交互式应用。 关键词 UI互动应用计步器Button…

多媒体信息检索

文章目录 一、绪论二、文本检索 (Text Retrieval)(一) 索引1.倒排索引2.TF-IDF (二) 信息检索模型 (IR模型&#xff0c;Information Retrieval)1.布尔模型 (Boolean模型)(1)扩展的布尔模型 (两个词)(2)P-Norm模型 (多个词) 2.向量空间模型 (Vector Space Model&#xff0c;VSM)…

在vscode中如何利用git 查看某一个文件的提交记录

在 Visual Studio Code (VSCode) 中&#xff0c;你可以使用内置的 Git 集成来查看某个文件的提交历史。以下是具体步骤&#xff1a; 使用 VSCode 内置 Git 功能 打开项目&#xff1a; 打开你的项目文件夹&#xff0c;确保该项目已经是一个 Git 仓库&#xff08;即项目根目录下…

vue2 -- el-form组件动态增减表单项及表单项验证

需求 在数据录入场景(如订单信息录入)中,可根据实际情况(如商品种类增加)动态添加表单项(如商品相关信息)。包含必填项验证和数据格式验证(如邮箱、电话格式),防止错误数据提交。 效果 代码一 <template><div>

使用 Elasticsearch 构建食谱搜索(一)

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 Elasticsearch 构建基于语义搜索的食谱搜索。 简介 许多电子商务网站都希望增强其食谱搜索体验。正确使用语义搜索可以让客户根据更自然的查询&#xff08;例如 “something for Valentines Day - 情人节的礼物” 或 “…