在verilog中,我可以将字符串分配给矢量,如:
wire [39:0] hello;
assign hello = "hello";
在VHDL中,我很难找到这样的方法:
SIGNAL hello : OUT std_logic_vector (39 DOWNTO 0);
...
hello <= "hello";
我一直在使用:
hello <= X"65_68_6c_6c_6f";
对于大字符串来说这是不清楚和耗时的。
我查看了textio
package和txt_util
package,但似乎都不清楚如何解释字符串并将其转换为std_logic。
是否有一种简单的方法可以在VHDL中将ascii代码分配给std_logic?
这是一个最小的例子:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY test IS
PORT(
ctrl : IN std_logic;
stdout : OUT std_logic_vector (39 DOWNTO 0)
);
END ENTITY;
ARCHITECTURE rtl OF test IS
SIGNAL temp : std_logic_vector (39 DOWNTO 0);
BEGIN
stdout <= temp;
PROCESS(ctrl)
BEGIN
IF (ctrl = '0') THEN
temp <= "hello"; -- X"68_65_6C_6C_6F";
ELSE
temp <= "world";
END IF;
END PROCESS;
END rtl;
答案 0 :(得分:5)
对于Morten的答案,这个变化不大 - 它只使用一个乘法,它复制字符串而不是创建别名,它使用一个额外的变量,它返回一个具有升序索引范围的标准逻辑向量。 / p>
来自名为string_utils的包:
library ieee;
use ieee.numeric_std.all;
-- ...
function to_slv(s: string) return std_logic_vector is
constant ss: string(1 to s'length) := s;
variable answer: std_logic_vector(1 to 8 * s'length);
variable p: integer;
variable c: integer;
begin
for i in ss'range loop
p := 8 * i;
c := character'pos(ss(i));
answer(p - 7 to p) := std_logic_vector(to_unsigned(c,8));
end loop;
return answer;
end function;
您可以添加一个参数,其默认值为返回值指定升序/降序索引范围。您只需要为非默认值提供参数。
答案 1 :(得分:3)
一个小的一般功能就是这样做的一种方式,建议如下:
library ieee;
use ieee.numeric_std.all;
...
-- String to std_logic_vector convert in 8-bit format using character'pos(c)
--
-- Argument(s):
-- - str: String to convert
--
-- Result: std_logic_vector(8 * str'length - 1 downto 0) with left-most
-- character at MSBs.
function to_slv(str : string) return std_logic_vector is
alias str_norm : string(str'length downto 1) is str;
variable res_v : std_logic_vector(8 * str'length - 1 downto 0);
begin
for idx in str_norm'range loop
res_v(8 * idx - 1 downto 8 * idx - 8) :=
std_logic_vector(to_unsigned(character'pos(str_norm(idx)), 8));
end loop;
return res_v;
end function;
答案 2 :(得分:0)
在您的示例中,您尝试将字符串类型分配给std_logic_vector类型。 根本不允许这样做。 VHDL是强类型的。
信号你好:OUT std_logic_vector(39 DOWNTO 0); ... 你好<=“ hello”;
如果您的目标是从hexa转换为ASCII以打印模拟结果 您可以简单地做到这一点:
字符'val(to_integer(unsigned(my_std_logic_vector)))
答案 3 :(得分:0)
要返回字符的 ascii 值,请使用以下代码:
some_variable <= character'pos('a'); --returns the 'a' ascii value