作者corydoras09 (生而为人,我很抱歉)
看板Electronics
标题[问题] FIR计算验证
时间Thu Dec 28 02:09:01 2017
老师要求我们写VERILOG跑FIR
其中参数是这样(前两位元是正负号&整数0)
parameter b0=8'b00010110; //010110=0.34375
parameter b1=8'b10001001; //001001=0.140625
parameter b2=8'b00000111; //000111=0.109375
parameter b3=8'b10001010;//001010=0.15625
输入我都给8b'00000001=0.015625
第一个输出
timer=1 input=00000001 output=zz0000000000010110 150
0000 . 000000010110 前四位整数,後12位小数
经计算得0.00537109375
Y(n)=X(n)xH(0) = 0.015625x0.34375 = 0.00537109375
这个没问题
但最後一个输出
timer=0 input=00000001 output=zz0000000100110000 600
Y(n)=X(n)xH(0)+X(n-1)H(1)+X(n-2)H(2)+X(n-3)H(3)
=(0.34375-0.14625+0.109375-0.15625)x0.015625
=0.002353515625
但0000 . 000100110000转换後是0.07421875
是我fir算错了吗?
还是程式有问题?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.248.205.224
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1514398147.A.A27.html
※ 编辑: corydoras09 (111.248.205.224), 12/28/2017 02:53:35
1F:推 ptta: 写一个简单的C来比对结果吧! 12/28 13:27
2F:→ htps0763: 你在verilog里面写加减和乘都是把数字当无号数运算,这 12/29 08:17
3F:→ htps0763: 样跟你的设计会不会一样你可以思考一下 12/29 08:17
4F:→ htps0763: 要这样算的话,你的h如果是负数,你就不能只是把signed 12/29 08:24
5F:→ htps0763: bit写成1,要做补数 12/29 08:24
6F:→ corydoras09: 整数部分要做二补数,但整数是0,二补数完还是0啊? 12/29 12:19
7F:→ corydoras09: 还是除了有号数其他要做二补数? 12/29 12:19
8F:→ yuleen123: 要整个8bits一起做二补数吧,定点数小数的运算方式和整 12/29 12:55
9F:→ yuleen123: 数一样 12/29 12:55
11F:→ corydoras09: 虽然我已经交失败报告了XD,不过还是感谢!! 12/29 20:27
12F:推 mmonkeyboyy: @_@ 所以这是作业? 12/29 22:36
算一个小报告吧@@我觉得我好蠢
老师文件里面都说要娶二补数了
我还傻傻的只取整数的二补数(都是零XD
※ 编辑: corydoras09 (111.248.201.167), 12/30/2017 03:14:12
我改了,结果输出变好大?@@
parameter word_size_out=2*word_size_in;
parameter b0=8'b00010110; //010110=0.34375
parameter b1=8'b11110111; //001001=0.140625,负数,做二补数
parameter b2=8'b00000111; //000111=0.109375
parameter b3=8'b11110110;//001010=0.15625,负数,做二补数
输出
timer=0 input=00000000 output=zzxxxxxxxxxxxxxxxx 0
timer=1 input=00000000 output=zz0000000000000000 50
timer=0 input=10000001 output=zz0000000000000000 100
timer=1 input=10000001 output=zz0000101100010110 150
timer=0 input=10000001 output=zz0000101100010110 200
timer=1 input=10000001 output=zz1000011110001101 250
timer=0 input=10000001 output=zz1000011110001101 300
timer=1 input=10000001 output=zz1000101100010100 350
timer=0 input=10000001 output=zz1000101100010100 400
timer=1 input=10000001 output=zz0000011100001010 450
timer=0 input=10000001 output=zz0000011100001010 500
timer=1 input=10000001 output=zz0000011100001010 550
timer=0 input=10000001 output=zz0000011100001010 600
timer=1 input=10000001 output=zz0000011100001010 650
timer=0 input=10000001 output=zz0000011100001010 700
前四位是1符号+3整数,後面12位是小数
0000.011100001010=0.439941406
@@
※ 编辑: corydoras09 (111.248.201.167), 12/30/2017 04:16:38
※ 编辑: corydoras09 (111.248.201.167), 12/30/2017 04:17:49
另外想请教,位什麽输出要+2?
parameter order=3;
parameter word_size_in=8;
parameter word_size_out=2*word_size_in+2;
我都把它杠掉,但刚刚发现,如果输入是负数
输出会变成01开头,是这样所以我加减才有误吗?
如果加回去,哪里开始才是我的小数点的标准位置呢?
加回去後的输入
timer=0 input=00000001 output=000000001000001010 1000
※ 编辑: corydoras09 (111.248.201.167), 12/30/2017 04:35:04