作者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/m.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