2

这真的不应该这么难。

我想从文件中读取原始 64 位IEEE 754 双精度浮点数据,并在std_logic_vector(63 downto 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_logic( '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);

但此时,我无法弄清楚如何将该real变量转换为std_logic_vector(63 downto 0). 几乎所有的谷歌结果都只是说“你不能这样做;real不可合成”。我完全理解 - 这只是为了模拟。

4

3 回答 3

2

您可以在此处找到 David Bishop 的软件包用户指南

此外,您可以在以下网址找到 David 和我的题为“定点和浮点包”的演示文稿:http ://www.synthworks.com/papers/index.htm

于 2013-07-22T16:58:39.250 回答
2

关键是ieee.float_pkg.

首先,您使用to_float将 转换real为浮点数:

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 );

这也可以用单线来完成,消除中间float64

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

关键是to_float需要知道目标大小。由于我们没有中间float64值,我们可以直接传递exponent_widthandfraction_width参数,使用float64. 查看to_float64帮助的定义。

这个问题有一些帮助:IEEE Float type to std_logic_vector conversion

于 2013-07-22T06:10:57.687 回答
1

如果您只对 64 位实数表示的 64 位二进制值感兴趣,请将它们作为字符读取并一次将值转换为 std_logic_vector 切片并将切片连接成 64 位 std_logic 向量。请注意,您必须注意字节顺序并正确获取位顺序。正如他们所说,实施依赖。您有效地将正在读取的文件中的二进制表示视为 64 位 FP 表示和长度为 8 的 8 位字符数组之间的联合。只需确保始终读取每个 64 位值的所有字符。

请参阅 Edwin Narosk 2004 年对有人询问字符到 std_logic_vector转换的回复。Narosk 先生在 2004 年提供的链接无效,但可以在这里找到:4.2.21 如何在枚举和整数值之间进行转换。它在链接路径中不再有 vi(用于 VHDL International)。

于 2013-07-22T06:09:18.270 回答