Arrays 如何在VHDL中组合传入数据和字符?

Arrays 如何在VHDL中组合传入数据和字符?,arrays,vhdl,message,lcd,Arrays,Vhdl,Message,Lcd,我想用VHDL驱动一个4x16液晶显示器。第一行应该是“FREQ:000 RPM”,其中零表示传入的8位频率数据。对于具有不同数据的下一行,也是8位。我的VHDL代码如下: -- 16 Characters subtype string16_type is string(1 to 16); -- 4 string of 16 characters type message4x16_type is array(1 to 4) of string16_type; -- Define messages

我想用VHDL驱动一个4x16液晶显示器。第一行应该是“FREQ:000 RPM”,其中零表示传入的8位频率数据。对于具有不同数据的下一行,也是8位。我的VHDL代码如下:

-- 16 Characters
subtype string16_type is string(1 to 16);
-- 4 string of 16 characters
type message4x16_type is array(1 to 4) of string16_type;
-- Define messages displayed
constant message_home:  message4x16_type := (    --1234567890123456
                                             1 => "FREE MODE       ",
                                             2 => "PARCOURS        ",
                                             3 => "- - - - - - - - ",
                                             4 => " - - - - - - - -");
constant message_info:  message4x16_type := (    --1234567890123456
                                             1 => "FREQ:  000 RPM  ",
                                             2 => "SPEED: 000 KM/H ",
                                             3 => "DIST:  000 KM   ",
                                             4 => "MORE INFO       ");
-- Character amount in  line
signal character_counter: integer range 1 to 16;
-- Line amount on LCD
signal line_counter     : integer range 1 to 4;
然后是一个状态机,其中状态write_char部分如下所示:

if msg_select = '0' then
    aline := message_home(line_counter);
elsif msg_select = '1' then
    aline := message_info(line_counter);
end if;
data <= std_logic_vector(to_unsigned(character'pos(aline(character_counter)),8));
如果msg\u select='0',则
aline:=消息主页(行计数器);
如果msg_select='1',则
aline:=消息信息(行计数器);
如果结束;

数据如前所述声明类型、常数和信号:

-- 16 characters
type lcd_line_type is array(0 to 15) of character;
-- 4 lines of 16 characters
type message4x16_type is array(0 to 3) of lcd_line_type;
-- Define messages displayed
constant message_home : message4x16_type := (
--1234567890123456
 "FREE MODE       ",
 "PARCOURS        ",
 "- - - - - - - - ",
 " - - - - - - - -"
);
constant message_info :  message4x16_type := (
--1234567890123456
 "FREQ:  000 RPM  ",
 "SPEED: 000 KM/H ",
 "DIST:  000 KM   ",
 "MORE INFO       "
);
-- Character amount in line
signal character_counter : integer range 0 to 15;
-- Line amount on LCD
signal line_counter : integer range 0 to 3;

subtype rawchar is std_logic_vector(7 downto 0);
type rawstring is array(natural range <>) of rawchar;
signal rpm : rawstring(2 downto 0);
signal kmh : rawstring(2 downto 0);

function to_rawchar(char : character) return rawchar is
begin
  return std_logic_vector(to_unsigned(character'pos(char), 8));
end function;
——16个字符
类型lcd_line_类型为字符数组(0到15);
--4行16个字符
类型message4x16\u type是lcd\u line\u类型的数组(0到3);
--定义显示的消息
常量消息\u home:message4x16\u类型:=(
--1234567890123456
“自由模式”,
“包裹”,
"- - - - - - - - ",
" - - - - - - - -"
);
恒定消息信息:消息4x16\u类型=(
--1234567890123456
“频率:000转/分”,
“速度:000公里/小时”,
“距离:000公里”,
“更多信息”
);
--行中字符数
信号字符_计数器:整数范围0至15;
--LCD上的行数
信号线_计数器:整数范围0至3;
子类型rawchar是标准逻辑向量(7到0);
类型rawstring是rawchar的数组(自然范围);
信号rpm:原始字符串(2到0);
信号kmh:原始字符串(2到0);
返回rawchar(char:character)的函数是
开始
返回标准逻辑向量(到无符号(字符位置(char),8));
末端功能;
用法示例:

if msg_select = '0' then
  data <= to_rawchar(message_home(line_counter)(character_counter));
elsif msg_select = '1' then
  case line_counter is
    when 0 =>
      -- replace 000 by rpm(2:0)
      case character_counter is
        when 6 => data <= rpm(2);
        when 7 => data <= rpm(1);
        when 8 => data <= rpm(0);
        when others => data <= to_rawchar(message_info(0)(character_counter));
      end case;
    when 1 =>
      -- replace 000 by kmh(2:0)
      case character_counter is
        when 7 => data <= kmh(2);
        when 8 => data <= kmh(1);
        when 9 => data <= kmh(0);
        when others => data <= to_rawchar(message_info(1)(character_counter));
      end case;
    -- ...
  end case;
end if;
如果msg\u select='0',则
资料
--用转速(2:0)替换000
大小写字符_计数器为
当6=>数据时
--以公里小时(2:0)替换000
大小写字符_计数器为

当7=>data时,“将频率数据落实到消息中”是什么意思?将
000
替换为数字值的ASCII字符串形式?是否知道连接符号“&”?在声明常量后,不能修改其值。这意味着您可以使用4x16显示器的随机访问功能,也可以创建一个信号或变量行缓冲字符串,以便将常量字符串复制到显示器,编辑并随后写入显示器。符合合成条件的东西需要固定长度,这就是为什么在VHDL中找不到C字符串格式。非常感谢!这正是我要找的!