《常用数字处理算法的verilog实现》由会员分享,可在线阅读,更多相关《常用数字处理算法的verilog实现(18页珍藏版)》请在金锄头文库上搜索。
1、常用数字处理算法的Verilog实现1加法器的Verilog实现 串行加法器组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现。假设 和 表示两个加数, 表示和, 表示来自低位的进位, 表示向高位的进位。每个全加器都执行如下的逻辑表达式:这样可以得到加法器的一种串行结构。因此,式(2.1)所示的加法器也被称为串行加法器。如图2-20给出了一个4位串行加法器的结构示意图。图2-20 串行加法器的结构示意图在无线通信的信号处理中,常常要用到多位数字量的加法运算。如果用串行加法器实现,速度较慢,而并行加法器就能满足要求,并且结构并不复杂。现在普遍使用的并性加法器是超前进位加法器,只是在几个全加
2、器的基础上增加了一个超前进位形成逻辑,以减少由于逐步进位信号的传递所造成的时延。图2-21给出了一个位并行加法器的结构示意图。图2-21 串行加法器的示意图在4位并行加法器的基础上,可以递推出16位、32位和64位的快速并行加法器。 流水线加法器在使用了并行加法器后,仍旧只有在输出稳定后才能输入新的数进行下一次计算,即计算的节拍必须大于运算电路的延迟;此外,许多门级电路和布线的延迟会随着位数的增加而累加,因此加法器的频率还是受到了限制。但如果采用流水线,就有可能将一个算术操作分解为一些小规模的基本操作,将进位和中间值存储在寄存器中,并在下一个时钟周期内继续运算,这样就可以提高电路的利用效率。将
3、流水线规则应用于FPGA中,只需要很少或根本不需要额外的成本。这是因为每个逻辑单元都包含两个触发器,大多数情况下这两个触发器或者没有用到,或者用于存储布线资源,那么就可以利用其来实现流水线结构。如果采用了流水线后,加法器的速度仍然不能满足需要的话,可以采用第3章中将会提到的串并转换来进一步提高计算的并行度。由于一个slice中有两个触发器,还需要有1个触发器来作为进位输出,那么采用 级流水线,就可以构造一个最大位数为 位的加法器。下面给出一个16位流水线加法器的代码。例2-24 16位2级流水线加法器的Verilog设计module adder16_2(cout ,sum ,clk ,cina
4、 ,cinb ,cin) ; input 15 :0 cina ,cinb ; input clk ,cin ; output 15 :0 sum; output cout ; reg cout ; reg cout1 ; reg7 :0 sum1 ; reg15 :0 sum; always (posedge clk) begin / 低8 位相加;cout1 , sum1 = cina 7, cina 7 : 0 + cinb7, cinb 7 : 0 +cin ; end always (posedge clk) begin / 高8 位相加,并连成16位cout ,sum = cina
5、 15, cina 15 :8 + cinb 15, cinb15 :8 + cout1 , sum1 ; endendmodule上述程序经过synplify Pro综合后,得到如图2-22所示的RTL级结构图。2-22 16位加法器的RTL结构图在ModelSim 6.2b中完成仿真,其结果如图2-23所示,正确地实现了16比特加法。图2-23 16位加法器的RTL结构图2乘法器的Verilog实现 串行乘法器两个N位二进制数x 、y 的乘积,最简单的方法就是利用移位操作来实现,用公式可以表示为: (2.3)这样输入量随着k的位置连续地变化,然后累加。例2-25 用Verilog实现一个8
6、位串行乘法器module ade (clk, x, y, p);input clk;input 7:0 x, y;output 15:0 p;reg 15:0 p;parameter s0=0, s1=1, s2=2;reg 2:0 count;reg 1:0 state;reg 15:0 p1, t; / 比特位加倍reg 7:0 y_reg;always (posedge clk) begin case (state)s0 : begin / 初始化y_reg = y;state = s1;count = 0; p1 = 0;t = 8x7,x;ends1 : begin / 处理步骤if
7、 (count = 7) /判断是否处理结束state = s2;else beginif (y_reg0 = 1)p1 = p1 + t;y_reg 1; /移位t = t 1; count = count + 1; state = s1;endends2 : begin p = p1; state = s0;endendcase endendmodule上述程序在Synplify Pro中综合后,得到如图2-24所示的RTL级结构示意图。图2-24 串行乘法器的RTL结构图图2-25给出了串行乘法器模块在ModelSim中的仿真结果,验证了功能的正确性。图2-25 串行乘法器的局部仿真结果
8、示意图从仿真结果可以看出,上述串行乘法器,速度比较慢,时延很大,但这种乘法器的优点是所占用的资源是所有类型乘法器中最少的,在低速的信号处理中有着广泛的应用。 流水线乘法器一般的快速乘法器通常采用逐位并行的迭代阵列结构,将每个操作数的N位都并行地提交给乘法器。但是一般对于FPGA来讲,进位的速度快于加法的速度,这种阵列结构并不是最优的。所以可以采用多级流水线的形式,将相邻的两个部分乘积结果再加到最终的输出乘积上,即排成一个二叉树形式的结构,这样对于N位乘法器需要log2(N)级来实现。一个8位乘法器,如图2-26所示。图2-26流水线乘法器结构图例2-26 用Verilog HDL实现一个4位的
9、流水线乘法器module mul_addtree(mul_a, mul_b, mul_out, clk, rst_n);parameter MUL_WIDTH = 4; parameter MUL_RESULT = 8; input MUL_WIDTH-1 : 0 mul_a; input MUL_WIDTH-1 : 0 mul_b; input clk; input rst_n; output MUL_RESULT-1 : 0 mul_out; reg MUL_RESULT-1 : 0 mul_out; reg MUL_RESULT-1 : 0 stored0; reg MUL_RESULT
10、-1 : 0 stored1; reg MUL_RESULT-1 : 0 stored2; reg MUL_RESULT-1 : 0 stored3; reg MUL_RESULT-1 : 0 add01; reg MUL_RESULT-1 : 0 add23; always (posedge clk or negedge rst_n) begin if(!rst_n)begin /初始化寄存器变量mul_out = 8b0000_0000;stored0 = 8b0000_0000;stored1 = 8b0000_0000;stored2 = 8b0000_0000;stored3 = 8
11、b0000_0000; add01 = 8b0000_0000; add23 = 8b0000_0000;end elsebegin /实现移位相加stored3 = mul_b3?1b0,mul_a,3b0: 8b0;stored2 = mul_b2?2b0,mul_a,2b0: 8b0;stored1 = mul_b1?3b0,mul_a,1b0: 8b0;stored0 = mul_b0?4b0,mul_a: 8b0;add01 = stored1 + stored0;add23 = stored3 + stored2;mul_out = add01 + add23; end enden
12、dmodule上述程序在Synplify Pro软件中综合后,得到如图2-27所示的RTL级结构示意图。图2-27 流水线乘法器的RTL结构示意图图2-28给出了流水线乘法器模块在ModelSim中的仿真结果,验证了功能的正确性。图2-28 流水线乘法器的局部仿真结果示意图从仿真结果可以看出,上述流水线乘法器比串行加法器的速度快很多,在非高速的信号处理中有着广泛的应用。至于高速信号的乘法一般需要利用FPGA芯片中内嵌的硬核DSP单元来实现。3无符号除法器的Verilog实现两个无符号二进制数(如正整数)相除的时序算法是通过“减并移位”的思想来实现的,即从被除数中重复地减去除数,直到已检测到余数小于除数。这样可以通过累计减法运算的次数而得到商;而余数是在减法运算结束时被除数中的剩余值。当除数较小时,这种基本电路都必须进行多次减法,因此效率都不高。图2-29给出了一种更加高效的除法器基本结构3。在进