VHDL:有没有一种方便的方法将 ascii 值分配给std_logic_vector


  • 在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包和txt_util包,但似乎都不太清楚如何解释字符串并将其转换为std_logic。

有没有一种简单的方法可以将 ASCII 代码分配给 VHDL 中的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; 

您可以添加一个参数,该参数具有默认值,指定返回值的升序/降序索引范围。 您只需要提供非默认值的参数。

一个小的通用函数是一种方法,建议如下:

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;

若要返回字符的 ascii 值,请使用以下代码:

some_variable <= character'pos('a'); --returns the 'a' ascii value

在您的示例中,您尝试将字符串类型分配给std_logic_vector类型。这是绝对不允许的。VHDL 是强类型。

信号你好:出std_logic_vector(39下降到0);...你好<="你好";

如果您的目标是从 hexa 转换为 ascii 以获得打印模拟结果您可以简单地这样做:

character'val(to_integer(unsigned(my_std_logic_vector)))

相关内容

  • 没有找到相关文章

最新更新