IIR Example
dsp iir {
clock_head clo;
fixed <8,4>
iwidth;
fixed <16,8> intwidth;
input <iwidth> x;
input <iwidth> a0,a1;
input <iwidth> b0,b1,b2;
output <iwidth> z;
signal <iwidth> y[3];
y[n]
= RC<16,8>(x[n] + RC<16,8>(a0*y[n-1]) + RC<16,8>(a1*y[n-2]));
z[n]
= RC<16,8>(RC<16,8>(b0*y[n-1]) + RC<16,8>(b1*y[n-2]) + RC<16,8>(b2*y[n-3]));
}
*/
/* AUTO
GENERATED (DO NOT EDIT MANUALLY) */
// Signal
Declarations
wire signed [7:0] x;
wire signed [7:0] a0;
wire signed [7:0] a1;
wire signed [7:0] b0;
wire signed [7:0] b1;
wire signed [7:0] b2;
wire signed [7:0] z;
wire signed [7:0] y;
reg signed [7:0] y_1;
reg signed [7:0] y_2;
reg signed [7:0] y_3;
// y[n] =
RC<16,8>(x[n] + RC<16,8>(a0*y[n-1]) +
RC<16,8>(a1*y[n-2]));
wire signed [15:0]
yRR_i0RR_i1RR_i0M = a0 * y_1;
wire signed [15:0]
yRR_i0RR_i1RR_i0R = $signed(yRR_i0RR_i1RR_i0M[15:0]);
wire signed [15:0] yRR_i0RR_i1R =
$signed(yRR_i0RR_i1RR_i0R[15:0]) + 16'sd0;
wire signed [15:0] yRR_i0RR_i1 =
$signed(yRR_i0RR_i1R[15:0]);
wire signed [15:0]
yRR_i0RR_i2RR_i0M = a1 * y_2;
wire signed [15:0]
yRR_i0RR_i2RR_i0R = $signed(yRR_i0RR_i2RR_i0M[15:0]);
wire signed [15:0] yRR_i0RR_i2R =
$signed(yRR_i0RR_i2RR_i0R[15:0]) + 16'sd0;
wire signed [15:0] yRR_i0RR_i2 =
$signed(yRR_i0RR_i2R[15:0]);
wire signed [15:0] yRR_i0R =
$signed({{4{x[7]}},x,4'd0}) + $signed(yRR_i0RR_i1[15:0]) + $signed(yRR_i0RR_i2[15:0]);
wire signed [15:0] yR =
$signed(yRR_i0R[15:0]) + 16'sd8;
wire signed [11:0] yC = (yR[15] &&
~yR[14:11]) ? -12'd2047 : (~yR[15] && yR[14:11]) ? 12'd2047 : yR;
assign y = $signed(yC[11:4]);
// z[n] =
RC<16,8>(RC<16,8>(b0*y[n-1]) + RC<16,8>(b1*y[n-2]) +
RC<16,8>(b2*y[n-3]));
wire signed [15:0]
zRR_i0RR_i0RR_i0M = b0 * y_1;
wire signed [15:0]
zRR_i0RR_i0RR_i0R = $signed(zRR_i0RR_i0RR_i0M[15:0]);
wire signed [15:0] zRR_i0RR_i0R =
$signed(zRR_i0RR_i0RR_i0R[15:0]) + 16'sd0;
wire signed [15:0] zRR_i0RR_i0 =
$signed(zRR_i0RR_i0R[15:0]);
wire signed [15:0]
zRR_i0RR_i1RR_i0M = b1 * y_2;
wire signed [15:0]
zRR_i0RR_i1RR_i0R = $signed(zRR_i0RR_i1RR_i0M[15:0]);
wire signed [15:0] zRR_i0RR_i1R =
$signed(zRR_i0RR_i1RR_i0R[15:0]) + 16'sd0;
wire signed [15:0] zRR_i0RR_i1 =
$signed(zRR_i0RR_i1R[15:0]);
wire signed [15:0]
zRR_i0RR_i2RR_i0M = b2 * y_3;
wire signed [15:0]
zRR_i0RR_i2RR_i0R = $signed(zRR_i0RR_i2RR_i0M[15:0]);
wire signed [15:0] zRR_i0RR_i2R =
$signed(zRR_i0RR_i2RR_i0R[15:0]) + 16'sd0;
wire signed [15:0] zRR_i0RR_i2 =
$signed(zRR_i0RR_i2R[15:0]);
wire signed [15:0] zRR_i0R =
$signed(zRR_i0RR_i0[15:0]) + $signed(zRR_i0RR_i1[15:0]) + $signed(zRR_i0RR_i2[15:0]);
wire signed [15:0] zR =
$signed(zRR_i0R[15:0]) + 16'sd8;
wire signed [11:0] zC = (zR[15] &&
~zR[14:11]) ? -12'd2047 : (~zR[15] && zR[14:11]) ? 12'd2047 : zR;
assign z = $signed(zC[11:4]);
// Delay Lines
always @(posedge clk) begin
if (!reset) begin
y_1 <= 0;
y_2 <= 0;
y_3 <= 0;
end
else if (enable) begin
y_1 <= y;
y_2 <= y_1;
y_3 <= y_2;
end
end
/* END AUTOGENERATION */