我有一些48位无符号数字,我想从VHDL测试平台写入文件。不幸的是,我过去总是这样做,转换为整数,对大于32位的数字不起作用。
以下是我总是使用小于32位的数字来完成它。
write(L=>result_line, value=>to_integer(unsigned(C_combo_out)));
这是我想要做的,但不支持无符号类型。
write(L=>result_line, value=>unsigned(C_combo_out));
C_combo_out
是一个48位的std_logic_vector,表示无符号整数。注意,我真的想要输出文件中的数字,而不是'1'和'0'的字符串。
答案 0 :(得分:1)
所以你需要10号基数?
导出大量基数16非常简单,特别是如果其他工具或语言对输出进行后期处理。基数10和大于2 ** 31的数量需要特殊处理。
您可以使用double dabble algorithmn将如此大的数字转换为BCD表示,然后将BCD编号转换为ASCII以进行文件导出。
这应该将大的std_logic_vectors转换为十进制数字:
function raw_format_slv_dec(slv : STD_LOGIC_VECTOR) return STRING is
function div_ceil(a : NATURAL; b : POSITIVE) return NATURAL is -- calculates: ceil(a / b)
begin
return (a + (b - 1)) / b;
end function;
variable Result : STRING(1 to div_ceil(slv'length, 3));
subtype TT_BCD is INTEGER range 0 to 31;
type TT_BCD_VECTOR is array(natural range <>) of TT_BCD;
variable Temp : TT_BCD_VECTOR(div_ceil(slv'length, 3) - 1 downto 0) := (others => 0);
variable Carry : T_UINT_8;
begin
for i in slv'range loop
if (slv(i) = '0') then
Carry := 0;
else
Carry := 1;
end if;
for j in Temp'reverse_range loop
Temp(j) := Temp(j) * 2 + Carry;
if (Temp(j) > 9) then
Carry := 1;
Temp(j) := Temp(j) - 10;
else
Carry := 0;
end if;
end loop;
end loop;
for i in Result'range loop
Result(i) := CHARACTER'val(to_integer(Temp(Temp'high - i + 1)));
end loop;
-- trim leading zeros, except the last
return Result;
end function;
扩展版已上传到PoC's strings package。
PoC-Library附带测试平台,因此您可以从控制台运行它。有4个简单的步骤需要执行:
配置您首选的模拟器工具链:
cd <PoCRoot>
./poc.sh --configure
Setup:
在模板<PoCRoot>/tb/common/
的{{1}}中创建my_project.vhdl。使用该文件配置两个常量。
<PoCRoot>/src/common/my_project.vhdl.template
如果您在没有cd <PoCRoot>/tb
./testbench.sh --isim PoC.common.strings -g
的情况下运行模拟,它应该如下所示:
如果使用选项-g
运行模拟,它将以GUI模式运行,如下所示:
更多信息:
- List of used files
- Testbench
如果您还有其他问题,请参阅AUTHORS文件并直接与我或我的同事联系。