求解Verilog中二进制计数和十进制计数用于算术运算的区别?(找到问题所在了,思考算法中
今天在搞频率计的时候发发现一个问题:部分原程序如下:module Fxprocess (Fx_count,Fs_count,Fh_count,Fx_valu,Fx_Duty);
input Fx_count;
input Fs_count;
input Fh_count;
output Fx_valu;
output Fx_Duty;
parameter Fs = 50_000_000;//板载标准频率50MHz
reg Fx_valu;
reg 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;
计算后就可以得出正确的输出。
不知是什么原因,请高手指教! 呃,咱先不说别的。
在硬件里面,除法除了2的幂次可以综合以外,任意数的除法是不能综合的。 呵呵,兽哥偏激了。Altera的FPGA的除法,底层多为自动调用lpm_divde来实现的。只不过除以2的幂,移位即可;而其他除数的情况则没有研究,但是可以综合,耗费资源多些而已。
http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_558222.png
楼主的代码有点问题,时序always块内阻塞赋值,且不知一时多少锁存器生成,不错才怪。有趣的是,楼主的组合always块使用非阻塞赋值。正好弄反了。 回复【2楼】tear086 .COM 缺氧
-----------------------------------------------------------------------
小弟不才,初学,还未深究。多谢指教 耗费的资源还真不是一般的多啊,就这一句:Fx_valu <= Fs/Fs_count*Fx_count; 我测试了解大概得耗费1200的逻辑单元。衰 回复【2楼】tear086.COM 缺氧
-----------------------------------------------------------------------
XILINX的ISE是不行的。。。
回复【5楼】andriy
-----------------------------------------------------------------------
所以说不要没事在verilog里写除法。实际上乘法,加法之类的都最好用mux复用 纠结了一天也没什么结果,灵光一闪想去以前上位机原理的时候有讲过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码。继续纠结种···
页:
[1]