在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4126|回复: 10

[求助] 以下代码能否实现比较大小,并且乘4096的功能。谢谢

[复制链接]
发表于 2011-3-22 15:00:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位大侠:请看如下问题

output [14:0] cound_add;
    input [10:0] VA;
   wire sign = VA[9:0] >10'b1000000000 ?1'b1: 1'b0;
   wire [9:0] VA_TEMP = sign ? 0: (10'b1000000000 - VA[9:0]);

  assign count_add_temp[14:0] = {3'b0,VA_TEMP,2'b0};

always @ (posedge mclk or negedge por_rstn) begin
    if (!por_rstn)
           count_add <=#dly 15'd0;
    else
            count_add <=#dly count_add_temp;
    end
我的想法是: 当VA<0.5时候,count_add = (0.5-VA)*4096
问: (1)上面代码能否实现这个功能,
  (2)上面代码综合需要加什么条件吗?
 楼主| 发表于 2011-3-22 15:40:25 | 显示全部楼层
大家能帮助下吗? 关于这个问题,我很困惑,谢谢
 楼主| 发表于 2011-3-23 09:26:22 | 显示全部楼层
请大家不吝赐教,我是新手,谢谢,很急。
发表于 2011-3-23 12:42:03 | 显示全部楼层
你都问过一次了,行不行自己仿真一下不就知道了
 楼主| 发表于 2011-3-23 12:44:23 | 显示全部楼层
我是做模拟的,版主,数字根本不懂,请帮助,谢谢
发表于 2011-3-23 15:03:56 | 显示全部楼层
没看到*4096, 乘4还差不多
 楼主| 发表于 2011-3-23 21:56:50 | 显示全部楼层
*4096并且取整,有个高人分析:上面代码不能实现和0.5的比较,但是可以实现*4096并且取整,我还是很疑惑,希望大家讨论下,这是个实际项目中,一小段代码,
发表于 2011-3-24 10:58:06 | 显示全部楼层
output [14:0] cound_add;
    input [10:0] VA;
   wire sign = VA[9:0] >10'b1000000000 ?1'b1: 1'b0;
   wire [9:0] VA_TEMP = sign ? 0: (10'b1000000000 - VA[9:0]);

  assign count_add_temp[14:0] = {3'b0,VA_TEMP,2'b0};

always @ (posedge mclk or negedge por_rstn) begin
    if (!por_rstn)
           count_add <=#dly 15'd0;
    else
            count_add <=#dly count_add_temp;
    end
我的想法是: 当VA<0.5时候,count_add = (0.5-VA)*4096
问: (1)上面代码能否实现这个功能,
  (2)上面代码综合需要加什么条件吗?

我来分析你这一段代码哈,对不对欢迎讨论。
根据你的代码来分析的话,我想VA[10:0]这个数字,应该是这样的:
[10]bit是整数位,表示1点几,VA[9:0]是小数部分,表示0点几。这样的话VA的值应该是在>=1.0到<2之间。但是后面完全没有看到VA[10]有用。所以我们暂且不管它,那么VA[9:0]应该是:0.0<=VA[9:0]<1.0之间的范围。也就是说VA[9:0]全部是小数部分。

wire sign = VA[9:0] >10'b1000000000 ?1'b1: 1'b0;
这一行是在比较到底VA[9:0]和0.5之间谁大,应该是为下一行的计算准备。

wire [9:0] VA_TEMP = sign ? 0: (10'b1000000000 - VA[9:0]);
这一行通过利用上次比较VA[9:0]和0.5的结果,如果sign=1,也就是说VA[9:0]>0.5的话,输出VA_TEMP为0。反之,如果sign=0,也就是说VA[9:0] <= 0.5,那么VA_TEMP=0.5-VA[9:0],得到差值。

assign count_add_temp[14:0] = {3'b0,VA_TEMP,2'b0};
这个是做最后的计算了,下面的时序逻辑很简单,一级寄存器。所以就不做功能分析了。功能上,这已经是最后一行代码了。这个最后的计算,将刚才得到的VA_TEMP[9:0],后面接上2个bit0,然后赋值给输出count_add_temp[14:0]。
有个前提,输出的count_add_temp[14:0]所有的bit位都是整数(没有小数),如果这个前提正确的话。那么看看count_add_temp[14:0] = {VA_TEMP,2'b0} (高位的3‘b0不分析了,因为不影响结果) 代表什么意思呢。
首先VA_TEMP[9:0]中所有的10个bit都是小数(刚才上面分析过了),假设这个值转化成10进制下等于0.123好了。因为二进制没有小数点,所以想想一下这样的计算:
A = 0.123,假如你把小数点抹掉,那么A等于多少?是不是A=123,是不是相当于乘以1000了?
以此类推,如果count_add_temp[14:0] = VA_TEMP[9:0],这是不是代表着count_add_temp[14:0] = 小数下的VA_TEMP[9:0]乘以2的10次方(2**10),对不对?因为输出是整数,所以小数点抹掉了,对吧。那么这时候count_add_temp[14:0] = VA_TEMP[9:0] * (2**10),也就是乘以1024了,对不对?
好了,再在VA_TEMP[9:0]后面补上2'b0(两个bit0),是不是又相当于乘以4了?

综上所述:
assign count_add_temp[14:0] = {3'b0,VA_TEMP,2'b0};
这句话相当于把VA_TEMP乘以4096了。

所以,现在回答你的两个问题:
问: (1)上面代码能否实现这个功能,
  (2)上面代码综合需要加什么条件吗?
答: 1.  上面的代码可以实现如果VA<0.5的话,用输出=(0.5-VA)*4096的功能。
     2. 综合条件可以这样:输入delay,时钟mclk的频率、抖动等,输出delay,输出负载。应该可以了。

我想,分析的应该没错吧。
发表于 2011-3-24 17:03:00 | 显示全部楼层
分析的很不错!
 楼主| 发表于 2011-3-25 13:22:54 | 显示全部楼层
真是有热心人,多谢了,分析的很透彻,谢谢了。只因为本人是做模拟的,数字只是了解,如果大家有模拟方面的问题,我可以参与讨论。再次感谢ACGOAL.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-29 15:02 , Processed in 0.022519 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表