手把手教你学veriolg(二十五)-- Verilog 串行 FIR 滤波器设计

目录

Verilog 串行 FIR 滤波器设计

1. 设计思路

2. Verilog 实现

3. 说明

4. 测试激励

5. 总结


Verilog 串行 FIR 滤波器设计

串行结构的 FIR 滤波器相比于并行结构来说,可以减少硬件资源的消耗,但会牺牲一定的计算速度。在串行结构中,输入数据逐位进入一个延迟链(也称为移位寄存器),然后依次与滤波器系数相乘,并最终累加起来得到输出结果。串行结构特别适合于资源受限的应用场合,例如便携设备或低成本设备。

1. 设计思路

串行结构的 FIR 滤波器通常采用如下设计思路:

  1. 输入缓冲:使用移位寄存器存储输入样本。
  2. 逐次乘法:每次输入一个新样本时,移位寄存器中的样本依次向后移动,并与对应的系数相乘。
  3. 累加输出:将乘法结果累加起来得到最终输出。
2. Verilog 实现

下面是一个基本的串行结构 FIR 滤波器的设计示例,假设滤波器阶数为 NN,并且使用 8 位的输入和系数。

 

verilog

深色版本

module serial_fir_filter (
    input wire clk,
    input wire rst,
    input wire valid_in,
    input wire [7:0] input_data,
    output reg valid_out,
    output reg [15:0] output_data
);

    // 参数定义
    parameter N = 3; // 滤波器阶数
    localparam [7:0] coeffs[N] = '{8'h01, 8'h02, 8'h04}; // 系数数组

    // 寄存器定义
    reg [7:0] inputs[N]; // 输入样本寄存器
    reg [15:0] accum; // 积累器

    // 时钟上升沿处理逻辑
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            valid_out <= 1'b0;
            accum <= 16'b0;
            for (int i = 0; i < N; i = i + 1) begin
                inputs[i] <= 8'b0;
            end
        end else if (valid_in) begin
            // 更新输入样本寄存器
            for (int i = N - 1; i > 0; i = i - 1) begin
                inputs[i] <= inputs[i - 1];
            end
            inputs[0] <= input_data;

            // 积累计算
            accum <= 16'b0;
            for (int i = 0; i < N; i = i + 1) begin
                accum <= accum + (inputs[i] * coeffs[i]);
            end

            // 设置输出有效标志
            valid_out <= 1'b1;
        end else begin
            valid_out <= 1'b0;
        end
    end

    // 输出数据
    assign output_data = accum;

endmodule
3. 说明
  • 接口定义

    • clk:时钟信号。
    • rst:复位信号。
    • valid_in:有效输入信号,指示是否有新的输入数据。
    • input_data:输入数据。
    • valid_out:有效输出信号,指示输出数据是否有效。
    • output_data:输出数据。
  • 参数定义

    • N:滤波器阶数。
    • coeffs:系数数组。
  • 寄存器定义

    • inputs:输入样本寄存器数组。
    • accum:积累器,用于累加乘积结果。
  • 时钟上升沿处理逻辑

    • 如果 rst 信号有效,则复位输出有效信号、积累器,并将所有输入样本寄存器清零。
    • 如果 valid_in 信号有效,则更新输入样本寄存器,并进行累加计算。
    • 将输入数据逐个移入输入样本寄存器。
    • 计算所有输入样本与对应系数的乘积,并累加起来。
    • 设置输出有效标志。
  • 输出数据

    • 将积累器的结果赋值给输出数据。
4. 测试激励

为了验证串行结构的 FIR 滤波器是否正确工作,我们需要编写一个测试激励来模拟输入信号,并观察输出结果。

 

verilog

深色版本

module serial_fir_filter_test;

    reg clk;
    reg rst;
    reg valid_in;
    reg [7:0] input_data;
    wire valid_out;
    wire [15:0] output_data;

    // 实例化串行结构的 FIR 滤波器模块
    serial_fir_filter uut (
        .clk(clk),
        .rst(rst),
        .valid_in(valid_in),
        .input_data(input_data),
        .valid_out(valid_out),
        .output_data(output_data)
    );

    // 生成时钟信号
    always #5 clk = !clk;

    // 生成测试激励
    initial begin
        clk = 1'b0;
        rst = 1'b1;
        valid_in = 1'b0;
        input_data = 8'b0000_0000;

        #10;
        rst = 1'b0;

        // 输入数据序列
        valid_in = 1'b1;
        input_data = 8'b0000_0001;
        #20;
        input_data = 8'b0000_0010;
        #20;
        input_data = 8'b0000_0100;
        #20;
        input_data = 8'b0000_1000;
        #20;
        input_data = 8'b0001_0000;
        #20;
        input_data = 8'b0010_0000;
        #20;
        input_data = 8'b0100_0000;
        #20;
        input_data = 8'b1000_0000;
        #20;

        // 观察输出数据
        if (valid_out) begin
            $display("Output Data: %h", output_data);
        end

        #100;
        $finish;
    end

endmodule

在这个测试激励中,我们生成了时钟信号,并设置了输入数据序列来测试串行结构的 FIR 滤波器模块。通过观察 valid_outoutput_data 的输出,可以验证滤波器是否按预期工作。

5. 总结

设计串行结构的 FIR 滤波器可以有效地节省硬件资源,但会降低计算速度。通过使用移位寄存器存储输入样本,并依次与滤波器系数相乘,最后累加起来得到输出结果,可以实现一个基本的串行结构 FIR 滤波器。希望本节的内容能够帮助你更好地理解和实现 Verilog 中的串行结构 FIR 滤波器设计,并在实际的设计中发挥重要作用。继续深入学习 Verilog 的其他特性和高级功能,将有助于你更好地掌握这门语言,并应用于实际的硬件设计中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值