tag 标签: 流水线技术

相关博文
  • 热度 16
    2023-4-3 22:04
    2153 次阅读|
    0 个评论
    DSP 技术基本概念及典型系统分析 1. 基本概念与典型的DSP系统 通常 DSP(Digital Signal Processing)是指数字信号处理。DSP 芯片是专用的数字信号处理器(Digital Signal Processor),它采用哈佛结数、流水线作业方式的并行处理技术,有专用的指令系统,尤其适用于数字信号的算法实现,编码变换等处理。 2、DSP 的发展历史和现状 (1)DSP 发展的历史背景 现代信号处理起源于 17-18 世纪的数学,并以 1807 年 12 月 21 日法国工程师 J、B、Fourier 提出 FT 变换为标志。我们现在讨论的数字信号处理,是随着数字电子计算机的发展而发展起来。在数字信号处理的初期(本世纪 50~60 年代),人们只是在通用的数字计算机上进行算法的研究和处理系统的模拟与仿真,1965 年库利-图基(Cooley Tukey)提出快速付氏变换 FFT 是数字信号处理发展史上的一个里程碑。同时随着 FFT 及其它算法的提出,也促进了专用数字处理硬件的发展,并最终导致高速高位 DSP 的出现。 DSP 的特点与应用 DSP 总线结构都采用哈佛结构或改进的哈佛结构。通用的微处理采用 冯.诺依曼结构,即程序指令和数据共用一个存储空间及单一的地址和数据总线。为进一步提高运算速度,以满足实时信号处理的要求,当前的 DSP 芯片采用哈佛结构。 所谓哈佛结构,是将指令和数据的存储空间分开。这样使得处理指令和处理数据可以同时进行,从而大大提高处理效率。 (2)采用流水线技术 DSP 大多采用了流水线技术。计算机在进行一条指令时,要经过取指、译码、访问数据、执行等几个步骤,需若干个指令周期才能完成。 流水线技术将各指令和执行时间可以重叠起来。即第一条指令取指后,在进行译码的同时,可进行第二条指令的取指;第一条指令访问数据时,第二条指令译码……。这样尽管每条指令的执行时间仍然是几个指令周期,但由于用了流水线的作业方式,使得总体处理速度大大提高。而 DSP 所采用的指令与数据存储空间分开的哈佛结构,为实现流水线作业方式提供了方便。 (3)具有硬件乘法器和 MAC 单元 在数字信号处理算法中,乘法和累加是最基本和大量的运算,例如在卷积运算、数字滤波、快速付里叶变换、相关计算、矩阵运算等算法中大多都有乘加(乘法和累加)运算。通用的乘法运算是采用软件实现的,往往一次乘法运算需要若干个机器周期才能完成。DSP中都设置了硬件乘法器和 MAC 乘加(乘法并累加)一类指令,取两个操作数到乘法器中作乘法,并将乘积加到累加器中,这些操作在 DSP 芯片中往往可以在单个在指令周期内完成,使得 DSP 作乘和累加这种数字信号处理基本运算的速度大为提高。 (4)具有循环寻址(circular addressing)及位倒序(bit reverse)寻址功能。 为满足 FFT、卷积等数字信号处理的特殊要求,当前的 DSP 大多在指令系统中设置了循环寻址及位倒序指令及其它特殊指令、体现在作这些运算时寻址、排序及计算机速度大大提高。 另外,DSP 系统设计和软件开发,往往需要相当规模的仿真调试系统,为方便用户的设计与调试,许多 DSP 在片上设置了仿真模块或仿真调试接口、如 Motorala 在 DSP 片是设置了一个 QnCE (On-Chip Emalation)功能块、通过行脚、使用户可以检查片内存储器、寄存器及外设,用单步运行,设置断点、跟踪等方式控制与调试程序。Ti 则在 DSP 片上设置了 JIAG(Joint Test Aotion Group)标准测试接口及相应的控制器。 在 PC 机上插入一块调试插板,接通 JIAG 接口,就可以在 PC 机上运行一个软件去控制它。 DSP 有自己的汇编语言指令系统,为适用于高级语言编程,各公司也陆续推出适用于DSP 的高级语言编译器,主要是 C 语言编译器,也有 Ada、Pascal 等编译器,程序员可用高级语言编程,通过编译器,将程序汇编、连接成 DSP 目标代码。
  • 热度 20
    2014-7-11 10:51
    2423 次阅读|
    1 个评论
    最近在看流水线,先介绍一下流水线技术,主要有以下几个关键意思 1:面积换速度 2:能提高数字系统的工作频率和数据吞吐量 3:以消耗较多的寄存器为代价,在性能上的提升 先介绍一种四级流水线的加法器, 它的特点是每两位bit作为一个流水线阶段进行相加, 这样在输入数据四个时钟周期后得到数据。 需要 1:在每一级暂存输入数据 2:暂存每个阶段的结果 实现代码如下 module Addr_8bit_4l(Clk, Rst, In_a, In_b, Cin, Sum, Cout);       //可综合模块——4级流水线8bit全加器,时钟上升沿触发,可同步复位,实现中高速加法运算     input Clk,Rst;                 //时钟输入端,同步复位端     input   In_a;                //8位二进制输入a端     input   In_b;                //8位二进制输入b端     input  Cin;                  //进位输入端     output   Sum;                 //8位和输出端     output Cout;                  //进位输出端  //--------------------------输入输出端口数据类型定义---------------------------  wire Clk,Rst;                    wire   In_a;     wire   In_b;     wire  Cin;     wire   Sum;     reg  Cout;  //-------------------------------中间变量声明---------------------------------   reg   a6_Temp,b6_Temp;              //高6位输入缓存  reg   a4_Temp,b4_Temp;              //高4位输入缓存  reg   a2_Temp,b2_Temp;              //高2位输入缓存               reg   Sum2_Temp;               //低2位和缓存  reg   Sum4_Temp;               //低4位和缓存  reg   Sum6_Temp;               //低6位和缓存  reg   Sum_Temp;                //总8  reg  Cout2_Temp,Cout4_Temp,Cout6_Temp;           //低2位、低4位、低6位的进位缓存  //--------------------------------功能块开始----------------------------------  always @ ( posedge Clk)               //时钟Clk上升沿触发  if(Rst==1)                   //如果Rst为高电平——   begin    a2_Temp = 0;                //同步复位    a4_Temp = 0;                //同步复位    a6_Temp = 0;                //同步复位    b2_Temp = 0;                //同步复位    b4_Temp = 0;                //同步复位    b6_Temp = 0;                //同步复位    Sum2_Temp = 0;                //同步复位    Sum4_Temp = 0;                //同步复位    Sum6_Temp = 0;                //同步复位    Sum_Temp  = 0;               //同步复位    Cout2_Temp = 0;               //同步复位    Cout4_Temp = 0;               //同步复位    Cout6_Temp = 0;               //同步复位    Cout = 0;                 //同步复位       end      else                   //否则——   begin                   //流水线开始   //-------------------------------第1级流水线------------------------------    a6_Temp=In_a ;              //输入In_a高6位存入缓存a6_Tem    b6_Temp=In_b ;              //输入In_b高6淮嫒缓存b6_Temp    {Cout2_Temp,Sum2_Temp}=In_a +In_b +Cin;       //输入In_a、In_b低2位接受进位并相加,和存入Sum2_Temp,进位存入Cout2_Temp   //-------------------------------第2级流水线------------------------------    a4_Temp=a6_Temp ;              //输入In_a高4位存入缓存a4_Temp    b4_Temp=b6_Temp ;              //输入In_b高4位存入缓存b4_Temp    Sum4_Temp =Sum2_Temp;             //全加和低2位寄存    {Cout4_Temp,Sum4_Temp }=a6_Temp +b6_Temp +Cout2_Temp;  //输入In_a In_b 接受第3级的进位Cout2_Temp并相加     //-------------------------------第3级流水线------------------------------                 a2_Temp=a4_Temp ;              //输入In_a高2位存入缓存a2_Temp    b2_Temp=b4_Temp ;              //输入In_b高2位存入缓存b2_Temp    Sum6_Temp =Sum4_Temp;             //全加和低4位寄存    {Cout6_Temp,Sum6_Temp }=a4_Temp +b4_Temp +Cout4_Temp;  //输入In_a 、In_b 接受第3级的进位Cout4_Temp并相加      //-------------------------------第4级流水线------------------------------    Sum_Temp =Sum6_Temp;             //全加和低6位寄存    {Cout,Sum_Temp }=a2_Temp+b2_Temp+Cout6_Temp;       //输入In_a、In_b高2位接受第3级的进位Cout6_Temp并相加,全加进位输出到端口Cout   end                    //流水线结束    assign Sum = Sum_Temp ;              //全加和输出到端品Sum endmodule  仿真测试波形:  每个时钟流水地处理两个bit,顺序从低到高处理完8bit。   第二种树形流水线加法器 这种方法的特点是按树形每级排列加法器结构,加法并行地从树叶开始,一直到树根结束,8bit加法器每次两位相加,共有三级流水线。 实现代码如下: module Addr_8bit_2(Clk, Rst, In_a, In_b, Cin, Sum, Cout);            input Clk,Rst;                     input   In_a;                   input   In_b;                    input  Cin;                     output   Sum;                   output  Cout;            reg T_a1;     reg T_a1_cout1;    // reg T_a2;     reg T_a3;     reg T_a2_cout1;     //reg T_a4;          reg S_a1;     reg S_a1_cout1;     reg S_a2;          reg X_a;     reg X_cout;          reg a72,b72;     always@(posedge Clk)      begin       ///////////////////////////one        {T_a1_cout1,T_a1}=In_a +In_b +Cin;        {T_a2_cout1,T_a3}=In_a +In_b ;          a72=In_a ;        b72=In_b ;       //////////////////////////two    S_a1 =T_a1;   S_a2 =T_a3;   {S_a1_cout1,S_a1 }=a72 +b72 +T_a1_cout1;   S_a2 =a72 +b72 +T_a2_cout1;        /////////////////////////three          X_a =S_a1;        {X_cout,X_a }=S_a2+S_a1_cout1;          end          assign Cout=X_cout;          assign Sum=X_a;       endmodule   仿真波形: 总结:这两种方法,一种是串行的流水线形式,一种是并行的流水线形式,仅供参考。
相关资源