2015-10-04 47 views
2

我想用VHDL驅動一個4x16 LCD顯示屏。第一行應該說「FREQ:000 RPM」,其中零表示傳入的8位頻率數據。下一行的數據也不相同,也是8位。我的VHDL代碼如下:如何在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 := ( --123456789
              1 => "FREE MODE  ", 
              2 => "PARCOURS  ", 
              3 => "- - - - - - - - ", 
              4 => " - - - - - - - -"); 
constant message_info: message4x16_type := ( --123456789
              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)); 

一切正常smoothily這樣,但我不能想辦法將頻率數據實現到消息中,就像在C中使用%i一樣。我知道'record'語句,但不知道如何在這種情況下使用它。任何其他實現數據的方式都非常受歡迎。

謝謝你正手。

+0

你的意思是「將頻率數據應用到消息中」是什麼意思?用數字值的ASCII字符串形式替換'000'? –

+0

你知道串連符號'&'嗎? – JCLL

+0

聲明後,您無法修改常量的值。這表明您要麼使用4x16顯示器的隨機訪問功能,要麼創建信號或可變行緩衝器字符串,可以將常量字符串複製到,編輯並隨後寫入顯示器。合成條件的東西需要固定的長度,這就是爲什麼你不能在VHDL中找到C字符串格式。 – user1155120

回答

3

聲明類型,常量和信號作爲前:

-- 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 := (
--123456789
"FREE MODE  ", 
"PARCOURS  ", 
"- - - - - - - - ", 
" - - - - - - - -" 
); 
constant message_info : message4x16_type := (
--123456789
"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; 

用例:

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; 

用於所請求的行中的第一種情況下的測試。第二種情況會覆蓋特定位置的常量值。

我額外提取了字符到slv轉換成函數。

+0

非常感謝!這正是我所期待的! – nicolaasb

相關問題