芯片设计|FPGA 设计的指导原则(一)

news2024/12/23 3:33:26

这一部分主要介绍 FPGA/CPLD 设计的指导性原则,如 FPGA 设计的基本原则、基本设计思想、基本操作技巧、常用模等。
FPGA/CPLD 设计的基本原则、思想、技巧和常用模块是一个非常大的问题,在此不可能面面俱到,只能我们公司项目中常用的一些设计原则与方法提纲携领地加以介绍,希望引起同事们的注意,如果大家能有意识的用这些原则方法指导日后的工作,不断积累和充实自己,将取得事半功倍的效果!

1.1 基本原则之一:面积和速度的平衡与互换

这里“面积”指一个设计消耗 FPGA/CPLD 的逻辑资源的数量,对于 FPGA 可以用所消耗的触发器(FF)和查找表(LUT)来衡量,更一般的衡量方式可以用设计所占用的等价逻辑门数。“速度”指设计在芯片上稳定运行,所能够达到的最高频率,这个频率由设计的时序状况决定,和设计满足的时钟周期,PAD to PAD Time,Clock Setup Time,Clock Hold Time,Clock-to-Output Delay 等众多时序特征量密切相关。面积(area)和速度(speed)这两个指标贯穿着 FPGA/CPLD 设计的始终,是设计质量的评价的终极标准。这里我们就讨论一下关于面积和速度的两个最基本的概念:面积与速度的平衡和面积与速度的互换。

面积和速度是一对对立统一的矛盾体。要求一个同时具备设计面积最小,运行频率最高是不现实的。更科学的设计目标应该是在满足设计时序要求(包含对设计频率的要求)的前提下,占用最小的芯片面积。或者在所规定的面积下,使设计的时序余量更大,频率跑得更
高。这两种目标充分体现了面积和速度的平衡的思想。关于面积和速度的要求,我们不应该简单的理解为工程师水平的提高和设计完美性的追求,而应该认识到它们是和我们产品的质量和成本直接相关的。如果设计的时序余量比较大,跑的频率比较高,意味着设计的健壮性更强,整个系统的质量更有保证;另一方面,设计所消耗的面积更小,则意味着在单位芯片上实现的功能模块更多,需要的芯片数量更少,整个系统的成本也随之大幅度削减。

作为矛盾的两个组成部分,面积和速度的地位是不一样的。相比之下,满足时序、工作频率的要求更重要一些,当两者冲突时,采用速度优先的准则。

面积和速度的互换是 FPGA/CPLD 设计的一个重要思想。从理论上讲,一个设计如果时序余量较大,所能跑的频率远远高于设计要求,那么就能通过功能模块复用减少整个设计消耗的芯片面积,这就是用速度的优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取“乒乓操作”和“串并转换”的思想进行运作,在芯片输出模块再对数据进行“并串转换”,是从宏观上看整个芯片满足了处理速度的要求,这相当于用面积复制换速度提高。面积和速度的互换的具体操作有很多的技巧,比如模块复用,“乒乓操作”,“串并转换”等,需要大家在日后工作中积累掌握。关于这个问题IC修真院也给大家详细介绍过,下面举例说明如何使用“速度换面积”和“面积换速度”。

例 1:如何使用“速度的优势换取面积的节约”?
在 WCDMA 预商用系统设计中,使用到了快速哈达码(FHT)运算,FHT 由四步相同的算法完成,如图 1 所示。FHT 的单步算法如下:
FHT 原理图
原设计由于考虑流水线式数据处理的要求,做了不同端口宽度的 4 个单步 FHT,并用将这 4 个步模块串联起来,以完成数据流的流水线处理。该 FHT 实现方式的代码如下:
//该模块是 FHT 的顶层,调用 4 个不同端口宽度的单步 FHT 模块,完成整个 FHT 算法
module fhtpart(Clk,Reset,FhtStarOne,FhtStarTwo,FhtStarThree,FhtStarFour,
I0,I1,I2,I3,I4,I5,I6,I7,I8,
I9,I10,I11,I12,I13,I14,I15,
Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,
Out9,Out10,Out11,Out12,Out13,Out14,Out15);
input Clk; //设计的主时钟
input Reset; //异步复位
input FhtStarOne,FhtStarTwo,FhtStarThree,FhtStarFour; //4 个单步算法的时序控制
信号
input [11:0] I0,I1,I2,I3,I4,I5,I6,I7,I8;
input [11:0] I9,I10,I11,I12,I13,I14,I15; //FHT 的 16 个输入
output [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7;
output [15:0] Out8,Out9,Out10,Out11,Out12,Out13,Out14,Out15; //FHT 的 16 个输出
//第 1 次 FHT 单步运算的输出
wire [12:0] m0,m1,m2,m3,m4,m5,m6,m7,m8,m9;
wire [12:0] m10,m11,m12,m13,m14,m15;
//第 2 次 FHT 单步运算的输出
wire [13:0] mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7,mm8,mm9;
wire [13:0] mm10,mm11,mm12,mm13,mm14,mm15;
//第 3 次 FHT 单步运算的输出
wire [14:0] mmm0,mmm1,mmm2,mmm3,mmm4,mmm5,mmm6,mmm7,mmm8,mmm9;
wire [14:0] mmm10,mmm11,mmm12,mmm13,mmm14,mmm15;
//第 4 次 FHT 单步运算的输出
wire [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,Out9;
wire [15:0] Out10,Out11,Out12,Out13,Out14,Out15;
//第 1 次 FHT 单步运算
fht_unit1 fht_unit1(Clk,Reset,FhtStarOne,
I0,I1,I2,I3,I4,I5,I6,I7,I8,
I9,I10,I11,I12,I13,I14,I15,
m0,m1,m2,m3,m4,m5,m6,m7,m8,
m9,m10,m11,m12,m13,m14,m15
);
//第 2 次 FHT 单步运算
fht_unit2 fht_unit2(Clk,Reset,FhtStarTwo,
m0,m1,m2,m3,m4,m5,m6,m7,m8,
m9,m10,m11,m12,m13,m14,m15,
mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7,mm8,
mm9,mm10,mm11,mm12,mm13,mm14,mm15
);
//第 3 次 FHT 单步运算
fht_unit3 fht_unit3(Clk,Reset,FhtStarThree,
mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7,mm8,
mm9,mm10,mm11,mm12,mm13,mm14,mm15, mmm0,mmm1,mmm2,mmm3,mmm4,mmm5,mmm6,mmm7,mmm8,
mmm9,mmm10,mmm11,mmm12,mmm13,mmm14,mmm15
);
//第 4 次 FHT 单步运算
fht_unit4 fht_unit4(Clk,Reset,FhtStarFour,
mmm0,mmm1,mmm2,mmm3,mmm4,mmm5,mmm6,mmm7,mmm8,
mmm9,mmm10,mmm11,mmm12,mmm13,mmm14,mmm15,
Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,
Out9,Out10,Out11,Out12,Out13,Out14,Out15
);
endmodule
单步 FHT 运算如下(仅仅举例第 4 步的模块):
module fht_unit4(Clk,Reset,FhtStar,
In0,In1,In2,In3,In4,In5,In6,In7,In8,
In9,In10,In11,In12,In13,In14,In15,
Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,
Out9,Out10,Out11,Out12,Out13,Out14,Out15
);
input Clk; //设计的主时钟
input Reset; //异步复位
input FhtStar; //单步 FHT 运算控制信号
input [14:0] In0,In1,In2,In3,In4,In5,In6,In7,In8,In9;
input [14:0] In10,In11,In12,In13,In14,In15; //单步 FHT 运算输入
output [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,Out9;
output [15:0] Out10,Out11,Out12,Out13,Out14,Out15; //单步 FHT 运算输出
//Single FHT calculation
reg [15:0] Out0,Out1,Out2,Out3,Out4,Out5;
reg [15:0] Out6,Out7,Out8,Out9,Out10,Out11;
reg [15:0] Out12,Out13,Out14,Out15;
//补码运算wire [14:0] In8Co =~In8+1;
wire [14:0] In9Co =~In9+1;
wire [14:0] In10Co=~In10+1;
wire [14:0] In11Co=~In11+1;
wire [14:0] In12Co=~In12+1;
wire [14:0] In13Co=~In13+1;
wire [14:0] In14Co=~In14+1;
wire [14:0] In15Co=~In15+1;
always @(posedge Clk or negedge Reset)
begin
if(!Reset)
begin
Out0<=0;Out1<=0;Out2<=0;Out3<=0;
Out4<=0;Out5<=0;Out6<=0;Out7<=0;
Out8<=0;Out9<=0;Out10<=0;Out11<=0;
Out12<=0;Out13<=0;Out14<=0;Out15<=0;
end
else
begin
if(FhtStar)
begin
Out0<={In0[14],In0 }+{In8[14],In8 };
Out1<={In0[14],In0 }+{In8Co[14],In8Co };
Out2<={In1[14],In1 }+{In9[14],In9 };
Out3<={In1[14],In1 }+{In9Co[14],In9Co };
Out4<={In2[14],In2 }+{In10[14],In10 };
Out5<={In2[14],In2 }+{In10Co[14],In10Co };
Out6<={In3[14],In3 }+{In11[14],In11 };
Out7<={In3[14],In3 }+{In11Co[14],In11Co };
Out8<={In4[14],In4 }+{In12[14],In12 }; Out9<={In4[14],In4 }+{In12Co[14],In12Co };
Out10<={In5[14],In5 }+{In13[14],In13 };
Out11<={In5[14],In5 }+{In13Co[14],In13Co };
Out12<={In6[14],In6 }+{In14[14],In14 };
Out13<={In6[14],In6 }+{In14Co[14],In14Co };
Out14<={In7[14],In7 }+{In15[14],In15 };
Out15<={In7[14],In7 }+{In15Co[14],In15Co };
end
end
end
endmodule
以上就是给大家的分享,如果大家还需要后续,我将会继续为大家更新。

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

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

相关文章

权值线段树 详解+操作模板(c++)

文章目录权值线段树添加一个数字求某数出现的次数查询一段区间中数字出现的次数查询整个值域中第k小的数查询整个值域中第k大的数例子&#xff1a;求逆序对关于基本线段树与线段树的模板&#xff0c;请看我们之前发布的博客&#xff1a; 线段树入门详解 维护加法乘法&#xff0…

关于“茴香豆的‘茴’有几种写法”:学习过程中,若时间精力有限则优先记住最好用的一种

学习过程中的细节整理和精力节省权衡 我平时学习有整理总结、记笔记的习惯。 我学新东西总是很慢&#xff0c;因为细节处几乎都不会放过&#xff0c;会去发散&#xff0c;去深挖&#xff0c;去比较之前。 刚才上网&#xff0c;查了C语言中二维数组的赋值方式&#xff0c;某个…

UVM实战笔记(七)

第七章. UVM中的寄存器模型 7.1 寄存器模型简介 7.1.1 带寄存器配置总线的DUT 本章节使用的DUT带寄存器配置&#xff0c;代码如下&#xff1a; module dut(clk,rst_n,bus_cmd_valid,bus_op,bus_addr,bus_wr_data,bus_rd_data,rxd,rx_dv,txd,tx_en)input clk; …

DaVinci:Camera Raw(Sony RAW)

本文主要介绍 Sony RAW 格式素材相关的 Camera Raw 参数。解码质量Decode Quality解码质量决定了图像解拜耳之后所呈现的素质。默认为“使用项目设置” Use project setting&#xff0c;表示使用项目设置对话框中的“Camera RAW”解码质量设置。还可选择&#xff1a;全分辨率 -…

JavaEE-网络编程

目录一、网络编程套接字二、UDP Socket2.1 客户端服务器程序-回显服务(EchoServer)2.1.1 UdpEchoServer2.1.2 UdpEchoClient2.1.3 一个简单程序三、TCP 客户端服务器程序3.1 TCP API一、网络编程套接字 网络编程套接字就是操作系统给应用程序提供的一组API(叫做socket API)。 …

NLP学习笔记(七) BERT简明介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 BERT\text{BERT}BERT (Bidirectional Encoder Representations from Transformers) 原始论文请戳这里 0 概述 从某种程度上来说&#xff0c;深度学习至关重要的一环就是表征学习&#xff0c;也就是学习如何得到数据的向…

怎么把两个PDF合并?教你们几个简单的方法

不知道大家平时处理文件的数量多不多&#xff0c;但是小编日常处理文件真的特别多&#xff0c;所以小编经常会使用专业的格式转换器来处理文件&#xff0c;这样就可以高效处理文件了&#xff0c;例如我们需要将多个PDF文件合并&#xff0c;这样就只需要传输一个文件就可以了&am…

自定义starter解决请求绕过网关问题

引言 微服务项目中网关是一个常见的模块&#xff0c;通过网关的分发可以实现负载均衡、鉴权等操作&#xff1b;但是搭建好网关可以发现&#xff0c;虽然可以通过网关端口请求后端&#xff0c;如果有其他服务的地址依然可以使用其他服务地址绕过网关请求&#xff0c;这里我提供…

利用RadminLan和TcpRoute2将工作带回家

需要准备的工具 1.RadminLan 下载地址–>https://www.radmin-lan.cn/ 2.TcpRoute2 项目地址–>https://github.com/GameXG/TcpRoute2 *选用&#xff1a;浏览器插件proxy-switchyomega&#xff1a;https://microsoftedge.microsoft.com/addons/detail/proxy-switchyomega…

Visual Studio Code 的安装和使用

Visual Stuio Code 微软出的一款免费编辑器。 有 Windows、Linux 和macOS 三种版本的&#xff0c;属于跨平台的编辑器。它功能强大&#xff0c;支持插件工具安装&#xff0c;对于写代码、阅读代码的人来说是非常方便的。 1、安装 Visual Stuio Code 下载地址如下&#xff1a; h…

win10修改jdk版本之后不生效的有效解决方法

问题起因今天学习seata的时候&#xff0c;启动seata服务发现启动不了报下图错误。发现是自己jdk版本太高了&#xff0c;现在我用的是jdk17。然后我修改jdk的环境变量&#xff0c;确定保存好。发现jdk的版本还是没有变化。问题原因当使用安装版本的JDK程序时&#xff08;一般是1…

jmeter 并发测试

1.右键测试计划(Test plan), 添加线程组 2.线程组配置 3.右键线程组, 添加取样器-HTTP请求 4.HTTP请求配置 5. 添加查看结果树(也可以在Test plan 测试计划上右键添加)

Grafana 系列文章(二):使用 Grafana Agent 和 Grafana Tempo 进行 Tracing

&#x1f449;️URL: https://grafana.com/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/ ✍Author: Robert Fratto • 17 Nov 2020 &#x1f4dd;Description: Heres your starter guide to configuring the Grafana Agent to collect traces and…

【刷题】多数元素

这是leetcode第169题的解答。 目录 一、多数元素 二、实现思路 1.排序中间下标求众数 2.投票法 总结 一、多数元素 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 二、实现思路 1.排序中间下标求众数 原理&#xff1a; 通过排序使得数组有序&#xff0c;因为多数元素…

ESP32设备驱动-TM1637-驱动4位7段数码管

TM1637-驱动4位7段数码管 1、TM1637介绍 TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。 TM1637有如下…

【C++】初识C++

本期博客我们来正式进入到期待已久C嘎嘎的学习希望C语言以后别给我打电话了&#xff0c;我怕C误会&#x1f63c;一、认识C1. 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和…

蓝奥声无线单火控制技术在单火开关应用中的优势

随着科技的发展&#xff0c;智能产品在生活中越来越常见&#xff0c;为方便业主使用&#xff0c;就连开关也有了高阶智能版&#xff0c;据相关专家介绍&#xff0c;智能开关主要分为单火和零火两种&#xff0c;很多非专业人士搞不明白&#xff0c;但又害怕因此选择失误。那么&a…

关于微服务的一些总结和经验之谈,来看看你都了解吗

文章目录一 谈谈对微服务的理解1. 什么微服务&#xff1f;2. 微服务体系3. 微服务优点4. 微服务缺点5. 什么是gRPC&#xff1f;6. ProtoBuf协议好处&#xff1f;7. gPRC和ProtoBuf联系&#xff1f;二 本次微服务项目学习流程梳理三 微服务项目一般开发流程梳理四 从本次微服务项…

数据结构 | 图结构的讲解与模拟实现 | DFS与BFS的实现

文章目录前言常见概念总结图的模拟实现邻接矩阵和邻接表的优劣图的模拟实现&#xff08;邻接表&#xff09;广度优先遍历&#xff08;BFS&#xff09;深度优先遍历&#xff08;DFS&#xff09;前言 在聊图的结构之前&#xff0c;我们可以先从熟悉的地方开始&#xff0c;这有一…

Leetcode 剑指 Offer II 012. 左右两边子数组的和相等

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 …