从本质上讲,我的问题是:" 这样做不容易吗? "; 这个是什么,如下所示(代码也是如此):
我希望有一种"补充"计数器功能,用VHDL实现,它基本上会反转/补充/不是每一步中的计数器值,为测试提供稍微丰富的位模式.当然,我希望这可以合成(因此计数器值可能分配给引脚)和可移植代码(即仅实现IEEE库,否STD_LOGIC_ARITH).我也不希望默认将all视为无符号(所以我想避免STD_LOGIC_UNSIGNED).
简而言之,这个计数器可以描述为:给定初始值C [0],那么每个时钟滴答的值将是:
C[i+1] = not(C[i]) + ( ( C[i]<(Cmax/2) ) ? 0 : 1 )
Run Code Online (Sandbox Code Playgroud)
...或者给定C是16位宽(这将导致无符号Cmax = 65535和Cmax/2 = 32768),它也可以写成:
C[i+1] = 65535 - C[i] + ( ( C[i]<32768 ) ? 0 : 1 )
Run Code Online (Sandbox Code Playgroud)
这里的技巧是计数器只应增加一次 - 如果它对互补和"正常"范围都增加,那么就不会发生变化(方程将在两个值之间"振荡").
因此,考虑到检查C [i] <(Cmax/2)与检查C的最重要(第15位)基本相同,我认为我可以使用以下内容在VHDL中轻松实现类似的内容:
Y <= not(Y) + Y(15);
Run Code Online (Sandbox Code Playgroud)
男孩,我错了"轻松":)
第一个问题是上述等式有可能最终达到65535 + 1,在这种情况下,结果将需要17位(即溢出); 在我的情况下,我只想截断/忽略任何'进位'.
这导致了使用什么的问题:
std_logic_vector有补充not()定义; 但它没有+(添加)定义natural/ integer可能在内部占用32位,因此它们的位宽不是necesarilly指定的; 他们支持算术+,但没有补充not()unsigned …我试图从 STC3100 电池监视器 IC 读取值,但我得到的值不正确。数据表说的是:
The temperature value is coded in 2’s complement format, and the LSB value is 0.125° C.
REG_TEMPERATURE_LOW, address 10, temperature value, bits 0-7
REG_TEMPERATURE_HIGH, address 11, temperature value, bits 8-15
Run Code Online (Sandbox Code Playgroud)
这是数据表:http : //www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00219947.pdf
我的代码中有什么:
__u8 regaddr = 0x0a; /* Device register to access */
__s32 res_l, res_h;
int temp_value;
float temperature;
res_l = i2c_smbus_read_word_data(myfile, regaddr);
regaddr++;
res_h = i2c_smbus_read_word_data(myfile, regaddr);
if (res_l < 0) {
/* ERROR HANDLING: i2c transaction failed */
} else …Run Code Online (Sandbox Code Playgroud) 我有一个字符串"0AAE0000463130004144430000",我需要计算构成字符串的十六进制字节的二进制补码校验和.
上面示例字符串的公式是
对于此示例,D9是正确的校验和,但是我无法从C#中的字符串中解析出两位十六进制值.我目前的代码如下:
string output = "0AAE0000463130004144430000";
long checksum = 0;
char[] outputBytes = output.TrimStart(':').ToCharArray();
foreach (var outputByte in outputBytes)
{
checksum += Convert.ToInt32(outputByte);
checksum = checksum & 0xFF;
}
checksum = 256 - checksum;
Run Code Online (Sandbox Code Playgroud)
但是,这是我可以告诉的ASCII值的总和,并为每个单独的字符执行此操作.
由N位表示的数字的2的补码是2 ^ N数.
例如:如果number是7(0111)并且我用4位表示它,那么它的2的补码将是(2 ^ N数),即(2 ^ 4 -7)= 9(1001)
7==> 0111
1's compliment of 7==> 1000
1000
+ 1
-------------
1001 =====> (9)
Run Code Online (Sandbox Code Playgroud)
在计算数字的2的补码时,我们执行以下步骤:1.对数字2进行补码2.在步骤1的结果中加1.
我知道我们需要做一个补码,因为我们正在做一个否定操作.但为什么我们加1呢?
这可能是一个愚蠢的问题,但我很难理解逻辑.为了解释上面的例子(对于数字7),我们做一个补码并得到-7然后加+1,所以-7 + 1 = -6,但我们仍然得到正确的答案,即+9
我通过udp数据包从gps单元接收数据.Lat/Lng值以十六进制表示.
示例数据
13BF71A8 =纬度(33.1313576)
BA18A506 =经度(-117.2790010)
文档解释了经度/纬度读数以度为单位测量,1x10 ^ -7度lsb,带符号2的补码.
对于
谷歌纵横,我可以使用以下公式进行转换:13BF71A8 = 331313576*0.0000001 = 33.1313576
此代码适用于Lat但不适用于Lng:
function convertLat(h){
var latdec = parseInt(h,16);
var lat = latdec * 0.0000001;
return lat;
}
console.log("LAT: " + convertLat("13BF71A8"));
Run Code Online (Sandbox Code Playgroud)
我无法转换经度值.有谁知道如何转换经度?
在我的中期,有一个问题说:
给定十进制值,在Two的补语表单中表示每个数字所需的最小位数是多少?
值为:-26,-1,10,-15,-4.
我没有得到任何正确的问题,解决方案令人困惑.
我真正理解的唯一部分是找到值所在的范围.例如,-15将在[-2 ^ 5,2 ^ 5]的范围内,并且-4将在[-2 ^ 2,2 ^ 2]的范围内.从这里需要哪些步骤才能找到需要多少位?
我试图找到一些模式来解决它,但它只适用于前两种情况.这是我的尝试:
首先,我找到了范围.-2 ^ 6 <-26 <2 ^ 6
然后我发现2 ^ 6 = 32的值.
然后我找到了"最近"界限与值之间的差异.
-26 - (-32)= 6
同样,这偶然适用于前两个值,现在我难以找到以二进制补码形式表示的整数所需的位数与实际整数之间的实际关系.
提前致谢!
我看到当我使用two's complement溢出时减去正数和负数时.例如,如果我从2中减去1,我得到:
2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001
Run Code Online (Sandbox Code Playgroud)
所以这里结果有第五个位10001- 它是否溢出?我已经找到了检测溢出的这些规则,有两个补码:
如果两个正数的总和产生负结果,则总和已溢出.如果两个负数的总和产生正结果,则总和已溢出.否则,总和没有溢出.
任何人都可以详细说明这些并展示示例吗?
形成二进制数的二进制补码的一种捷径方法是从右边复制位,直到复制一位为止,然后对其余位进行补码(取反)。
什么是不能解释的是为什么这个快捷方式工作,那就是为什么它产生相同的结果,反转所有位并加1。所以,我的问题是,为什么这样做有效?
我浏览了 ISA 规范并在互联网上搜索了这个问题的答案,但我找不到它。
在RISC-V ISA中,负数应该用补码还是补码表示?或者,这个决定是留给实施者的吗?
我问的原因是我正在编写一个 RV32I 模拟器,这会影响我在模拟内存中存储负数的方式。
原问题:
正数在一个补码和二进制补码中具有相同的表示。假设它的表示被解释为二进制补码,并且它的加法逆是确定的。现在这个表示被解释为一个补码,并且确定了加法逆。无论是解释为一的补码还是二的补码,结果都是一样的,因为它是一个正数。这个结果和原来的数字有什么关系?
我不知道他说的“这个结果和原来的数字有什么关系”是什么意思。我想我明白他要我们做的过程:
首先取二进制(0101),然后取二进制补码(1011),然后取二进制补码的二进制补码(0100)。接下来是什么?