请教几个关于基于vhdl的fir数字低通滤波器FPGA实现的问题。

mina_conner mina_conner 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
毕设的预设计,也不懂自己为什么要选一个完全不会的领域,老师也没空鸟我的小白问题。。。

编程软件:maxplus2(老师说用这个就行了,可是仿真的功能真的一般啊。。)

fir滤波器要求:11阶数字低通,截至频率位0.25w,用hanming窗实现

根据要求已用matlab计算量化得到的滤波系数为:{1,-6,-15, 28, 144, 213, 144, 28,-15,-6,1}(乘以512后)

问题:1.用vhdl语言编写程序时所用的大都是二进制的算法,逻辑都很基础,但在计算有符号数时结果与matlab的仿真结果差太多,按照逻辑
   应该是没错的,代码会在后面给出,望各位帮我瞄一眼哪出了问题。

2.因为对FPGA完全不熟,在编完有问题的程序后准备先选硬件,请问做这样的滤波器对硬件有什么要求?如果可以的话请稍微详细一点
   推荐一下,不胜感激~

code:
[code=
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;

PACKAGE eight_bit IS
TYPE ARRAY_BYTE IS ARRAY(0 TO 10)OF STD_LOGIC_VECTOR(8 DOWNTO 0);
--设定一个有11个元素的一维数组且每个元素为9位
END eight_bit;

LIBRARY WORK;
USE work.eight_bit.ALL;

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;

ENTITY fir_11_next IS
PORT(CLK : IN STD_LOGIC;---信号时钟源
RESET : IN STD_LOGIC;---异步复位信号
DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--输入8BIT信号
DOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--输出8BIT信号
END fir_11_next;

ARCHITECTURE BEHAV OF fir_11_next IS

SIGNAL TAP : ARRAY_BYTE;--设定内部节点作为移位寄存器
SIGNAL SUM0: STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL SUM1: STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL SUM2: STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL SUM3: STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL SUM4: STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL SUM5: STD_LOGIC_VECTOR(8 DOWNTO 0);--设定系数相同的输入信号和的寄存器
SIGNAL LS0 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL LS1 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL LS2 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL LS3 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL LS4 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL LS5 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL S1 : STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL S2 : STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL S3 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL S4 : STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL S5 : STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL S6 : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL S7 : STD_LOGIC_VECTOR(12 DOWNTO 0);
SIGNAL S8 : STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL S9 : STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL S10 : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL S11 : STD_LOGIC_VECTOR(12 DOWNTO 0);
SIGNAL S12 : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL S13 : STD_LOGIC_VECTOR(14 DOWNTO 0);
SIGNAL S14 : STD_LOGIC_VECTOR(12 DOWNTO 0);
SIGNAL S15 : STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL D0 : STD_LOGIC_VECTOR(16 DOWNTO 0);
SIGNAL D1 : STD_LOGIC_VECTOR(16 DOWNTO 0);
SIGNAL D2 : STD_LOGIC_VECTOR(16 DOWNTO 0);
SIGNAL D3 : STD_LOGIC_VECTOR(16 DOWNTO 0);
SIGNAL D4 : STD_LOGIC_VECTOR(16 DOWNTO 0);
SIGNAL D5 : STD_LOGIC_VECTOR(16 DOWNTO 0);
SIGNAL D6 : STD_LOGIC_VECTOR(17 DOWNTO 0);


BEGIN
DOUT<=D6(16 DOWNTO 9);--去掉最高位截取8位输出,即除以当初量化值512

PROCESS(CLK)
BEGIN
IF CLK='1' AND CLK'EVENT THEN

--将相同系数的输入信号相加
--为防止溢出LS信号比TAP信号多一位

LS0<=TAP(0)+TAP(10);
SUM0<=LS0(8 DOWNTO 0);--去掉溢出位取低九位,SUM(8)为扩展后的符号位
LS1<=TAP(1)+TAP(9);
SUM1<=LS1(8 DOWNTO 0);
LS2<=TAP(2)+TAP(8);
SUM2<=LS2(8 DOWNTO 0);
LS3<=TAP(3)+TAP(7);
SUM3<=LS3(8 DOWNTO 0);
LS4<=TAP(4)+TAP(6);
SUM4<=LS4(8 DOWNTO 0);
LS5<=TAP(5);
SUM5<=LS5(8 DOWNTO 0);
FOR I IN 10 DOWNTO 1 LOOP---利用loop循环完成信号移位
TAP(I)<=TAP(I-1);
END LOOP;

IF RESET='0' THEN--复位信号为0
TAP(0)<=(DIN(7)&DIN);--将输入信号的值赋值给第一个寄存器
--高位符号位扩展防止溢出

ELSE
TAP(0)<="000000000";
END IF;
END IF;
END PROCESS;

PROCESS(CLK,DIN)
BEGIN
IF CLK='1' AND CLK'EVENT THEN

S1<=SUM0;--与系数1相乘
D0<=(SUM0(8)&SUM0(8)&SUM0(8)&SUM0(8)&SUM0(8)&SUM0(8)&SUM0(8)&SUM0(8)&S1);

S2<=(SUM1&"00");--向左移2位完成与4相乘
S3<=(SUM1&'0');--向左移1位完成与2相乘
D1<=(SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&S2)
   +(SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&SUM1(8)&S3);
--高位补符号并累加完成与系数6相乘并存入17位
S4<=(SUM2&"000");--向左移3位与8相乘
S5<=(SUM2&"00");--向左移2位与4相乘
S6<=(SUM2&'0');--向左移1位与2相乘
D2<=(SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&S4)
   +(SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&S5)
    +(SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&S6)
  +(SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2(8)&SUM2);
     --实现与系数15相乘并存入17位

S7<=(SUM3&"0000");--与16相乘
S8<=(SUM3&"000");--与8相乘
S9<=(SUM3&"00");--与4相乘
D3<=(SUM3(8)&SUM3(8)&SUM3(8)&SUM3(8)&S7)
+(SUM3(8)&SUM3(8)&SUM3(8)&SUM3(8)&SUM3(8)&S8)
+(SUM3(8)&SUM3(8)&SUM3(8)&SUM3(8)&SUM3(8)&SUM3(8)&S9);
--实现与系数28相乘并存入17位

S10<=(SUM4&"0000000");--与128相乘
S11<=(SUM4&"0000");--与16相乘
D4<=(SUM4(8)&S10)
+(SUM4(8)&SUM4(8)&SUM4(8)&SUM4(8)&S11);--实现与系数144相乘并存入17位

S12<=(SUM5&"0000000");--与128相乘
S13<=(SUM5&"000000");--与64相乘
S14<=(SUM5&"0000");--与16相乘
S15<=(SUM5&"00");--与4相乘
D5<=(SUM5(8)&S12)
+(SUM5(8)&SUM5(8)&S13)
+(SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&S14)
+(SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&S15)
+(SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5(8)&SUM5);--实现TAP(5)与系数213相乘并存入17位

D6<=D0+D3+D4+D5-D1-D2;--实现所有处理后的信号累加
END IF;
END PROCESS;

END BEHAV;][/code]

希望能够帮帮我,问题太小白资料都没有提到,但我是真搞不明白的
...全文

相关推荐

FPGA实现低通滤波器(内含完整的FPGA代码)

FPGA因其灵活性和高速并行处理能力,常被用于实现数字信号处理任务。FPGA实现低通滤波器通常涉及到以下几个关键知识点:1.

童话WN

基于VHDL的FIR低通滤波器设计与实现

有限冲激响应(FIR)低通滤波器是一种线性时不变系统,其输出仅依赖于当前及过去有限个输入样本。其差分方程为:其中 $ h[k] $ 为滤波器系数,$ N $ 为滤波器阶数。FIR滤波器具有严格线性相位特性,保证信号在通带内无相位失真,适用于对相位敏感的应用场景。FIR滤波器的性能通常通过一组标准化的技术指标进行描述,这些指标不仅决定了滤波器能否满足特定应用场景的需求,也直接影响后续系数生成和硬件实现方式的选择。主要性能指标包括通带截止频率、过渡带宽、阻带衰减、通带波纹以及相位特性等。

青妍

FPGA数字信号处理实战:Quartus FIR IP核应用

数字信号处理(Digital Signal Processing,DSP)在现代信息技术中扮演着极为重要的角色。随着计算能力的提升和算法的优化,DSP在FPGA(Field-Programmable Gate Array,现场可编程门阵列)上的应用日益广泛。FPGA是利用硬件描述语言(HDL)实现可重构的硬件电路,特别适用于需要高速、并行处理能力的数字信号处理任务。FPGA的数字信号处理应用场景包括但不限于:通信系统中的信号调制解调、图像和视频处理、雷达信号处理等。

love彤彤

从Simulink模型自动生成VHDL代码——基于DSP Builder的FPGA设计流程

实例分析:7阶FIR数字低通滤波器的设计本文介绍了一个具体的例子,即使用上述设计流程实现一个7阶FIR数字低通滤波器。

yangzhangang

超级详细的FIR数字滤波器制作文档

总结,本报告详细阐述了从MATLAB设计到VHDL实现的FIR数字滤波器流程,包括滤波器系数计算、VHDL模块设计和FPGA综合,这对于理解数字信号处理和FPGA应用具有重要的实践意义。

conanandai100
评论 2
收藏 已收藏
分享
返回顶部
mina_conner
非技术区 1,076 成员 6,258 内容