毕设的预设计,也不懂自己为什么要选一个完全不会的领域,老师也没空鸟我的小白问题。。。
编程软件: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]
希望能够帮帮我,问题太小白资料都没有提到,但我是真搞不明白的