本帖最后由 ucx 于 2021-3-8 12:28 编辑
在我们的电路设计中经常会遇到液晶显示字符串的情景,比如要显示"Welcom to 2021!",那么如果用VHDL来实现,首先要把每个字符转换成std_logic_vector以便于和其他模块连接。今天就以顺序输出各个字符这一功能为例来展现如何灵活运用VHDL的数据类型变换。以下代码可以在ModelSim中正常运行,除了时钟生成语句之外,其余均是可综合的。
library ieee;
Use ieee.std_logic_1164.all, ieee.numeric_std.all;
entity top is
end top;
architecture pure_sim of top is
signal clock : std_logic := '0';
7. constant display : string := "welcom to 2021!";
signal cn : integer range 0 to display'length-1 := 0;
signal ch_ascii : integer range 0 to 255;
signal ch_std : std_logic_vector(0 to 7) := X"00";
begin
Process
begin wait for 10 ns;
clock <= not clock;
End process;
16. Process begin wait until clock='1';
if cn=display'length-1 then
cn <= 0;
else
cn <= cn+1;
end if;
22. End process;
23. ch_ascii <= character'pos(display(cn+1)) when cn<= display'length-1 else
0;
25. ch_std <= std_logic_vector(TO_SIGNED(ch_ascii,8));
End pure_sim;
第7行中常量display用于表示显示的内容。
行16到22就是为了产生顺序输出各个字符的时序计数器。
行23的ch_ascii是字符的ASCII值,这里用到了VHDL的pos属性实现类型转换。式中书写为display(cn+1)而不是display(cn),是因为字符串的默认起始序号是1。
行25是numeric_std库的类型转换语句,实现了从integer到std_logic_vector类型的转换。由25行得到的ch_std就是我们需要的结果,在实际可综合模块中用作输出。
|