>在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;
解决方法
对于Morten的答案,这个变化很小 – 它只使用一个乘法,它复制字符串而不是创建别名,它使用一个额外的变量,它返回一个具有升序索引范围的标准逻辑向量.
从名为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;
您可以添加一个参数,其默认值为返回值指定升序/降序索引范围.您只需要为非默认值提供参数.