[問題] Verilog 有號數問題

看板Electronics作者 (偽美少女學園長)時間17年前 (2008/12/21 21:49), 編輯推噓8(8056)
留言64則, 7人參與, 7年前最新討論串1/1
我寫了一個計數器 reg [31:0] B1; 其數值在0~20000間計數。 還有一個有號數 ADC reg signed [13:0] ADC; 其數值在-8192~8192間變化 另外有一個訊號線 wire [15:0] Duty; assign Duty = ADC + 8192; 即使ADC加上一正值變為正數 輸出為PWM output PWM assign PWM = (B1 > Duty); 若計數器 B1 大於 Duty 時,則輸出為High。 但今天遇到一個問題: 若ADC為負值(ex: ADC = -1966)時,輸出訊號出現錯誤的情況,輸出全為Low。 若直接 assign Duty = (-1966)+8192; 則輸出訊號正確。 不知道為甚麼會發生這個情況,可否請板上先進不吝指導。 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.202.20

12/21 23:06, , 1F
需要作 Sign Extension 嗎
12/21 23:06, 1F

12/21 23:48, , 2F
@@ ,不是只要射個threshold嗎
12/21 23:48, 2F

12/22 01:36, , 3F
自己獨立寫個sign值運算的module吧...
12/22 01:36, 3F

12/22 01:37, , 4F
bit-length不同如何運算, 看一下書吧 你是化工系的吧?
12/22 01:37, 4F

12/22 02:21, , 5F
所以 sign 值的運算需要獨立建個 process囉?
12/22 02:21, 5F

12/22 02:21, , 6F
我是電子系的 (掩面)
12/22 02:21, 6F

12/22 02:24, , 7F
對我來說 我幾乎沒有宣告過reg signed這種東西
12/22 02:24, 7F

12/22 02:26, , 8F
有所限制 詳細的只好看書 運算這種東西自己寫個module
12/22 02:26, 8F

12/22 02:26, , 9F
很快 又不太容易錯..
12/22 02:26, 9F

12/22 02:27, , 10F
可是因為我ADC是由輸入讀進來的…是2的補數…
12/22 02:27, 10F

12/22 02:27, , 11F
所以 如果不用signed 這個來放的話 應該會有錯吧?
12/22 02:27, 11F

12/22 02:28, , 12F
只要瞭解1's, 2's, sign magnitude 是如何運算 不難啦..
12/22 02:28, 12F

12/22 02:29, , 13F
告訴你 電路根本看不懂sign是啥小 不過就是人定的
12/22 02:29, 13F

12/22 02:29, , 14F
電路只懂得01010....
12/22 02:29, 14F

12/22 02:29, , 15F
還有想請問 我的寫法 問題是出在於? 什麼觀念沒釐清?
12/22 02:29, 15F

12/22 02:30, , 16F
不管你暫存器存什麼 就是一堆0和1的東西..
12/22 02:30, 16F

12/22 02:31, , 17F
我只覺得有可能出現在sign這種宣告的用法 你使用錯誤而已
12/22 02:31, 17F

12/22 02:32, , 18F
不然你可以試試看 不考慮sign的運算 然後跑跑看...
12/22 02:32, 18F

12/22 02:33, , 19F
不加sign 輸出也不對 畢竟放進去暫存器的代表數值就不同了
12/22 02:33, 19F

12/22 02:34, , 20F
跑模擬運算都很正常 可是接上板子實測就出問題了 = =
12/22 02:34, 20F

12/22 02:36, , 21F
我覺得你還是明白我在說什麼 有些東西是人定的
12/22 02:36, 21F

12/22 02:37, , 22F
我想你的意思是另外建個process 對他做處理後再運算?
12/22 02:37, 22F

12/22 02:39, , 23F
那你明白我說電路只懂0101..的意思嗎?
12/22 02:39, 23F

12/22 02:42, , 24F
了解
12/22 02:42, 24F

12/22 02:42, , 25F
舉個簡單的例子 一般A+B 和 2's的A+B 演算法不同
12/22 02:42, 25F

12/22 02:43, , 26F
我只是不太懂 為甚麼ADC為正數時都正常 負數就出問題
12/22 02:43, 26F

12/22 02:44, , 27F
那麼要如何告訴程式在作二補數運算 就是你的任務
12/22 02:44, 27F

12/22 02:46, , 28F
嗯 我再翻翻書嘗試看看 ^^
12/22 02:46, 28F

12/22 02:48, , 29F
你會用debussy作debug的話 就可以找到答案
12/22 02:48, 29F

12/22 02:49, , 30F
debussy? 那是什麼?
12/22 02:49, 30F

12/22 02:50, , 31F
他可以看到每個時間點電路看到的值
12/22 02:50, 31F

12/22 02:50, , 32F
寫verilog通常不是都用工作站 那是CIC提供的軟體壓
12/22 02:50, 32F

12/22 02:51, , 33F
那是一套輔助設計者debug的工具
12/22 02:51, 33F

12/22 02:52, , 34F
我都只用xilinx ISE 寫一寫就直接在驗證版上 run (汗)
12/22 02:52, 34F

12/22 02:53, , 35F
那你個design flow有點問題 應該都會在NCverilog環境寫好
12/22 02:53, 35F

12/22 02:54, , 36F
在用debussy debug確定function正確 再燒到板子上
12/22 02:54, 36F

12/22 02:55, , 37F
不然程式要是大一點 那你不就debug到死...
12/22 02:55, 37F

12/22 02:58, , 38F
是有用ISE本身的模擬軟體先跑看看時序 可是看起來很正常
12/22 02:58, 38F

12/22 02:58, , 39F
燒進去以後 卻不見得是這麼一回事 = =
12/22 02:58, 39F

12/22 02:59, , 40F
那麼你看得到模擬每個時間點的值嗎?
12/22 02:59, 40F

12/22 03:01, , 41F
因為燒進去需要作合成 合成之後又要再次驗證function
12/22 03:01, 41F

12/22 03:01, , 42F
只能看到輸出入port的 所以我都把reg指定到輸出觀察
12/22 03:01, 42F

12/22 03:01, , 43F
才會有pre-sim這種名詞存在
12/22 03:01, 43F

12/22 03:02, , 44F
合成的時候 也沒看到什麼奇怪的warning
12/22 03:02, 44F

12/22 03:03, , 45F
但是對這個不太懂 所以也不知道到底合成出什麼東西來 (汗)
12/22 03:03, 45F

12/22 03:03, , 46F
所以你略過了RTL-sim這個過程..直接看pre-sim
12/22 03:03, 46F

12/22 03:04, , 47F
嗯 我不知道我的程式到底會做出什麼 RTL
12/22 03:04, 47F

12/22 03:04, , 48F
沒有按照流程走出現問題也是應該的 你應該先確保RTL是OK的
12/22 03:04, 48F

12/22 03:06, , 49F
不先確定RTL的function 只能說你賭得很大唷
12/22 03:06, 49F

12/22 03:06, , 50F
因為不是學這個的 就只看看書本的語法 直接下去寫
12/22 03:06, 50F

12/22 03:07, , 51F
實在是很慚愧 -__-
12/22 03:07, 51F

12/22 03:07, , 52F
RTL指的是你原本未合成的code (應該知道吧!?)
12/22 03:07, 52F

12/22 03:09, , 53F
但是你在訓練verilog 應該是要從tool開始..
12/22 03:09, 53F

12/22 03:11, , 54F
不然你以後找工作 跟你老闆說 你會寫 但你卻不跑RTL-sim
12/22 03:11, 54F

12/22 03:11, , 55F
看來我需要再多花點時間才行 感謝您的指導^^
12/22 03:11, 55F

12/22 03:12, , 56F
你真的需要在多花時間把基礎訓練好 加油
12/22 03:12, 56F

12/22 03:22, , 57F
試試看 assign Duty = {ADC[13],ADC[13],ADC} + 8192;
12/22 03:22, 57F

12/22 22:14, , 58F
感謝樓上提供的方法^^ 順利解決這個問題 謝謝
12/22 22:14, 58F

12/22 22:43, , 59F
其實這個問題就是我說得...Sign Extension
12/22 22:43, 59F

12/23 00:11, , 60F
這個問題就是T大說得..Sign Extension
12/23 00:11, 60F

12/23 00:19, , 61F
還有原Po該謝的應該是T大跟熱心的sassako
12/23 00:19, 61F

12/23 02:07, , 62F
真的也很感謝T大和C大 十分熱心的指導我 謝謝!
12/23 02:07, 62F

11/11 14:54, , 63F
電路只懂得01010. https://daxiv.com
11/11 14:54, 63F

01/04 21:51, 7年前 , 64F
寫verilog通常不 http://yofuk.com
01/04 21:51, 64F
文章代碼(AID): #19JabIud (Electronics)