cxlspp 发表于 2011-5-21 11:15:27

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

假设:
按键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做处理,使之成为二进制数据,如何处理?
处理后可以直接二进制相乘,做完乘法后如何分离使之能显示正确?


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

qwic 发表于 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加法即可

hawkflyking 发表于 2011-5-21 13:33:19

哎,做乘法也要问,啃书吧。

cxlspp 发表于 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'?

cxlspp 发表于 2011-5-21 14:19:08

回复【2楼】hawkflyking
-----------------------------------------------------------------------

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

qwic 发表于 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;
依次类推。。。

cxlspp 发表于 2011-5-21 15:49:50

回复【5楼】qwic
-----------------------------------------------------------------------

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

cxlspp 发表于 2011-5-21 15:56:34

回复【5楼】qwic
-----------------------------------------------------------------------

略懂,仔细研磨一下...谢谢!!
页: [1]
查看完整版本: ↓↓ 求思路,想不通...VHDL新手帖 (续)