看板 Electronics 關於我們 聯絡資訊
老師要求我們寫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://www.ptt.cc/bbs/Electronics/M.1514398147.A.A27.html ※ 編輯: corydoras09 (111.248.205.224), 12/28/2017 02:53:35
ptta: 寫一個簡單的C來比對結果吧! 12/28 13:27
htps0763: 你在verilog裡面寫加減和乘都是把數字當無號數運算,這 12/29 08:17
htps0763: 樣跟你的設計會不會一樣你可以思考一下 12/29 08:17
htps0763: 要這樣算的話,你的h如果是負數,你就不能只是把signed 12/29 08:24
htps0763: bit寫成1,要做補數 12/29 08:24
corydoras09: 整數部分要做二補數,但整數是0,二補數完還是0啊? 12/29 12:19
corydoras09: 還是除了有號數其他要做二補數? 12/29 12:19
yuleen123: 要整個8bits一起做二補數吧,定點數小數的運算方式和整 12/29 12:55
yuleen123: 數一樣 12/29 12:55
yuleen123: https://goo.gl/RF2TR6 12/29 12:58
corydoras09: 雖然我已經交失敗報告了XD,不過還是感謝!! 12/29 20:27
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