打印
[VHDL]

玩转VHDL-025 字符串转换为std_logic_vector输出

[复制链接]
759|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ucx|  楼主 | 2021-3-8 12:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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就是我们需要的结果,在实际可综合模块中用作输出。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

ucx

29

主题

89

帖子

5

粉丝