tempa_2 <= tempa_1[11:4];//第3级锁存,存储高8位数据
tempb_2 <= tempb_1[11:4];
sum_reg2 <= {sum2,sum_reg1};//拼接低7位数据
end
always @ (posedge clk)
begin
{c3,sum3} <= tempa_2[3:0] + tempb_2[3:0] + c2;//第9~12位数据相加
tempa_3 <= tempa_2[7:4];//第4级锁存,存储高8位数据
tempb_3 <= tempb_2[7:4];
sum_reg3 <= {sum3,sum_reg2};//拼接低12位数据
end
always @ (posedge clk)
begin
{c4,sum4} <= tempa_3 + tempb_3 + c3;//第13~16位数据相加
dout <= {sum4,sum_reg3};//拼接最终16位数据并输出
inb <= {sum4,sum_reg3};
end 流水线累加器在Modelsim下的仿真结果如图4所示。
图4 流水线累加器的Modelsim仿真结果 3.2 基于镜像算法的ROM设计
镜像算法是利用整体空间上的对称性,通过对局部的折叠、翻转、倒置等方法,达到以局部代替整体的效果。正弦与余弦函数无论在横轴上还是在纵轴上都具有很好的对称性,因此可以利用镜像的思想对ROM的存储方式进行优化,通过地址镜像以及数据镜像,达到压缩ROM空间、节约芯片资源的目的。
以构建正弦函数值ROM为例。在[0,π]区间内其波形是关于π/2对称的,因此其[2/π,π]区间内的波形可以通过对[0,π/2]的波形关于π/2进行翻转而成,同理[π,2π]区间内的波形可以通过对[0,π]的波形关于横轴翻转而成。所以实际上ROM只需要存储[0,π/2]内的正弦函数值,通过适当算法即可实现输出一个完整周期的正弦函数值,从而大大减小存储器的大小。
镜像优化的ROM结构框图如图5所示。
图5 镜像优化的ROM结构框图 首先将总地址分为3部分:最高位作为数据镜像器的标志位,实现对数据的镜像转换;次高位作为地址镜像器的标志位,实现对ROM地址的镜像转换;而余下的通过地址镜像器后作为ROM地址位。如果将最高位和次高位合并起来看,它们实质上是构成一个象限选择器,其值从00至11分别代表第1、2、3、4象限。
由于余弦信号对于正弦信号而言,只是在相位上提前了π/2个单位,因此如果要产生双路正余弦信号,只需要在相位累加器相位输出的次高位上加1位,即可通过正弦ROM查找表得到余弦的信号。
基于镜像算法的ROM Verilog HDL实现代码如下(端口申明部分略):
assign addflag_sin = din_reg[15:14];//提取地址最高位和次高位
assign addflag_cos = din_reg[15:14] + 2'b01;//将正弦地址转换为余弦地址
assign add_trans_sin = addflag_sin[0];//正弦地址镜像器标志位
assign data_trans_sin = addflag_sin[1];//正弦数据镜像器标志位
assign add_trans_cos = addflag_cos[0];//余弦地址镜像器标志位
assign data_trans_cos = addflag_cos[1];//余弦数据镜像器标志位
assign din_addr_inv = ~din_reg[13:0];//对ROM输入地址镜像
always @ (posedge clk) //正弦地址镜像器控制
begin
if(!rst_n) addr_sin <= 14'd0;
else if (add_trans_sin) addr_sin <= din_addr_inv;
else addr_sin <= din_reg[13:0];
end
always @ (posedge clk) //余弦地址镜像器控制
begin
if(!rst_n) addr_cos <= 8'd0;
else if (add_trans_cos) addr_cos <= din_addr_inv;
|