?? fir_pipline_lms.v
字號:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 00:07:27 10/07/2007
// Design Name:
// Module Name: fir_pipline_lms
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module fir_pipeline_lms (clk, x_in, d_in, e_out, y_out);
parameter W1 = 16, //輸入信號的位寬
W2 = 32; //乘法器的輸出位寬
input clk; //輸入時鐘
input [W1-1:0] x_in, d_in; //輸入信號和參考信號
output [W2-1:0] e_out, y_out; //誤差信號和輸出信號
//聲明中間變量
reg [W1-1:0] x, x0, x1, x2, x3, x4, f0, f1;
reg [W1-1:0] d0, d1, d2, d3;
wire [W1-1:0] emu;
wire [W2-1:0] p0, p1, xemu0, xemu1; //紀錄乘積
wire [W2-1:0] y, sxty, e, sxtd;
//擴展輸入的參考信號
assign sxtd = {{16{d3[7]}}, d3};
//存儲數據和系數. 4級移位,補償乘法器的流水線所帶來的延遲
always @(posedge clk) begin
d0 <= d_in; //構成移位寄存器
d1 <= d0;
d2 <= d1;
d3 <= d2;
x0 <= x_in;
x1 <= x0;
x2 <= x1;
x3 <= x2;
x4 <= x3;
f0 <= f0 + xemu0[31:16]; //相當于步長因子為1/2
f1 <= f1 + xemu1[31:16];
end
//調用IPCore生成乘法器lmsmult時,選了最大的流水線級數3級
//計算p(i) = f(i) * x(i);
// x0*f0 = p0
lmsmult mul1(
.clk(clk), .a(x0), .b(f0), .q(p0));
// x1*f1 = p1
lmsmult mul2(
.clk(clk), .a(x1), .b(f1), .q(p1));
// 計算濾波器的輸出
assign y = p0 + p1;
assign sxty = {{15{y[15]}}, y[31:16]};
assign e = sxtd - sxty;
assign emu = e[16:1];
//計算xemu(i) = emu * x(i);
//xemu0 = emu * x0;
lmsmult mul3(
.clk(clk), .a(x3), .b(emu), .q(xemu0));
//xemu1 = emu * x1;
lmsmult mul4(
.clk(clk), .a(x4), .b(emu), .q(xemu1));
assign y_out = y;
assign e_out = e;
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -