|
本帖最后由 qq181022849 于 2011-6-16 21:12 编辑
我用matlab设计个butterworth滤波器这个图是得到的一些数据 请问这些数据就是这个4*6的矩阵在我的程序中是怎么用的??我给老师说是ise处理不了小数,她说我说的不对,不知道怎么给她解释
程序
Testbench.v是测试工程;
Butterworth.v是顶层文件;
Sub2.v是第二层文件。
2.1 Butterworth.v
`timescale 1ns / 1ps
module butterworth(
clk,
reset,
x_in,
y_out
);
input clk;
input reset;
input[15:0] x_in;
output[15:0] y_out;
wire[15:0] y1_out;
wire[15:0] y2_out;
wire[15:0] y3_out;
// the coefs of the filter
wire [15:0] a_1,a_2;
wire [15:0] b1_1_1,b1_2_1;
wire [15:0] b2_1_1,b2_2_1;
wire [15:0] b3_1_1,b3_2_1;
wire [15:0] b4_1_1,b4_2_1;
assign a_1 = 16'b0100000000000000;
assign a_2 = 16'b0010000000000000;
assign b1_1_1 = 16'b1101111110000011;
assign b1_2_1 = 16'b0001011101000111;
assign b2_1_1 = 16'b1110011000001100;
assign b2_2_1 = 16'b0000110000100111;
assign b3_1_1 = 16'b1110100110000011;
assign b3_2_1 = 16'b0000011001000011;
assign b4_1_1 = 16'b1110101100000110;
assign b4_2_1 = 16'b0000001110110000;
sub2 sub2_1(.clk(clk),.reset(reset),.a_1_1(a_1),.a_2_1(a_2),.b_1_1(b1_1_1),.b_2_1(b1_2_1),.x_in(x_in),.y_out(y1_out));
sub2 sub2_2(.clk(clk),.reset(reset),.a_1_1(a_1),.a_2_1(a_2),.b_1_1(b2_1_1),.b_2_1(b2_2_1),.x_in(y1_out),.y_out(y2_out));
sub2 sub2_3(.clk(clk),.reset(reset),.a_1_1(a_1),.a_2_1(a_2),.b_1_1(b3_1_1),.b_2_1(b3_2_1),.x_in(y2_out),.y_out(y3_out));
sub2 sub2_4(.clk(clk),.reset(reset),.a_1_1(a_1),.a_2_1(a_2),.b_1_1(b4_1_1),.b_2_1(b4_2_1),.x_in(y3_out),.y_out(y_out));
endmodule
2.2 Sub2.v
`timescale 1ns / 1ps
module sub2(
clk,
reset,
a_1_1,
a_2_1,
b_1_1,
b_2_1,
x_in,
y_out
);
input clk;
input reset;
input [15:0] a_1_1;
input [15:0] a_2_1;
input [15:0] b_1_1;
input [15:0] b_2_1;
input [15:0] x_in;
output [15:0] y_out;
reg[31:0] x_temp;
reg[31:0] y_temp;
reg[15:0] y_out;
wire [31:0] p1,p2,p3,p4,p5;
wire [32:0] y_t;
MULTIPLY mult1(.dataa(x_temp[31:16]),.datab(a_2_1),.result(p1));
MULTIPLY mult2(.dataa(x_temp[15:0]),.datab(a_1_1),.result(p2));
MULTIPLY mult3(.dataa(x_in[15:0]),.datab(a_2_1),.result(p3));
MULTIPLY mult4(.dataa(y_temp[31:16]),.datab(b_2_1),.result(p4));
MULTIPLY mult5(.dataa(y_temp[15:0]),.datab(b_1_1),.result(p5));
always@(posedge clk)
begin
if(!reset)
begin
x_temp <= 0;
y_temp <= 0;
end
else
begin
x_temp[31:0] <= {x_temp[15:0],x_in};
y_temp[31:0] <= {y_temp[15:0],y_out};
end
if(y_t[32:30]== 3'b000 ||y_t[32:30]== 3'b111 )
y_out <= y_t[30:15];
else if(y_t[32] == 1)
y_out <= 16'b 1000000000000000;
else
y_out <= 16'b 0111111111111111;
end
assign y_t = reset? ({p1[31],p1} + {p2[31],p2} + {p3[31],p3} - {p4[31],p4} - {p5[31],p5}):0;
//assign y_out[15:0] = {y_t[32],y_t[28:14]};
Endmodule
2.3 Testbench.v
`timescale 1 ps/ 1 ps
module testbench();
reg clk;
reg reset;
reg [15:0] x_in;
wire [15:0] y_out;
reg [15:0] memory [1000:0];
reg [9:0] i;
integer x_datain;
integer y_dataout;
initial
begin
reset = 0;
clk = 0;
i= 0;
#50 reset = 1;
x_in = 0;
x_datain =$fopen("sourceData.txt","r");
$readmemb("sourceData.txt",memory);
y_dataout = $fopen("finalData.txt","w");
$display("Running testbench");
end
always #1 clk = ~clk;
always@(posedge clk)
begin
if(i==10'd1000)
begin
i <= 0;
end
else
i <= i+1;
x_in <=memory;
$display("%b\n",y_out);
//$fdisplay(y_dataout,"\n%b",y_out);
end
butterworth i1(
.clk(clk),
.reset(reset),
.x_in(x_in),
.y_out(y_out)
);
endmodule |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|