↓↓ 求思路,想不通...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做处理,使之成为二进制数据,如何处理?
处理后可以直接二进制相乘,做完乘法后如何分离使之能显示正确?
-------------------------------------------------------------------------- 以三位数为例:
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加法即可 哎,做乘法也要问,啃书吧。 回复【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'? 回复【2楼】hawkflyking
-----------------------------------------------------------------------
唉,小弟不才,不会举一反三... 回复【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;
依次类推。。。 回复【5楼】qwic
-----------------------------------------------------------------------
谢谢你,我再去想想,又不懂的地方还要劳烦你哟...... 回复【5楼】qwic
-----------------------------------------------------------------------
略懂,仔细研磨一下...谢谢!!
页:
[1]