搜索
bottom↓
回复: 7

↓↓ 求思路,想不通...VHDL新手帖 (续)

[复制链接]

出0入0汤圆

发表于 2011-5-21 11:15:27 | 显示全部楼层 |阅读模式
假设:
按键A控制ABC数码管显示1~100
按键B控制XYZ三位数码管,每当B按下时候,数码管XYZ要和数码管ABC显示的数字相加,并把结果显示在XYZ上.(暂时不考虑溢出)

首先把ABC里的值分别signal一下
然后判断B是否按下,然后用case么??觉得这样重复性的代码很多,每一个Case里都要做几遍加法...每个case里还要有很多判断...

觉得很浪费资源,高人指点一下..  

在本帖中,【1楼】 hawkflyking 回复说 思路如下:
1. M=ABC,百位十进制
2. N=XYZ:=0;百位十进制;
3. 按A,M=M+1;
4. 按B时,N=M+N;
5. 十进制加法子程序带进位(调用)
6. 十进制转BCD码数码管子程序(调用);  

再次感谢hawkflyking ....

--------------------------------------------------------------------------




另假设:

三位数码管A显示199,三位数码管B显示008,要求计算A乘以B,并把结果显示在A&B中
如199*008=1592,则A显示001,B显示592.

由于数码管显示为BCD数字,所以需对199做处理,使之成为二进制数据,如何处理?
处理后可以直接二进制相乘,做完乘法后如何分离使之能显示正确?


--------------------------------------------------------------------------

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-5-21 12:15:47 | 显示全部楼层
以三位数为例:

BCD->BIN:
BIN=BCD百位*100+BCD十位*10+BCD个位

BIN->BCD:
先算低位
BCD个位=BIN mod 10
BCD十位=((BIN-BCD个位)/10) mod 10
BCD百位=(((BIN-BCD个位)/10-BCD十位)/10) mod 10
先算高位
BCD百位=BIN/100
BCD十位=(BIN mod 100)/10
BCD个位=(BIN mod 100) mod 10


或BCD码直接算乘法
个位对齐:C*Z
十位对齐:B*Z+C*Y
百位对齐:A*Z+B*Y+C*X
千位对齐:A*Y+B*X
万位对齐:A*X
以上将多位BCD码乘法分解为一位BCD码乘法运算,乘法计算结果做BCD码加法运算,最后按位对齐再做一次BCD加法即可

出0入0汤圆

发表于 2011-5-21 13:33:19 | 显示全部楼层
哎,做乘法也要问,啃书吧。

出0入0汤圆

 楼主| 发表于 2011-5-21 14:18:40 | 显示全部楼层
回复【1楼】qwic
-----------------------------------------------------------------------

回复【1楼】qwic
-----------------------------------------------------------------------

你好,你说的这个也是个思路,但是是不是用VHDL实现起来很麻烦?

如:
198*123=24354

ABC=198<每一位对应的值是0001,1001,1000>
XYZ=123<每一位对应的值是0001,0010,0011>

依照上述可得.
个位对齐:1000*0011                           =11000<24>
十位对齐:1001*0011+1000*0010                 =11011+10000=101011<43>
百位对齐:0001*0011+1001*0010+1000*0001       =0011+10010+1000=11101<29>
千位对齐:0001*0010+1001*0001                 =1011<11>
万位对齐:0001*0001                           =0001<1>

然后个位进2得4
十位加2得45进位4得5
百位加4得33进位3得3
千位加3得14进位1得4
万位加1得2

分析归分析,有疑问如下:
1,个位11000要用to_integer转换为24,然后24要分离出2,4,把2转化为0010然后加十位,个位4转换后显示到数码管为4;以后每位都如此,那么是不是比较浪费?有没什么渐变的方法?

2,数码管显示出的198是三个数字,如何转化成二进制的198?若转换成功,那么乘积里如何将结果转化并依次显示为'2','4','3','5','4'?

出0入0汤圆

 楼主| 发表于 2011-5-21 14:19:08 | 显示全部楼层
回复【2楼】hawkflyking
-----------------------------------------------------------------------

唉,小弟不才,不会举一反三...

出0入0汤圆

发表于 2011-5-21 15:07:03 | 显示全部楼层
回复【3楼】cxlspp
-----------------------------------------------------------------------

...
分析归分析,有疑问如下:
1,个位11000要用to_integer转换为24,然后24要分离出2,4,把2转化为0010然后加十位,个位4转换后显示到数码管为4;以后每位都如此,那么是不是比较浪费?有没什么渐变的方法?

提一种思路:
ABC*XYZ,先把XYZ,得到ZYX。ABC与ZYX对应位相乘然后ZYX左移一个BCD位,依次得到个位,十位,百位。。。。
第一步:
ABC
  ZYX
计算C*Z得到个位,然后ZXY左移
第二步:
ABC
ZYX
计算B*Z+C*X,再加上个位的进位,得到十位,然后ZXY再左移
依次类推。。。
最后一步:
  ABC
ZYX
计算A*X并加上上次计算的进位,得最高位。
程序上根据需要,可用多个时钟周期或者for语句来实现。


2,数码管显示出的198是三个数字,如何转化成二进制的198?若转换成功,那么乘积里如何将结果转化并依次显示为'2','4','3','5','4'?

看1楼的转换方法,例子:
二进制198=BCD1*100+BCD9*10+BCD8
BCD24354:
先算最高位,24354除10000商2余4354,最高位是2;
然后第二位,4354除1000商4余354,第二位是4;
依次类推。。。

出0入0汤圆

 楼主| 发表于 2011-5-21 15:49:50 | 显示全部楼层
回复【5楼】qwic
-----------------------------------------------------------------------

谢谢你,我再去想想,又不懂的地方还要劳烦你哟......

出0入0汤圆

 楼主| 发表于 2011-5-21 15:56:34 | 显示全部楼层
回复【5楼】qwic
-----------------------------------------------------------------------

略懂,仔细研磨一下...谢谢!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 13:32

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

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