?? fir_lms.v
字號:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 20:24:37 08/18/2007
// Design Name:
// Module Name: fir_lms
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module fir_lms(clk, x_in, d_in, e_out, y_out, f0_out, f1_out);
parameter W1 = 8, // 輸入信號的寬度
W2 = 16, // 乘法器的輸出寬度2*W1
L = 2; // FIR自適應濾波器的長度
input clk; // 輸入信號的時鐘
input [W1-1:0] x_in, d_in; // 濾波器的輸入信號和參考信號
output [W2-1:0] e_out, y_out; // 濾波器的輸出信號和誤差信號
output [W1-1:0] f0_out, f1_out; // Results
reg [W1-1:0] x, x0, x1, f0, f1; // 存放系數的寄存器
reg [W1-1:0] d;
wire [W1-1:0] emu;
wire [W2-1:0] p0, p1, xemu0, xemu1; // 存放乘積的寄存器
wire [W2-1:0] y, sxty, e, sxtd;
wire clken, aclr;
wire [W2-1:0] sum;
assign sum=0;
assign aclr=0;
assign clken=0;
//將輸入的參考信號擴展到16比特
assign sxtd = {{8{d[7]}}, d};
always @(posedge clk) begin
d <= d_in; // 完成寄存器的數據采樣,并存放數據
x0 <= x_in;
x1 <= x0; // 移位
f0 <= f0 + xemu0[15:8]; ////截位相當于乘以步長因子
f1 <= f1 + xemu1[15:8];
end
// 完成 p(i) = f(i) * x(i)的乘法計算
mult mult_0( // x0*f0 = p0
.clk(clk),
.a(x0),
.b(f0),
.q(p0));
mult mult_1( // x0*f0 = p0
.clk(clk),
.a(x1),
.b(f1),
.q(p1));
assign y = p0 + p1; // 計算ADF的輸出
// 將y擴展到16位
assign sxty = { {7{y[15]}}, y[15:7]};
assign e = sxtd - sxty;
assign emu = e[8:1];
// 完成 xemu(i) = emu * x(i)的計算
mult mult_2( // Multiply x0*f0 = p0
.clk(clk),
.a(x0),
.b(emu),
.q(xemu0));
mult mult_3( // Multiply x0*f0 = p0
.clk(clk),
.a(x1),
.b(emu),
.q(xemu1));
assign y_out = y; // 監控輸出控制信
assign e_out = e;
assign f0_out = f0;
assign f1_out = f1;
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -