还有其他存储二进制数的方法吗?



二进制数通常与固定位置MSB和LSB一起存储;从LSB到MSB,每个比特的权重加倍。还有其他存储二进制数的方法吗?

当需要最少数量的逻辑电子比特来表示一个数字时,传统的方法可能是最有效的方法,但是这种方法有一些缺点。一个缺点是,当顺序计数时,LSB的切换非常高,因为它在每次增量计数时切换状态。我试图打乱每个位的权重,以便在顺序计数时,表示二进制数的每个位具有相同的切换量。实现这种方法有很多优点,尽管这个数字需要更多的位。

一个优点是EEPROM的寿命将被延长,因为在表示存储数字的所有物理单元中发生等量的切换。超频cpu的另一个优点是纠错等。

如果示波器探头检测传统的地址总线,LSB有大量的HARD工作,而MSB非常空闲。

传统方法:(数量)00000001001000110100新提议的方法:编码器(争夺)(数量)

像这样的二进制数系统呢?当以非常高的总线速度计数时,晶体管不会过热,因此限制时钟速度。

解决方案同时使用以2为基数和以1为基数的二进制来表示一个数字。

((以2为基数的二进制数)*size_of_in_bits(以1为基数的二进制数))+以1为基数的二进制数

所以对于16位总线,高字节二进制基数为2,低字节二进制基数为1,最大计数为((2^8)-1)*8)+8) = 2048

EEPROM寿命问题的解决方案可以是:

使用EEPROM,在写入新数据时只更改所需的单元,以最大限度地延长寿命。

4字节(32bit)表示基数的2部分,13字节(100bit)表示基数的1部分。

((32位二进制2进制数)× 100) +(100位二进制1进制计数)

最大计数为(((2^32)-1)*100)+100)= 429,496,729,700

这种方法应该从EEPROM或FLASH存储器中获得最大的寿命,对于FLASH存储器,基数1的数字应该反向存储,因为擦除状态是逻辑1。

EEPROM可以读取、递增、写入大2个数量级的数字,使计数达到100万而不是1万。

给我发邮件,我可以给你程序,它在MVS 2013控制台工作。

lion@palmbeach.freeserve.co.uk

/* a www.goatelectronics.com solution */

/*该程序设计用于测试eeprom寿命,写入同一页和单元*/

/* 32位base-2二进制数+ 100位base-1二进制数= */

/* byte 0 -二进制2进制数*/

/* byte 1 - */

/* byte 2 - */

/* byte 3 -二进制2进制数*/

/* byte 4 - 8位CRC后缀表示32位数字,以后再做*/

/*字节5 -计数0到8二进制基数1数*/

/*字节6 -计数9到16二进制1进制数*/

/* byte 7 - count 17 to 24 of…*/

/*字节8 -计数25到32 */

/* byte 9 - count 33 to 40 *

/* byte 10 - count 41 to 48 */

/*字节11 -计数49到56 */

/* byte 12 - count 57 to 64 */

/*字节13 -计数65到72 */

/*字节14 -计数73到80 */

/*字节15 -计数81到88 */

/*字节16 -计数89到96 */

/*字节17 -计数97到100 */

#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
/* emulate the eeprom *here* , byte read and write */
unsigned char eeprom[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
unsigned int EEPROM_read (void)
{
unsigned char i_u8;
unsigned int value_u32, value_A_u32, value_B_u32, value_C_u32,      value_D_u32 = 0;
unsigned int base_1_u32 = 0;
value_A_u32 = eeprom[0];
value_A_u32 = value_A_u32 << 24;
value_B_u32 = eeprom[1];
value_B_u32 = value_B_u32 << 16;
value_C_u32 = eeprom[2];
value_C_u32 = value_C_u32 << 8;
value_D_u32 = eeprom[3];
value_u32 = value_A_u32 | value_B_u32 | value_C_u32 | value_D_u32;
/* eeprom[4]  reserved location for CRC checksum! */
value_u32 = value_u32 * 100;
for (i_u8 = 5; eeprom[i_u8] == 0xFF; i_u8++)
{
    base_1_u32 = base_1_u32 + 8;
}
switch (eeprom[i_u8])
{
case 0x80: base_1_u32 = base_1_u32 + 1;
    break;
case 0xC0: base_1_u32 = base_1_u32 + 2;
    break;
case 0xE0: base_1_u32 = base_1_u32 + 3;
    break;
case 0xF0: base_1_u32 = base_1_u32 + 4;
    break;
case 0xF8: base_1_u32 = base_1_u32 + 5;
    break;
case 0xFC: base_1_u32 = base_1_u32 + 6;
    break;
case 0xFE: base_1_u32 = base_1_u32 + 7;
    break;
default:; /*if here, faulty EEPROM with base-1 number*/
}
value_u32 = value_u32 + base_1_u32;
return (value_u32);
}
void EEPROM_write(unsigned int number_u32)
{
unsigned char i_u8, remainder_u8;
unsigned int value_u32;
value_u32 = number_u32;
value_u32 = value_u32 / 100;
eeprom[0] = (unsigned char)((value_u32 & 0xFF000000) >> 24);
eeprom[1] = (unsigned char)((value_u32 & 0x00FF0000) >> 16);
eeprom[2] = (unsigned char)((value_u32 & 0x0000FF00) >> 8);
eeprom[3] = (unsigned char)((value_u32 & 0x000000FF));
remainder_u8 = (unsigned char)(number_u32 % 100);
if (!remainder_u8)
{
    for (i_u8 = 5; i_u8 < 18; i_u8++)
    {
        eeprom[i_u8] = 0x00;
    }
}
for (i_u8 = 5; remainder_u8 >=8; i_u8++)
{
    eeprom[i_u8] = 0xFF;
    remainder_u8 = remainder_u8 - 8;
}
switch (remainder_u8)
{
case 1: eeprom[i_u8] = 0x80;
    break;
case 2: eeprom[i_u8] = 0xC0;
    break;
case 3: eeprom[i_u8] = 0xE0;
    break;
case 4: eeprom[i_u8] = 0xF0;
    break;
case 5: eeprom[i_u8] = 0xF8;
    break;
case 6: eeprom[i_u8] = 0xFC;
    break;
case 7: eeprom[i_u8] = 0xFE;
    break;
default:; /**/
}
}

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char i_u8;
unsigned int test_number_u32;
unsigned int loop_u32 = 0;
while (loop_u32 <0xFFFFFFFF)
{
    test_number_u32 = EEPROM_read();
    test_number_u32++;
    EEPROM_write(test_number_u32);
    for (i_u8 = 0; i_u8 < 18; i_u8++)
    {
        printf(" %x", eeprom[i_u8]);
    }
    printf(" n");
    loop_u32++;
}

相关内容

  • 没有找到相关文章

最新更新