用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现

2.6.3 常用数字处理算法的Verilog实现

1.加法器的Verilog实现

串行加法器

组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现。假设 和 表示两个加数, 表示和, 表示来自低位的进位, 表示向高位的进位。每个全加器都执行如下的逻辑表达式:

这样可以得到加法器的一种串行结构。因此,式(2.1)所示的加法器也被称为串行加法器。如图2-20给出了一个4位串行加法器的结构示意图。

图2-20 串行加法器的结构示意图

在无线通信的信号处理中,常常要用到多位数字量的加法运算。如果用串行加法器实现,速度较慢,而并行加法器就能满足要求,并且结构并不复杂。现在普遍使用的并性加法器是超前进位加法器,只是在几个全加器的基础上增加了一个超前进位形成逻辑,以减少由于逐步进位信号的传递所造成的时延。图2-21给出了一个4位并行加法器的结构示意图。

图2-21 串行加法器的示意图

在4位并行加法器的基础上,可以递推出16位、32位和64位的快速并行加法器。

流水线加法器

在使用了并行加法器后,仍旧只有在输出稳定后才能输入新的数进行下一次计算,即计算的节拍必须大于运算电路的延迟;此外,许多门级电路和布线的延迟会随着位数的增加而累加,因此加法器的频率还是受到了限制。但如果采用流水线,就有可能将一个算术操作分解为一些小规模的基本操作,将进位和中间值存储在寄存器中,并在下一个时钟周期内继续运算,这样就可以提高电路的利用效率。将流水线规则应用于FPGA中,只需要很少或根本不需要额外的成本。这是因为每个逻辑单元都包含两个触发器,大多数情况下这两个触发器或者没有用到,或者用于存储布线资源,那么就可以利用其来实现流水线结构。如果采用了流水线后,加法器的速度仍然不能满足需要的话,可以采用第3章中将会提到的串并转换来进一步提高计算的并行度。        由于一个slice中有两个触发器,还需要有1个触发器来作为进位输出,那么采用 级流水线,就可以构造一个最大位数为 位的加法器。下面给出一个16位流水线加法器的代码。例2-24 16位2级流水线加法器的Verilog设计module adder16_2(cout ,sum ,clk ,cina ,cinb ,cin) ;input [15 :0 ]cina ,cinb ;input clk ,cin ;output [15 :0 ] sum;output cout ;reg cout ;reg cout1 ;reg[7 :0 ] sum1 ;reg[15 :0 ] sum;always @(posedge clk) begin // 低8 位相加;{cout1 , sum1} = {cina [7], cina [ 7 : 0 ]} + {cinb[7], cinb [ 7 : 0 ]} +cin ;endalways @(posedge clk) begin // 高8 位相加,并连成16位{cout ,sum} = { {cina [15], cina [15 :8 ] }+ {cinb [15], cinb[15 :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位串行乘法器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) begincase (state)s0 : begin // 初始化y_reg <= y;state <= s1;count = 0;p1 <= 0;t <= { {8{x[7]}},x};ends1 : begin // 处理步骤if (count == 7) /

你可能感兴趣的:(用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现)