搜索
bottom↓
回复: 7

求解Verilog中二进制计数和十进制计数用于算术运算的区别?(找到问题所在了,思考算法中

[复制链接]

出0入0汤圆

发表于 2010-5-30 00:32:32 | 显示全部楼层 |阅读模式
今天在搞频率计的时候发发现一个问题:部分原程序如下:
module Fxprocess (Fx_count,Fs_count,Fh_count,Fx_valu,Fx_Duty);
input  [31:0] Fx_count;
input  [31:0] Fs_count;
input  [31:0] Fh_count;
output [31:0] Fx_valu;
output [7:0]  Fx_Duty;
parameter Fs = 50_000_000;  //板载标准频率50MHz
reg [31:0] Fx_valu;
reg [7:0] Fx_Duty;
always @(Fx_count or Fs_count or Fh_count)
begin
  Fx_valu <= Fs/Fs_count*Fx_count;
  Fx_Duty <= Fh_count/Fs_count*100;
end
endmodule
1)、在之前的计数模块里面我是设计了一个“十进制计数器”来计算Fs_count、Fx_count、Fh_count
假设我之前的计算模块得到的十进制值分别是50_000_000、1000、25_000_000
经过  Fx_valu <= Fs/Fs_count*Fx_count;
         Fx_Duty <= Fh_count/Fs_count*100;
计算后输出居然是都是0,真是郁闷啊。

2)、要是在之前的计数模块里面我是设计了一个“二进制计数器”来计算Fs_count、Fx_count、Fh_count
32位二进制计数器
always @(posedge Clk or negedge CLR)
         begin
                if(! CLR)
                        Data_out = 0;
                else if(EN)
                  begin       
                        if(Data_out==MAX)
                                Data_out = MAX;
                        else
                                Data_out = Data_out + 1;
                  end
          end


经过   
Fx_valu <= Fs/Fs_count*Fx_count;
计算后就可以得出正确的输出。
不知是什么原因,请高手指教!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-5-30 03:52:33 | 显示全部楼层
呃,咱先不说别的。
在硬件里面,除法除了2的幂次可以综合以外,任意数的除法是不能综合的。

出0入0汤圆

发表于 2010-5-30 06:17:31 | 显示全部楼层
呵呵,兽哥偏激了。Altera的FPGA的除法,底层多为自动调用lpm_divde来实现的。只不过除以2的幂,移位即可;而其他除数的情况则没有研究,但是可以综合,耗费资源多些而已。



楼主的代码有点问题,时序always块内阻塞赋值,且不知一时多少锁存器生成,不错才怪。有趣的是,楼主的组合always块使用非阻塞赋值。正好弄反了。

出0入0汤圆

 楼主| 发表于 2010-5-30 10:13:17 | 显示全部楼层
回复【2楼】tear086 .COM 缺氧
-----------------------------------------------------------------------

小弟不才,初学,还未深究。多谢指教

出0入0汤圆

 楼主| 发表于 2010-5-30 10:15:55 | 显示全部楼层
耗费的资源还真不是一般的多啊,就这一句:Fx_valu <= Fs/Fs_count*Fx_count; 我测试了解大概得耗费1200的逻辑单元。衰

出0入0汤圆

发表于 2010-5-30 14:52:52 | 显示全部楼层
回复【2楼】tear086  .COM 缺氧
-----------------------------------------------------------------------

XILINX的ISE是不行的。。。

回复【5楼】andriy  
-----------------------------------------------------------------------

所以说不要没事在verilog里写除法。实际上乘法,加法之类的都最好用mux复用

出0入0汤圆

 楼主| 发表于 2010-5-30 23:45:43 | 显示全部楼层
纠结了一天也没什么结果,灵光一闪想去以前上位机原理的时候有讲过BCD码调整指令,翻书看了之后发现了问题所在
下面举例说明:
按照常识 7+6=13 是吧 用BCD码表示呢
  0111(BCD码7)
+ 0110(BCD码6)
------------
  1101 D的二进制数(13)

把4位的二进制数1101送数码管译码模块,无法实现译码输出的只能是0,这也就正好对应了上面的疑惑输出全是0.
解决办法:
  0111(BCD码7)
+ 0110(BCD码6)
------------
  1101 D的二进制数(13)二进制值大于了9接下来进行加6处理
+ 0110(6)
-------------
1 0011
用8位表示上面的计算结果就是0001 0011
接下来高四位低四位分别送数码管显示就可以译码输出13了。
问题找到了,目前要解决的是设计一种算法实现把计算结果转成BCD码。继续纠结种···
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-1 22:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表