用于VHDL中的ECG去噪的低通冷滤波器

在这方面 VHDL项目,一个简单的低通 冷杉 过滤器以VHDL实现 ec 去噪。完全呈现FIR滤波器的VHDL代码。 

冷杉的VHDL代码 筛选 通过将ModelSIM中的模拟结果与Matlab产生的正确结果进行比较来模拟和验证。 VHDL过滤器代码在Input.txt文件中提供了示例ECG输入,VHDL过滤器代码读取那些ECG文件,应用数字筛选,并将结果写入输出文件以进行验证。 


冷杉筛选器的VHDL代码

显然,ECG数字信号处理中最关键的步骤之一是噪声滤波,因为ECG信号受到许多不同源的噪声影响,例如基线漂泊,EMG干扰和电力线噪声。如上图所示,这些噪声可以减少许多过滤器。该项目是在VHDL中实现低通冷滤波器,以降低高频噪声和电源线干扰。

过滤器的规格如下:

  • 订购:10 
  • 点按:11
  • 8位符号整数系数如下所示:
冷杉筛选器的VHDL代码


在此项目中,如下图所示的FIR滤波器的定期实现在VHDL中实现。


冷杉筛选器的VHDL代码

冷杉滤波器基本上通过使用D-FLIP-FLOPS,签名乘法器和加法器来实现。基本块包括一个n位寄存器,一个乘法器和一个加法器。 VHDL生成语句用于使用基本块生成完整的设计。

低通冷滤波器的VHDL代码:

Library IEEE;  
 USE IEEE.Std_logic_1164.all;   
 USE IEEE.Std_logic_signed.all;   
 -- fpga4student.com: FPGA projects, VHDL项目, Verilog projects   
 -- LOW pass FIR filter for ECG Denoising
 -- VHDL project: FIR筛选器的VHDL代码   
 entity 冷杉_RI is  -- VHDL projects
 generic (  
           input_width          : integer     :=8               ;-- set input width by user  
           output_width     : integer     :=16               ;-- set output width by user  
           coef_width          : integer     :=8               ;-- set coefficient width by user  
           tap                    : integer     :=11               ;-- set filter order  
           guard               : integer     :=0)               ;-- log2(tap)+1  
 port(  
      Din          : in      std_logic_vector(input_width-1 downto 0)     ;-- input data  
      Clk          : in      std_logic                                             ;-- input clk  
      reset     : in      std_logic                                             ;-- input reset  
      Dout     : out      std_logic_vector(output_width-1 downto 0))     ;-- output data  
 end 冷杉_RI;  
 architecture behaivioral of 冷杉_RI is  
 -- N bit Register  
 component N_bit_Reg   
 generic (  
           input_width          : integer     :=8  
           );  
   port(  
    Q : out std_logic_vector(input_width-1 downto 0);     
    Clk :in std_logic;    
    reset :in std_logic;   
    D :in std_logic_vector(input_width-1 downto 0)    
   );  
 end component;
 -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects  
 type Coeficient_type is array (1 to tap) of std_logic_vector(coef_width-1 downto 0);  
 -----------------------------------FIR filter coefficients----------------------------------------------------------------  
 constant coeficient: coeficient_type :=   
                               (     X"F1",  
                                    X"F3",  
                                    X"07",  
                                    X"26",  
                                    X"42",  
                                    X"4E",  
                                    X"42",  
                                    X"26",  
                                    X"07",  
                                    X"F3",  
                                    X"F1"                                     
                                    );                                         
 ----------------------------------------------------------------------------------------------                                     
 type shift_reg_type is array (0 to tap-1) of std_logic_vector(input_width-1 downto 0);  
 signal shift_reg : shift_reg_type;  
 type mult_type is array (0 to tap-1) of std_logic_vector(input_width+coef_width-1 downto 0);  
 signal mult : mult_type;  
 type ADD_type is array (0 to tap-1) of std_logic_vector(input_width+coef_width-1 downto 0);  
 signal ADD: ADD_type;  
 begin  
 -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects
        shift_reg(0)     <= Din;  
           mult(0)<= Din*coeficient(1);  
           ADD(0)<= Din*coeficient(1);  
           GEN_FIR:  
           for i in 0 to tap-2 generate  
           begin  
                 -- N-bit reg unit  
                 N_bit_Reg_unit : N_bit_Reg generic map (input_width => 8)   
                 port map ( Clk => Clk,   
                                    reset => reset,  
                                    D => shift_reg(i),  
                                    Q => shift_reg(i+1)  
                                    );       
                -- filter multiplication  
                mult(i+1)<= shift_reg(i+1)*coeficient(i+2);  
                -- filter conbinational addition  
                ADD(i+1)<=ADD(i)+mult(i+1);  
           end generate GEN_FIR;  
           Dout <= ADD(tap-1);  
 end Architecture;  

 Library IEEE;  
 USE IEEE.Std_logic_1164.all;  
 
 -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects   
 -- LOW pass FIR filter for ECG Denoising
 -- VHDL project: FIR筛选器的VHDL代码
 -- N-bit Register in VHDL 
 entity N_bit_Reg is   
 generic (  
           input_width          : integer     :=8  
           );  
   port(  
    Q : out std_logic_vector(input_width-1 downto 0);    
    Clk :in std_logic;    
    reset :in std_logic;  
    D :in std_logic_vector(input_width-1 downto 0)    
   );  
 end N_bit_Reg;  
  -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects  
 architecture Behavioral of N_bit_Reg is   
 begin   
      process(Clk,reset)  
      begin   
           if (reset = '1') then  
                Q <= (others => '0');  
        elsif ( rising_edge(Clk) ) then  
                Q <= D;   
       end if;      
      end process;   
 end Behavioral;

冷杉筛选器的TestBench VHDL代码:

 Library IEEE;  
 USE IEEE.Std_logic_1164.all;    
 USE IEEE.numeric_std.all;  
 Use STD.TEXTIO.all;  
  -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects
  -- VHDL project: FIR筛选器的VHDL代码 
  -- Testbench FIR筛选器的VHDL代码 
 entity TB_FIR is  
 end TB_FIR; 
 architecture behaivioral of TB_FIR is  
 Component 冷杉_RI is  
 generic (  
           input_width          : integer     :=8               ; -- set input width by user  
           output_width     : integer     :=16               ; -- set output width by user  
           coef_width          : integer     :=8               ; -- set coefficient width by user  
           tap                    : integer     :=11               ; -- set filter order  
           guard               : integer     :=4)                    ; -- log2(tap)+1  
 port(  
      Din          : in      std_logic_vector(input_width-1 downto 0)     ;     -- input data  
      Clk          : in      std_logic                              ;               -- input clk  
      reset     : in      std_logic                                   ;               -- input reset  
      Dout     : out      std_logic_vector(output_width-1 downto 0))     ;-- output data  
 end Component;  
 signal Din          :      std_logic_vector(7 downto 0)     ;  
 signal Clk          :      std_logic:='0'                              ;  
 signal reset     :      std_logic:='1'                              ;       
 signal output_ready     :      std_logic:='0';                                
 signal Dout          :      std_logic_vector(15 downto 0)     ;  
 signal input: std_logic_vector(7 downto 0);  
 file my_input : TEXT open READ_MODE is "输入101.txt.";  
 file my_output : TEXT open WRITE_MODE is "输出101_Functional_sim.txt.tx.";  
 begin  
   -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects
   FIR_int : FIR_RI  
           generic map(  
                          input_width          =>     8,  
           output_width     =>     16,  
           coef_width          =>     8,  
           tap                 =>     11,  
                          guard               =>     0)  
           port map     (  
                          Din                    => Din,  
                          Clk                    => Clk,  
                          reset               => reset,  
                          Dout               => Dout  
                );  
           process(clk)  
           begin  
           Clk          <= not Clk after 10 ns;  
           end process;  
           reset     <= '1', '1' after 100 ns, '0' after 503 ns; 
     -- fpga4student.com: FPGA projects, VHDL projects, Verilog projects 
     -- Writing output result to output file 
           process(clk)  
           variable my_input_line : LINE;  
           variable input1: integer;  
           begin  
                if reset ='1' then  
                     Din <= (others=> '0');  
                     input <= (others=> '0');  
                     output_ready <= '0';  
                elsif rising_edge(clk) then                      
                     readline(my_input, my_input_line);  
                     read(my_input_line,input1);  
                     Din <= std_logic_vector(to_signed(input1, 8));  
                     --Din<=input(7 downto 0);  
                     output_ready <= '1';  
                end if;  
           end process;                      
           process(clk)  
           variable my_output_line : LINE;  
           variable input1: integer;  
           begin  
                if falling_edge(clk) then  
                     if output_ready ='1' then  
                          write(my_output_line, to_integer(signed(Dout)));  
                          writeline(my_output,my_output_line);  
                     end if;  
                end if;  
           end process;   
                                
 end Architecture; 
在ModelSIM中运行模拟后,滤波后的输出被写入Output.txt进行验证。通过将输出文件与来自MATLAB生成的正确结果进行比较来完成验证。
从MATLAB下载示例输入和输出


推荐的 VHDL项目:
1. 什么是FPGA? VHDL如何在FPGA上使用
2. FIFO内存的VHDL代码
3. 冷杉筛选器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 用于开关尾圈计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11.  完整加法器的VHDL代码
12. VHDL中的PWM发生器,具有可变占空比
13。 ALU的VHDL代码
14。 VHDL代码用于测试台的计数器
15。 16位ALU的VHDL代码
16。 vhdl的变速器设计
17。 VHDL中的非线性查找表实现
18。 VHDL中的加密协处理器设计

19。 Verilog vs vhdl.:通过示例解释
20。 FPGA时钟分频器的VHDL代码
21。 如何生成时钟使能信号而不是创建另一个时钟域
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
26。 使用FSM的停车系统VHDL码
27。 VHDL编码VS软件编程
FPGA Verilog VHDL课程

29评论:

  1. 喜欢在我的arty板上运行这个,但很难获得ADC配置的ADC接口的帮助吗?

    回复删除
    答案
    1. 找到ADC芯片或模块,如MCP3001或PMOD ADC Digilent

      删除
  2. 答案
    1. 这是FIR滤波器的定期实现。它不是通过使用频率采样方法设计的。

      删除
  3. 嘿,
    I'在代码中存在此行的问题:write(my_output_line,to_integer(签名(dout))); ISE中的编制者在说:"写的第二个论点必须具有恒定值". I dont'知道如何解决这个问题。谢谢你的帮助

    回复删除
    答案
    1. 你编译或合成了测试台,即'为什么你有这个错误。您只使用测试台运行模拟。仅合成顶级(FIR_RI)。

      删除
    2. 谢谢你的快速帮助。是的,我've编译了测试台。所以,测试台只需要被写作模块,我认为这是编译的主要模块(顶级)?对不起'm a beginner !!

      删除
  4. 谢谢你的代码,我有一个输入输出和系数宽度的问题。他们为kaiser窗口或如何计算它们??

    回复删除
  5. 嗨loi,
    Mìnhgặplỗinàykhichạy模拟。"无法打开文件input101.txt"
    mìnhđã下载文件输入vềnhưngchưabiếtphảiđặtvàothưmụnnđểđểchươngtrìnhđọcđược
    mìnhcầnphảiđặtvàođâunhỉ?
    cảmơnbạn!

    回复删除
  6. 是否有人使用MATLAB程序使用此过滤器实现,该过滤器提供相同的输出?我尝试使用来自此项目的系数创建FIR滤波器,但我得到完全不同的输出。

    回复删除
    答案
    1. 如果使用此VHDL代码,则将生成与MATLAB相同的输出。

      删除
  7. 它也可以在Xilinx Ise上工作吗?

    回复删除
  8. 嗨范。谢谢代码。

    我有疑问,您已通过文本替补件应用文本输入,然后如何为FPGA应用。

    回复删除
    答案
    1. 在这种情况下,您需要创建一个可合成的模型以将文本文件数据传递给FIR滤波器。

      删除
  9. 它会为Altera Quartus Prime工作吗?如何获取输入文件?

    回复删除
    答案
    1. 当然它有效。上面给出了输入文件。

      删除
  10. Cho EmHỏi,EM复制代码Vào文件.vht,rồi开始编译thìkhôngcólỗigì。 nhưngkhivào文件夹chạy仿真(đãcó文件输入trongđó)thìkhôngthấy文件输出đuôi.txtđu。 Khôngbiếtđâ€đỗlỗigìhaycáchemchạymôphìngbùsai?旺đượcgiúpđỡ。 EMdùngQuartus II 12.1。

    回复删除
    答案
    1. 您必须运行模拟,直到output_ready ='1'因此,写入输出文件。

      删除
  11. 在您提供的链接中,示例输入和输出文件不再存在。我请你再次提供它。

    回复删除
  12. 我确实运行Modelsim模拟器保持'input101.txt'文件文件夹中的文件。我有'输出101_Functional_sim.txt.tx.'文件不一样'output101.txt'您在链接中提供的示例文件。
    值的数量'输出101_Functional_sim.txt.tx.'文件非常小于值的数量'output101.txt'文件。请帮助它。

    回复删除
    答案
    1. 仔细检查您的模拟。验证了代码,所有输出大致与提供的样本匹配。

      删除
  13. 首先感谢您的代码,
    其次,您可以提供示例输入和输出文件("input101.txt" and "输出101_Functional_sim.txt.tx.").

    回复删除
  14. 嗨,我可以在papillo逻辑开始上使用此代码。硬件要求是什么

    回复删除
  15. 您使用哪个过滤器窗口来获取系数

    回复删除
  16. 嗨,我对过滤器的系数有一个问题,你如何获得整数?我得到的问题是,我已经获得了构建的低通滤波器(Butterworh)的系数,这太小了,我如何将这个少数翻译成VHDL?谢谢!

    回复删除

趋势FPGA项目