作者peliuya (伪美少女学园长)
看板Electronics
标题[问题] Verilog 有号数问题
时间Sun Dec 21 21:49:05 2008
我写了一个计数器
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
1F:推 TroyLee:需要作 Sign Extension 吗 12/21 23:06
2F:推 keterwang:@@ ,不是只要射个threshold吗 12/21 23:48
3F:推 sasako:自己独立写个sign值运算的module吧... 12/22 01:36
4F:→ colinshih:bit-length不同如何运算, 看一下书吧 你是化工系的吧? 12/22 01:37
5F:→ peliuya:所以 sign 值的运算需要独立建个 process罗? 12/22 02:21
6F:→ peliuya:我是电子系的 (掩面) 12/22 02:21
7F:→ sasako:对我来说 我几乎没有宣告过reg signed这种东西 12/22 02:24
8F:→ sasako:有所限制 详细的只好看书 运算这种东西自己写个module 12/22 02:26
9F:→ sasako:很快 又不太容易错.. 12/22 02:26
10F:→ peliuya:可是因为我ADC是由输入读进来的…是2的补数… 12/22 02:27
11F:→ peliuya:所以 如果不用signed 这个来放的话 应该会有错吧? 12/22 02:27
12F:→ sasako:只要了解1's, 2's, sign magnitude 是如何运算 不难啦.. 12/22 02:28
13F:→ sasako:告诉你 电路根本看不懂sign是啥小 不过就是人定的 12/22 02:29
14F:→ sasako:电路只懂得01010.... 12/22 02:29
15F:→ peliuya:还有想请问 我的写法 问题是出在於? 什麽观念没厘清? 12/22 02:29
16F:→ sasako:不管你暂存器存什麽 就是一堆0和1的东西.. 12/22 02:30
17F:→ sasako:我只觉得有可能出现在sign这种宣告的用法 你使用错误而已 12/22 02:31
18F:→ sasako:不然你可以试试看 不考虑sign的运算 然後跑跑看... 12/22 02:32
19F:→ peliuya:不加sign 输出也不对 毕竟放进去暂存器的代表数值就不同了 12/22 02:33
20F:→ peliuya:跑模拟运算都很正常 可是接上板子实测就出问题了 = = 12/22 02:34
21F:→ sasako:我觉得你还是明白我在说什麽 有些东西是人定的 12/22 02:36
22F:→ peliuya:我想你的意思是另外建个process 对他做处理後再运算? 12/22 02:37
23F:推 sasako:那你明白我说电路只懂0101..的意思吗? 12/22 02:39
24F:→ peliuya:了解 12/22 02:42
25F:→ sasako:举个简单的例子 一般A+B 和 2's的A+B 演算法不同 12/22 02:42
26F:→ peliuya:我只是不太懂 为甚麽ADC为正数时都正常 负数就出问题 12/22 02:43
27F:→ sasako:那麽要如何告诉程式在作二补数运算 就是你的任务 12/22 02:44
28F:→ peliuya:嗯 我再翻翻书尝试看看 ^^ 12/22 02:46
29F:→ sasako:你会用debussy作debug的话 就可以找到答案 12/22 02:48
30F:→ peliuya:debussy? 那是什麽? 12/22 02:49
31F:→ sasako:他可以看到每个时间点电路看到的值 12/22 02:50
32F:→ sasako:写verilog通常不是都用工作站 那是CIC提供的软体压 12/22 02:50
33F:→ sasako:那是一套辅助设计者debug的工具 12/22 02:51
34F:→ peliuya:我都只用xilinx ISE 写一写就直接在验证版上 run (汗) 12/22 02:52
35F:→ sasako:那你个design flow有点问题 应该都会在NCverilog环境写好 12/22 02:53
36F:→ sasako:在用debussy debug确定function正确 再烧到板子上 12/22 02:54
37F:→ sasako:不然程式要是大一点 那你不就debug到死... 12/22 02:55
38F:→ peliuya:是有用ISE本身的模拟软体先跑看看时序 可是看起来很正常 12/22 02:58
39F:→ peliuya:烧进去以後 却不见得是这麽一回事 = = 12/22 02:58
40F:→ sasako:那麽你看得到模拟每个时间点的值吗? 12/22 02:59
41F:→ sasako:因为烧进去需要作合成 合成之後又要再次验证function 12/22 03:01
42F:→ peliuya:只能看到输出入port的 所以我都把reg指定到输出观察 12/22 03:01
43F:→ sasako:才会有pre-sim这种名词存在 12/22 03:01
44F:→ peliuya:合成的时候 也没看到什麽奇怪的warning 12/22 03:02
45F:→ peliuya:但是对这个不太懂 所以也不知道到底合成出什麽东西来 (汗) 12/22 03:03
46F:→ sasako:所以你略过了RTL-sim这个过程..直接看pre-sim 12/22 03:03
47F:→ peliuya:嗯 我不知道我的程式到底会做出什麽 RTL 12/22 03:04
48F:→ sasako:没有按照流程走出现问题也是应该的 你应该先确保RTL是OK的 12/22 03:04
49F:→ sasako:不先确定RTL的function 只能说你赌得很大唷 12/22 03:06
50F:→ peliuya:因为不是学这个的 就只看看书本的语法 直接下去写 12/22 03:06
51F:→ peliuya:实在是很惭愧 -__- 12/22 03:07
52F:→ sasako:RTL指的是你原本未合成的code (应该知道吧!?) 12/22 03:07
53F:→ sasako:但是你在训练verilog 应该是要从tool开始.. 12/22 03:09
54F:→ sasako:不然你以後找工作 跟你老板说 你会写 但你却不跑RTL-sim 12/22 03:11
55F:→ peliuya:看来我需要再多花点时间才行 感谢您的指导^^ 12/22 03:11
56F:→ sasako:你真的需要在多花时间把基础训练好 加油 12/22 03:12
57F:推 ksmrt0123:试试看 assign Duty = {ADC[13],ADC[13],ADC} + 8192; 12/22 03:22
58F:→ peliuya:感谢楼上提供的方法^^ 顺利解决这个问题 谢谢 12/22 22:14
59F:推 TroyLee:其实这个问题就是我说得...Sign Extension 12/22 22:43
60F:推 ksmrt0123: 这个问题就是T大说得..Sign Extension 12/23 00:11
61F:推 ksmrt0123:还有原Po该谢的应该是T大跟热心的sassako 12/23 00:19
62F:→ peliuya:真的也很感谢T大和C大 十分热心的指导我 谢谢! 12/23 02:07