首页 > 其他分享 >流水线设计

流水线设计

时间:2023-12-25 17:11:07浏览次数:16  
标签:运算 FPGA 加法 设计 流水线 reg cmos

  将原本一个时钟周期完成的较大的组合逻辑通过合理的切割后分由多个时钟周期完成。

  将路径系统的分割成一个个数字处理单元(阶段),并在各个处理单元之间插入寄存器来暂存中间阶段的数据。被分割的单元能够按阶段并行的执行,相互间没有影响。所以最后流水线设计能够提高数据的吞吐率,即提高数据的处理速度。

  在 FPGA 设计中,可以直接调用 IP 核来生成一个高性能的乘法器。在位宽较小的时候,一个周期内就可以输出结果,位宽较大时也可以流水输出。在能满足要求的前提下,可以谨慎的用 * 或直接调用 IP 来完成乘法运算。常数的乘法都会用移位相加的形式实现,例如:

  A = A<<1 ;                    //完成A * 2
  A = (A<<1) + A ;           //对应A * 3
  A = (A<<3) + (A<<2) + (A<<1) + A ; //对应A * 15

  有时候数字电路在一个周期内并不能够完成多个变量同时相加的操作。所以数字设计中,最保险的加法操作是同一时刻只对 2 个数据进行加法运算,最差设计是同一时刻对 4 个及以上的数据进行加法运算。如果设计中有同时对 4 个数据进行加法运算的操作设计,那么此部分设计就会有危险,可能导致时序不满足

 

  以下是官方给的RGB888 to YCbCr的算法公式,我们可以直接把算法移植到FPGA上,但是我们都知道FPGA无法进行浮点运算,所以我们采取将整个式子右端先都扩大256倍,然后再右移8位,这样就得到了FPGA擅长的乘法运算和加法运算了

   在这里我们选择加3级流水线,就第一个Y分量而言,先计算括号中得乘法运算,消耗一个时钟,然后将括号中的数据求和,消耗一个时钟,这里为了计算方便,将128也扩大256倍,放到括号中,最终结果除以256就行了也就是右移8位,在FPGA中我们只需要舍弃低8位取高8位就行

 //*************************************************************//
Y = (77 *R + 150*G + 29 *B)>>8 Cb = (-43*R - 85 *G + 128*B + 32768)>>8 Cr = (128*R - 107*G - 21 *B + 32768)>>8
//***************************************************************//

module rtl( input clk, input rst_n, input cmos_R0, cmos_G0, cmos_B0, output reg [7:0] img_Y1, output reg [7:0] img_Cb1, output reg [7:0] img_Cr1 ); reg [15:0] cmos_R1, cmos_R2, cmos_R3; reg [15:0] cmos_G1, cmos_G2, cmos_G3; reg [15:0] cmos_B1, cmos_B2, cmos_B3; always @(posedge clk or negedge rst_n) begin if(!rst_n)begin cmos_R1 <= 16'd0; cmos_G1 <= 16'd0; cmos_B1 <= 16'd0; cmos_R2 <= 16'd0; cmos_G2 <= 16'd0; cmos_B2 <= 16'd0; cmos_R3 <= 16'd0; cmos_G3 <= 16'd0; cmos_B3 <= 16'd0; end else begin cmos_R1 <= cmos_R0 * 8'd77; cmos_G1 <= cmos_G0 * 8'd150; cmos_B1 <= cmos_B0 * 8'd29; cmos_R2 <= cmos_R0 * 8'd43; cmos_G2 <= cmos_G0 * 8'd85; cmos_B2 <= cmos_B0 * 8'd128; cmos_R3 <= cmos_R0 * 8'd128; cmos_G3 <= cmos_G0 * 8'd107; cmos_B3 <= cmos_B0 * 8'd21; end end reg [15:0] img_Y0; reg [15:0] img_Cb0; reg [15:0] img_Cr0; always @(posedge clk or negedge rst_n) begin if(!rst_n)begin img_Y0 <= 16'd0; img_Cb0 <= 16'd0; img_Cr0 <= 16'd0; end else begin img_Y0 <= cmos_R1 + cmos_G1 + cmos_B1; img_Cb0 <= cmos_B2 - cmos_R2 - cmos_G2 + 16'd32768; img_Cr0 <= cmos_R3 - cmos_G3 - cmos_B3 + 16'd32768; end end always @(posedge clk or negedge rst_n) begin if(!rst_n)begin img_Y1 <= 8'd0; img_Cb1 <= 8'd0; img_Cr1 <= 8'd0; end else begin img_Y1 <= img_Y0 [15:8]; img_Cb1 <= img_Cb0 [15:8]; img_Cr1 <= img_Cr0 [15:8]; end end endmodule

这是编译后的报告

 

让给我们看看写得一塌糊涂的verilog的报告

 

 

参考:

1、博客园:ninghechuan

2、csdn:https://blog.csdn.net/GJZGRB/article/details/134435972

 

标签:运算,FPGA,加法,设计,流水线,reg,cmos
From: https://www.cnblogs.com/DOVI666/p/17926460.html

相关文章

  • python的任何题目开头加上一句class的语句就是面向对象程序设计吗
    Python的任何题目开头加上一句class的语句并不意味着是面向对象程序设计(Object-OrientedProgramming,OOP)。面向对象程序设计是一种编程范式,它将程序组织为对象的集合,每个对象都有自己的状态和行为,并且可以与其他对象进行交互。在Python中,使用class关键字可以定义类,类是对象的蓝图,描......
  • 【CUMT计算机系统设计】Verilog语法概览
    基操标识符区分大小写,逻辑值不区分首字符必须为字母/下划线1. 模块Module有I/O功能的黑盒2.逻辑块always构建组合and时序逻辑块:if,case,for...always@(...)begin……end上升沿posedge下降沿negedgegenerate主要结合for:对向量......
  • Marvelous Designer 12:让服装设计变得栩栩如生
    MarvelousDesigner12是一款功能强大的三维服装设计软件,它为设计师提供了一个完整的解决方案,从草图和设计到裁剪和缝制。点击获取MarvelousDesigner12首先,MarvelousDesigner12具有强大的3D建模功能,可以创建高质量的3D服装模型。该软件提供了丰富的3D工具和功能,包括建模、......
  • CATIA Composer R2023:创新设计的3D魔力盒
    DSCATIAComposerR2023是一款全球领先的3D辅助设计软件,它为设计师提供了强大的设计和建模工具,帮助他们在虚拟环境中创建、修改和优化产品设计。点击获取DSCATIAComposerR2023该软件采用了先进的3D建模技术,可以轻松处理复杂的产品设计任务,并提供了丰富的建模工具和功能,包括......
  • 设计模式七大原则
    一、设计模式的七大原则1、七大原则二、单一职责原则单一职责原则的注意事项三、接口隔离原则1、介绍四、依赖倒转原则1、介绍2、依赖关系传递的三种方式3、注意事项和细节五、里氏替换原则六、开闭原则1、介绍七、迪米特法则1、介绍2、注意事项八、合成复用原则设计核心1、七大原......
  • mysql设计表名称要不要加表前缀
    在MySQL中设计表时,是否添加表前缀主要取决于你的具体需求和设计考虑。以下是一些关于是否使用表前缀的考虑因素:1,避免表名冲突:如果你的应用程序要与其他应用程序或系统共享数据库,或者你预计将来会有多个应用程序或系统使用同一个数据库,使用表前缀可以帮助避免表名冲突。例如,你......
  • delphi 窗体设计器选项(显示非可视组件、自动创建窗体)
    窗体设计器选项(显示非可视组件、自动创建窗体)选项介绍窗体设计器的首选项。Tools>Options>UserInterface>FormDesignerGridoptionsDisplaygrid在设计器上显示点网格点,以帮助对齐控件。Usedesignerguidelines启用设计器上的指引。指引有助于对齐窗体上的组件。......
  • 费控系统的设计和实现涉及到许多方面,包括需求分析、软件设计、开发等。在Python中,我们
    费控系统的设计和实现涉及到许多方面,包括需求分析、软件设计、开发等。在Python中,我们可以使用各种库和框架来帮助我们实现这样的系统。以下是一个基本的费控系统设计思路¹:classFeeControlSystem:def__init__(self):self.expenses=[]defadd_expense(self......
  • 基于java斗车交易系统设计与实现
    21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对斗车交易系统进行了介绍,包括......
  • 设计模式(十八)备忘录
    一、定义在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态。备忘录模式是一种对象行为型模式,其别名为标记(Token)模式。二、描述备忘录模式的核心在于备忘录类以及用于管理备忘录的负责人类的设计,包含以下三个......