资源描述:
《常用数字处理算法的Verilog实现.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、常用数字处理算法的Verilog实现1.加法器的Verilog实现·串行加法器组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现。假设和表示两个加数,表示和,表示来自低位的进位,表示向高位的进位。每个全加器都执行如下的逻辑表达式: 这样可以得到加法器的一种串行结构。因此,式(2.1)所示的加法器也被称为串行加法器。如图2-20给出了一个4位串行加法器的结构示意图。 图2-20串行加法器的结构示意图在无线通信的信号处理中,常常要用到多位数字量的加法运算。如果用串行加法器实现,速度较慢,而并行加法器就能满足要求,并且结构并不复杂。现在普遍使用的并性加法器是超前进位加
2、法器,只是在几个全加器的基础上增加了一个超前进位形成逻辑,以减少由于逐步进位信号的传递所造成的时延。图2-21给出了一个4位并行加法器的结构示意图。图2-21串行加法器的示意图在4位并行加法器的基础上,可以递推出16位、32位和64位的快速并行加法器。·流水线加法器在使用了并行加法器后,仍旧只有在输出稳定后才能输入新的数进行下一次计算,即计算的节拍必须大于运算电路的延迟;此外,许多门级电路和布线的延迟会随着位数的增加而累加,因此加法器的频率还是受到了限制。但如果采用流水线,就有可能将一个算术操作分解为一些小规模的基本操作,将进位和中间值存储在寄存器中,并在下一个时钟周
3、期内继续运算,这样就可以提高电路的利用效率。将流水线规则应用于FPGA中,只需要很少或根本不需要额外的成本。这是因为每个逻辑单元都包含两个触发器,大多数情况下这两个触发器或者没有用到,或者用于存储布线资源,那么就可以利用其来实现流水线结构。如果采用了流水线后,加法器的速度仍然不能满足需要的话,可以采用第3章中将会提到的串并转换来进一步提高计算的并行度。 由于一个slice中有两个触发器,还需要有1个触发器来作为进位输出,那么采用级流水线,就可以构造一个最大位数为位的加法器。 下面给出一个16位流水线加法器的代码。例2-2416位2级流水线加法器的Verilog设计
4、 moduleadder16_2(cout,sum,clk,cina,cinb,cin); input[15:0]cina,cinb; inputclk,cin; output[15:0]sum; outputcout; regcout; regcout1; reg[7:0]sum1; reg[15:0]sum; always@(posedgeclk)begin//低8位相加; {cout1,sum1}={cina[7],ci
5、na[7:0]}+{cinb[7],cinb[7:0]}+cin; end always@(posedgeclk)begin//高8位相加,并连成16位 {cout,sum}={{cina[15],cina[15:8]}+{cinb[15],cinb[15:8]}+cout1,sum1}; end endmodule 上述程序经过synplifyPro综合后,得到如图2-22所示的RTL级结构图。2-2216位加法器的RTL结构图在ModelSim6.2b中完成仿真,其结果如图2-23所示,正确地实现了16比特加法。图2-2316位加
6、法器的RTL结构图2.乘法器的Verilog实现·串行乘法器两个N位二进制数x、y的乘积,最简单的方法就是利用移位操作来实现,用公式可以表示为: (2.3)这样输入量随着k的位置连续地变化,然后累加 。 例2-25用Verilog实现一个8位串行乘法器 moduleade(clk,x,y,p); inputclk; input[7:0]x,y; output[15:0]
7、p; reg[15:0]p; parameters0=0,s1=1,s2=2; reg[2:0]count; reg[1:0]state; reg[15:0]p1,t;//比特位加倍 reg[7:0]y_reg; always@(posedgeclk)begin case(state) s0:begin//初始化 y_reg<=y; state<=s1; count=0; p1<=0; t<={{8{x[7]}},x};