Floating point 将实数转换为IEEE双精度标准逻辑向量(63到0)

Floating point 将实数转换为IEEE双精度标准逻辑向量(63到0),floating-point,vhdl,ieee-754,Floating Point,Vhdl,Ieee 754,这真的不应该这么难 我想从文件中读取原始64位数据,并将其用于std\u logic\u向量(从63向下到0)。我使用的是ModelSim ALTERA 10.1b 我试图将原始二进制数据读入64位向量: type double_file is file of std_logic_vector(63 downto 0); file infile1: double_file open read_mode is "input1.bin"; variable input1 : std_logic_v

这真的不应该这么难

我想从文件中读取原始64位数据,并将其用于
std\u logic\u向量(从63向下到0)
。我使用的是ModelSim ALTERA 10.1b

我试图将原始二进制数据读入64位向量:

type double_file is file of std_logic_vector(63 downto 0);
file infile1: double_file open read_mode is "input1.bin";

variable input1 : std_logic_vector(63 downto 0) := (others => '0');

read(infile1, input1);
但这不起作用。显然,ModelSim试图将输入数据的每个字节解释为
std_逻辑
'U'
'Z'
'-'
,等等)


但是,我可以成功地将数据读入
real
变量:

type real_file is file of real;
file infile1: real_file open read_mode is "input1.bin";

variable input1 : real;

read(infile1, input1);

但在这一点上,我无法理解如何将
实数
变量转换为
标准逻辑向量(63到0)
。几乎所有这些都只是说“你们不能这么做;
real
是不可合成的”。我完全理解这一点-这只是为了模拟。

如果您感兴趣的只是64位实数表示的64位二进制值,请将它们作为字符读取,然后一次将值转换为std_逻辑向量切片,并将切片连接到64位std_逻辑向量。请注意,您必须注意字节顺序,并且也要确保位顺序正确。正如他们所说,这取决于实现。实际上,您将正在读取的文件中的二进制表示形式视为64位FP表示形式和长度为8位字符的数组之间的并集。只需确保始终读取每个64位值的所有字符

参见Edwin Narosk在2004年对询问转换问题的人的回复。Narosk先生在2004年提供的链接无效,但可在此处找到:。它的链接路径中不再有vi(用于VHDL国际语言)。

关键是

首先,使用
to_float
实数
转换为浮点:

variable in1_r : real;
variable in1_f : float64;

in1_f := to_float(in1_r, in1_f);  -- in1_f passed for sizing
然后,您只需将
float64
转换为slv:

variable in1_slv : std_logic_vector(63 downto 0);

in1_slv := to_std_logic_vector( in1_f );
这也可以用一行程序完成,消除了中间的浮动64:

in1_slv <= to_std_logic_vector( to_float(in1_r, float64'high, -float64'low) );

在1_slv中,您可以找到David Bishop的软件包用户指南


此外,您还可以在以下网址找到David和我的演示文稿,标题为“定点和浮点包”:

谢谢您的帮助。但我最终设法找到了一种方法,将
real
转换成IEEE754
std\u logic\u vector(63到0)
“我想从文件中读取原始的64位IEEE 754双精度浮点数据”。实际实现的范围是定义的(包标准)。上面读取real类型文件的文件输入不能保证表示双精度浮点,这是一个不可移植的假设。是的,你可以通过转换把一个不是双精度浮点值的实数表示成一个。不过不是生的,谢谢大卫。我了解从文件中读取
real
时的具体实现问题。然而,我得到了一个测试台的外壳,它正在从文件中读/写
real
s,我真的不想把这一切搞砸。因此,将
real
转换为slv似乎是这里的最佳选择——不过这是一个孤立的家庭作业项目,我肯定会为一个更持久、更省时的场景选择更好的解决方案。除非有人有任何疑虑,否则我将接受下面的答案。我理解从文件部分读取双精度会使这变得更复杂,但对于简单地将
real
转换为
std\u logic\u vector
,我的回答简洁地做到了这一点。