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

mina_conner 2018-11-10 03:13:29
毕设的预设计,也不懂自己为什么要选一个完全不会的领域,老师也没空鸟我的小白问题。。。

编程软件: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]

希望能够帮帮我,问题太小白资料都没有提到,但我是真搞不明白的
...全文
68 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mina_conner 2018-11-10
  • 打赏
  • 举报
回复
你好,谢谢给的资料,我想问一下在第一篇中提到的将滤波后的数据用matlab仿真,其中有fpga仿真结果的图,那个是怎么实现在matlab中画出FPGA的仿真图,他们的数据是怎么互相调用的呢?我只会写用matlab生成的滤波系数来仿真过滤有噪声的信号,没办法把FPGA的仿真结果在matlab里搞出来,是MAXPLUS2与matlab可以联合仿真吗?
另外,这个贴不能单独回复人吗?
zgl7903 2018-11-10
  • 打赏
  • 举报
回复

1,068

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧