[問題] verilog的問題Orz

看板Electronics作者 (heymei)時間14年前 (2011/08/26 21:02), 編輯推噓6(6014)
留言20則, 5人參與, 最新討論串1/1
小弟目前在做積分器與微分器。 餵入的資料為: IN_A,IN_B,IN_C,IN_D,SHIFT,IN_X1,IN_X2,MODE 餵出資料:OUT 基本上積分器微分器有四個選擇依SHIFT為定,其四種選擇指示其方程式的係數前後有別 ex: A B C D , B C D A , C D A B , D A B C [未知數x我就省略了] 依給定的SHIFT進入特定的一個選擇後再依給定的MODE執行積分器或者微分器。 IN_A,...,IN_D為方程式的係數,IN_X1,IN_X2為上下限,積分微分的方程式都以固定。 主要分兩個module : 1. PID.v 2. integral_diff.v //PID.v `include "integral_diff.v" module PID(OUT,IN_A,IN_B,IN_C,IN_D,SHIFT,IN_X1,IN_X2,MODE); input MODE; input signed [4:0] IN_A,IN_B,IN_C,IN_D,IN_X1,IN_X2; input [4:0] SHIFT; output signed [31:0] OUT; wire signed [19:0] ADD; assign ADD[19:15]=IN_A[4:0]; assign ADD[14:10]=IN_B[4:0]; assign ADD[9:5]=IN_C[4:0]; assign ADD[4:0]=IN_D[4:0]; integral_diff result(OUT[31:0],ADD[19:0],SHIFT[4:0],IN_X1[4:0],IN_X2[4:0],MODE); endmodule //主要宣告一個wire ADD來裝進來的係數A,B,C,D再用shift的功能去移動係數 //integral_diff.v module integral_diff(OUT,ADD_NEW,SHIFT,X1,X2,MO); input MO; input signed [4:0] X1,X2; input [4:0] SHIFT; input signed [19:0] ADD_NEW; output signed [31:0] OUT; reg signed [4:0] A,B,C,D; reg signed [19:0] TEMP; reg signed [31:0] TEMP1; reg signed [31:0] TEMP2; reg signed [31:0] OUT; wire [1:0]coef; assign coef={SHIFT[1],SHIFT[0]}; always@(*) begin if(coef==2'b00) begin if(MO==1'b0) begin TEMP = ADD_NEW ; A[4:0]=TEMP[19:15]; B[4:0]=TEMP[14:10]; C[4:0]=TEMP[9:5]; D[4:0]=TEMP[4:0]; TEMP1 = 25*A*(X2*X2*X2*X2 - X1*X1*X1*X1); TEMP1 = TEMP1 >> 2; TEMP2 = 5*C*(X2*X2-X1*X1) ; TEMP2 = TEMP2 >> 1; OUT = TEMP1 + TEMP2 + D*(X2-X1); end else begin TEMP = ADD_NEW ; A[4:0]=TEMP[19:15]; B[4:0]=TEMP[14:10]; C[4:0]=TEMP[9:5]; D[4:0]=TEMP[4:0]; OUT = 3*A*X2*X2 + 2*B*X2 + C; end end else if(coef==2'b01) begin if(MO==1'b0) begin D[4:0]=ADD_NEW[19:15]; TEMP = ADD_NEW << 5; A[4:0]=TEMP[19:15]; B[4:0]=TEMP[14:10]; C[4:0]=TEMP[9:5]; TEMP1 = 0; TEMP1 = 25*A*(X2*X2*X2*X2 - X1*X1*X1*X1); TEMP1=TEMP1 >> 2; TEMP2 = 5*C*(X2*X2-X1*X1); TEMP2=TEMP2 >> 1; OUT = TEMP1 + TEMP2 + D*(X2-X1); end else begin D[4:0]=ADD_NEW[19:15]; TEMP = ADD_NEW << 5; A[4:0]=TEMP[19:15]; B[4:0]=TEMP[14:10]; C[4:0]=TEMP[9:5]; OUT = 3*A*X2*X2 + 2*B*X2 + C; end ......以下略 我沒demo過,後來我用nWave去檢查各各參數,我發現係數都對,shift後的數值 都有裝到應該有的reg,但temp1,temp2,out都錯 我把temp1 = 0 ; nWave還是跑出707200(十進位)不管我怎麼更改temp1的形式 都一樣式707200..原本我把計算都寫成一行,但學長說分開處理看看... 但還是不行...只好求助各位大大了QQ 熱心者小弟捐獻1000p幣.. 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.234.185

08/26 21:36, , 1F
我有個小小的建議 你可以寫一下註解 傳成一個
08/26 21:36, 1F

08/26 21:36, , 2F
文字檔再上傳到空間 我想這樣大家會容易幫你
08/26 21:36, 2F

08/26 21:37, , 3F
你也更容易了解自己的程式哦 :)
08/26 21:37, 3F

08/26 21:40, , 4F
我這邊可以看到會有疑問的就是 你有給一些東西初值嗎?
08/26 21:40, 4F

08/26 21:42, , 5F
你高位的bit好像沒有用到 但OUTPUT卻有
08/26 21:42, 5F

08/26 21:42, , 6F
這可能就是一個問題 你可以把output展開來看就得解:)
08/26 21:42, 6F

08/26 21:57, , 7F
m大,什麼叫高位bit沒有用到,output卻有,我不瞭解>"<
08/26 21:57, 7F

08/26 22:01, , 8F
你的temp out 32bits 可是在運算中不一定都有用到
08/26 22:01, 8F

08/26 22:01, , 9F
但你卻相加了他們 (也沒有指定它們的值) 這樣很有機會
08/26 22:01, 9F

08/26 22:02, , 10F
會產生錯誤的值 你可以把把一部一部分開模擬
08/26 22:02, 10F

08/26 22:02, , 11F
就可以檢查到這個錯誤啦 :)
08/26 22:02, 11F

08/26 22:08, , 12F
不過我提出這個也只是可能錯誤@_@羅輯就沒有仔細看了
08/26 22:08, 12F

08/26 22:09, , 13F
你的OUT可以再展開看bit的data看看
08/26 22:09, 13F

08/27 00:26, , 14F
先搞清楚硬體要長什麼樣,不然你可能比較適合寫C..
08/27 00:26, 14F

09/05 22:58, , 15F
你的temp1 temp2 ...都會是latch 有if 沒有else
09/05 22:58, 15F

09/05 22:59, , 16F
記得給個default值
09/05 22:59, 16F

09/05 23:03, , 17F
宣告signed的意義是?數位就只有0和1 其他都是人規定的!
09/05 23:03, 17F

09/05 23:05, , 18F
運算的範圍由多少bit決定 要自己考慮overflow的問題
09/05 23:05, 18F

08/13 19:15, , 19F
我有個小小的建議 你 https://muxiv.com
08/13 19:15, 19F

09/17 23:09, , 20F
記得給個default https://daxiv.com
09/17 23:09, 20F
文章代碼(AID): #1ELvbrn7 (Electronics)