VHDL编码。。从整数到位向量的转换
我面临这个问题,我被要求在VHDL中实现一个函数,它接受一个整数并返回一个位向量,假设这个整数由4位表示 我不想使用已经内置的函数,我必须对函数进行编码 我已经做了一个函数,将位向量转换成整数,这有点容易,但我被困在这里:SVHDL编码。。从整数到位向量的转换,vhdl,Vhdl,我面临这个问题,我被要求在VHDL中实现一个函数,它接受一个整数并返回一个位向量,假设这个整数由4位表示 我不想使用已经内置的函数,我必须对函数进行编码 我已经做了一个函数,将位向量转换成整数,这有点容易,但我被困在这里:S 有什么想法吗?VHDL标准包是自制函数的好灵感,而数字位包定义了到无符号函数,用于将自然类型转换为无符号类型,这是VHDL实际用于转换为位向量的函数。该功能的实现方式如下: function TO_UNSIGNED (ARG, SIZE: NATURAL) return U
有什么想法吗?VHDL标准包是自制函数的好灵感,而
数字位
包定义了到无符号
函数,用于将自然
类型转换为无符号
类型,这是VHDL实际用于转换为位向量的函数。该功能的实现方式如下:
function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED is
variable RESULT: UNSIGNED(SIZE-1 downto 0);
variable I_VAL: NATURAL := ARG;
begin
if (SIZE < 1) then return NAU;
end if;
for I in 0 to RESULT'LEFT loop
if (I_VAL mod 2) = 0 then
RESULT(I) := '0';
else
RESULT(I) := '1';
end if;
I_VAL := I_VAL/2;
end loop;
if not(I_VAL =0) then
assert NO_WARNING
report "NUMERIC_BIT.TO_UNSIGNED: vector truncated"
severity WARNING;
end if;
return RESULT;
end TO_UNSIGNED;
莫顿的答案是正确的,但有时值得尝试其他方法
由于问题涉及到一个小的(4位)范围,查找表变得很有吸引力:我假设了无符号整数,但它很容易适应
subtype bv4 is bit_vector(3 downto 0);
constant LUT : array(0 to 15) of bv4 := (
"0000", "0001", "0010", "0011", "0100, "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100, "1101", "1110", "1111");
function to_bv(n : natural) return bit_vector is
begin
return LUT(n);
end to_bv;
这通常会像您希望的那样进行合成,而不是实际创建ROM 是的,这一个对我来说是正确的,我试过了,但是当它大于4位时,它不是很有用,但是谢谢你的努力,伙计:)你的回答确实帮了我很多,谢谢你,伙计,但是你能告诉我你是如何从ise库>?从函数初始化LUT也是一种非常有用的技术。我的观点是,在这种情况下,显式文字可能更简单,工作量更少@MSherin:包的源文件可以在中找到
subtype bv4 is bit_vector(3 downto 0);
constant LUT : array(0 to 15) of bv4 := (
"0000", "0001", "0010", "0011", "0100, "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100, "1101", "1110", "1111");
function to_bv(n : natural) return bit_vector is
begin
return LUT(n);
end to_bv;