本文通过分别用verilog和SystemC来实现6阶FIR滤波器及testbench,在实现中串讲SystemC的各种语法知识,并对比两种实现方式的差异
N-1阶FIR滤波器的结构如下
N-1阶FIR滤波器的数学公式如下
6阶FIR滤波器有7个常数系数,6个乘法器和6个加法器,公式展开如下
y(n)=x(n)*a(0)+x(n-1)*a(1)+x(n-2)*a(2)+x(n-3)*a(3)+x(n-4)*a(4)+x(5)*a(5)+x(6)*a(6)
6阶FIR滤波器的硬件结构如下
在verilog实现中,模块FIR与testbench的关系如下图所示
在SystemC实现中,模块FIR与testbench的关系如下图所示
在verilog实现中,创建tb和FIR等两个module,在tb中例化FIR,实例名为fir,也就是tb和FIR是包含关系,而在SystemC实现中,创建tb、FIR以及system等三个module,在system中例化tb和FIR,tb和FIR是平等关系。
对于reset_n和x[15:0]等信号,verilog实现和SystemC都是在tb中声明这些信号,然后赋值,最后驱动到FIR,而对于clk,verilog实现在tb中声明clk,然后赋值,最后驱动到FIR,SystemC实现则是在system中声明clk,然后赋值,最后驱动到tb和FIR。
module FIR(input clk,input reset_n,input x,output y);
reg clk;
reg reset_n;
reg [15:0] x;
reg [15:0] x_1;
reg [15:0] x_2;
reg [15:0] x_3;
reg [15:0] x_4;
reg [15:0] x_5;
reg [15:0] x_6;
wire [15:0] y;
parameter a_1 = 16'd28;
parameter a_2 = 16'd38;
parameter a_3 = 16'd15;
parameter a_4 = 16'd69;
parameter a_5 = 16'd45;
parameter a_6 = 16'd56;
parameter a_7 = 16'd88;
initial
begin
clk = 1'b0;
reset_n = 1'b1;
x = 16'd0;
x_1 = 16'd0;
x_2 = 16'd0;
x_3 = 16'd0;
x_4 = 16'd0;
x_5 = 16'd0;
x_6 = 16'd0;
#100;
reset_n = 1'b0;
#100;
reset_n = 1'b1;
#1000000000;
$finish
end
always @(posedge clk, negedge reset_n)
begin
if(!reset_n)
begin
x <= 16'd0;
x_1 <= 16'd0;
x_2 <= 16'd0;
x_3 <= 16'd0;
x_4 <= 16'd0;
x_5 <= 16'd0;
x_6 <= 16'd0;
end
else
begin
x_1 <= x;
x_2 <= x_1;
x_3 <= x_2;
x_4 <= x_3;
x_5 <= x_4;
x_6 <= x_5;
end
end
endmodule