51kingst 发表于 2010-10-9 09:16:14

VHDL语言的顺序执行语句,执行速度是如何的,用FPGA实现FIR滤波器的问题

最近在用查表分布法自己写一个FIR滤波器的实现代码,主要是为了下一步嵌入到芯片内部去,为IC的前期验证做一些准备工作,当前的实验芯片用的是EP2S60。
问题1: 做的是50阶的FIR滤波器,使用的是查表和分布的办法,输入信号分成2块,所以每个时钟过来的时候,要进行100次查表,就是相当于根据输入,做100次赋值运算。在一个clk期间,用的是process语句,进行100次查表赋值运算,而process是顺序执行语句,现在担心的第一个问题是在第二个clk到时,这100次赋值还没有完成,出现什么情况。
问题2: 现在主要的想法,用在FPGA上的验证,最终嵌入到IC内部,进行IC设计,是将所要查的表放到ROM中或者RAM中两个方向。如果放到ROM中,则读取速度会比较慢,一个clk的时间,不可能从一个ROM模块中读取100次数据,估计需要做100个ROM模块来分别给100个单元使用。如果上电加载到RAM中的话,那么在一个clk的时间也要读取100次ram,这个时间也是漫长的,占用机器周期非常多,也会影响运算速度。不知道有没有做过FIR滤波器的朋友,提供点经验,实现的时候,是使用RAM读取,还是实现100个ROM单元呢。因为我用altera的FIR的IP核编译过,发现50阶滤波器,它只用了614bit的memory,有点想不通是如何实现这块的。
部分赋值代码

      for i in 24 downto 0 loop
          case tap_data_in(i)(4 downto 1) is
            
               when "0000" => tap_x1(i)<= rom1(i * 16);
               when "0001" => tap_x1(i)<= rom1(i * 16 + 1);
               when "0010" => tap_x1(i)<= rom1(i * 16 + 2);
               when "0011" => tap_x1(i)<= rom1(i * 16 + 3);
               when "0100" => tap_x1(i)<= rom1(i * 16 + 4);
               when "0101" => tap_x1(i)<= rom1(i * 16 + 5);
               when "0110" => tap_x1(i)<= rom1(i * 16 + 6);
               when "0111" => tap_x1(i)<= rom1(i * 16 + 7);
               when "1000" => tap_x1(i)<= rom1(i * 16 + 8);
               when "1001" => tap_x1(i)<= rom1(i * 16 + 9);
               when "1010" => tap_x1(i)<= rom1(i * 16 + 10);
               when "1011" => tap_x1(i)<= rom1(i * 16 + 11);
               when "1100" => tap_x1(i)<= rom1(i * 16 + 12);
               when "1101" => tap_x1(i)<= rom1(i * 16 + 13);
               when "1110" => tap_x1(i)<= rom1(i * 16 + 14);
               when "1111" => tap_x1(i)<= rom1(i * 16 + 15);
            end case;

程序中有4个这种模块,最终才能实现赋值的完成。所以如果是顺序执行语句,比较占用时间。

ssaweee 发表于 2010-10-9 17:02:52

用时序仿真没?
页: [1]
查看完整版本: VHDL语言的顺序执行语句,执行速度是如何的,用FPGA实现FIR滤波器的问题