【发布时间】:2015-08-10 22:02:57
【问题描述】:
我有一个 14 位数据,从 FPGA 输入到 vhdl,NIos II 处理器从 FPGA 读取 14 位数据并执行一些处理任务,其中 Nios II 系统是用 C 代码编程的
14 位数据可以是正数、零或负数。在 Altera 编译器中,我只能将数据定义为 8,16 或 32。所以我将其定义为 16 位数据。
首先,我需要检查数据是否为负,如果为负,我需要将前两个 MSB 填充为位 '1',以便系统将其检测为负值而不是正值。
其次,我需要将此二进制表示的实际值计算为整数和分数的十进制值。
我从这个链接 (Correct algorithm to convert binary floating point "1101.11" into decimal (13.75)?) 了解到我可以将二进制(包含整数和小数)转换为十进制值。
具体说明,我可以使用此链接 (Correct algorithm to convert binary floating point "1101.11" into decimal (13.75)?) 引用的代码,转载如下:
#include <stdio.h>
#include <math.h>
double convert(const char binary[]){
int bi,i;
int len = 0;
int dot = -1;
double result = 0;
for(bi = 0; binary[bi] != '\0'; bi++){
if(binary[bi] == '.'){
dot = bi;
}
len++;
}
if(dot == -1)
dot=len;
for(i = dot; i >= 0 ; i--){
if (binary[i] == '1'){
result += (double) pow(2,(dot-i-1));
}
}
for(i=dot; binary[i] != '\0'; i++){
if (binary[i] == '1'){
result += 1.0/(double) pow(2.0,(double)(i-dot));
}
}
return result;
}
int main()
{
char bin[] = "1101.11";
char bin1[] = "1101";
char bin2[] = "1101.";
char bin3[] = ".11";
printf("%s -> %f\n",bin, convert(bin));
printf("%s -> %f\n",bin1, convert(bin1));
printf("%s -> %f\n",bin2, convert(bin2));
printf("%s -> %f\n",bin3, convert(bin3));
return 0;
}
我想知道这段代码是否可以用来检查负值?我确实尝试过使用 11111101.11 的二进制字符串,它的输出为 253.75...
我有两个问题:
- 为了读取负值,我需要做哪些修改?
我知道我可以做位移(如下)来检查msb是否为1,如果是1,我知道它是负值...
if (14bit_data & 0x2000) //if true, it is negative value
问题是,由于它涉及小数部分(但不仅仅是整数),如果该方法仍然有效,我会感到有点困惑......
- 如果二进制数原本不是字符串格式,有什么办法可以将其转换为字符串?二进制数最初来自用 VHDL 编写的 fpga 块,例如 14 位,以 msb 作为符号位,接下来的 6 位是整数的幅度,最后 6 位是小数部分的幅度。我需要 Altera Nios II 处理器的 C 代码中的十进制值。
【问题讨论】:
-
你提到了FPGA。您使用哪种语言编写代码?高密度脂蛋白?视频博客?还是通过示例用 C 编写的软件代码?
-
@Quicky,感谢您的回复,抱歉没有说清楚,它是 fpga 中的 vhdl 和 Altera Nios II 系统中的 C 代码(将在主帖中进行编辑以进行澄清)
-
但是你在这里质疑关注 C 代码?我不明白你到底在问什么?您是否只想检查这是否为负值?或者假设这是一个有符号数,计算这个二进制表示的实际值?
-
14 位数据从 FPGA 输入到 vhdl 中,NIos II 处理器从 FPGA 读取 14 位数据并执行一些处理任务,其中 Nios II 系统用 C 代码编程
-
好的,这很清楚。那么代码的目标是什么?