积分器的一种实现方法:每级积分器都是一个反馈系数为1的单极点IIR滤波器, 其传递函数为:
由上可以推出单级积分器的差分方程y(n) =x(n) + y(n- 1) , 可以看出用累加器即可实现。
Bout=Nlog2(RD)+Bin 其中:Bin 为输入位宽;Bout为输出位宽;N为滤波器阶数;R为抽取因子;D为延迟数值。
以下是3级积分器的实现程序:
module integrator(clk, rst,x_in, y_out);
input clk,rst;
input [7:0] x_in;
output [25:0] y_out;
reg [25:0] IntReg0=0; // 必须初始化!!!
reg [25:0] IntReg1=0;
reg [25:0] IntReg2=0;
reg [7:0] x; // Registered input
wire [25:0] sxtx; // Sign extended input
assign sxtx= {{18{x_in[7]}},x_in}; // 符号扩展,语句必须写在always语句块外面,always @(posedge clk) //否则IntReg0会在第一个时钟上升沿到来时无初始值if(rst)
begin
x <= x_in;
IntReg0 <= IntReg0+sxtx; //第一级输出
IntReg1 <= IntReg1+IntReg0; //第二级输出
IntReg2 <= IntReg2+IntReg1; //第三级输出
end
assign y_out=IntReg2;
endmodule
测试模块:
`timescale 1 ps/ 1 ps
module integrator_vlg_tst();
reg clk,rst;
reg [7:0] x_in;
wire [25:0] y_out;
integrator i1 (
.rst(rst),
.clk(clk),
.x_in(x_in),
.y_out(y_out)
);
initial
begin
clk=0;
rst=0;
# 50 rst=1;
end
always #50 clk=~clk;
always #10 x_in=8'd100; //该时间不能超过第一次时钟上升沿到来的时间。endmodule
仿真图如下:
输入为随机数据即为always #100 x_in={$random}%1024; 时,各寄存器值如下图所示: