社区导航

 

搜索
查看: 1194|回复: 0

炼狱传奇-字符状态机之战

[复制链接]

118

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-8-5 16:18 | 显示全部楼层 |阅读模式
作为一个电子男,一直被女孩子认为是刻板、不懂浪漫的,其实不然,我们可以以我们独特而又与众不同的方式来表达我们的浪漫情怀。这一战我们就用我们电子男特有的方式对我们最亲爱的人说一声ILoveYou!当然这句深情的话我们是用Verilog说的呦!下面来看看说出这句话需要怎样的准备:
无标题.png
首先设计一个电路,输入输出如上图所示,输入端cap_flow的输入是顺序输入的大写字母数据流,输入端low_flow输入的是小写字母数据流,输出端output_flow输出的是从两个输入字母流中检出的字符组成的最深情的一句话ILoveYou!(注:大写字母数据和小写字母的产生方式均是用ASCII值来实现的)
状态机通过检测cap flow 端口和b flow端口的数据流,分11个状态来完成检测,其中8个状态依次捕获“I Love You”中每个字母的ASCII值,每当捕获到相应字符的ASCII值,则将相应字符的ASCII值输出到输出寄存器output_flow,另外3个状态是用于输出I之后空格的ASCII值、Love之后的空格的ASCII值以及You之后的“!”的ASCII值。
下面我们就来设计这个电路:
首先,新建一个工程,为了工程名方便识别,取名iloveu
无标题.png
然后建立起顶层文件
无标题.png
具体如下:

1.         端口定义:
无标题.png
2.      控制逻辑
无标题.png

无标题.png

无标题.png

最后编写测试代码如下:
无标题.png

无标题.png

在软件中设置iloveu_tb为测试文件之后,查看仿真波形,将cap_flow、low_flow和output_flow的radix设置为ASCII
无标题.png
放大上图,可以看到cap_flow和low_flow分别为顺序的大写字母和小写字母,output_flow输出端为ILoveYou!
         然而在现实生活中,处处存在偶然,字母的ASCII值的出现也并非你我理想中的按照顺序出现,然而你是否依旧爱的深沉,该如何知晓呢?我们需要测试,给大家介绍一个在Verilog测试中应用比较广泛的函数 $random,这个函数用于产生一个32位的随机数,它是一个带符号的整形数。下面给大家介绍一下如何用该函数产生某一范围的随机数,$random % a,其中a > 0,它可以产生一个范围为(-a + 1)~ (a- 1) 中的随机数,{$random}% a, 其中a> 0, 它可以产生一个范围
为0~ (a - 1) 的随机数。由于英文字母总共有26个,我们可以利用如下语句来产生随机的大写字母流,和小写字母流:
         reg [7:0] cap_flow;           //随机大写字母输入
reg [7:0] low_flow;           //随机小写字母输入
cap_flow = 65 + {$random} % 26;
low_flow = 97 + {$random} % 26;
大家稍加思考就可明白其中的原因啦!下面就让我们把这几行代码用于测试中来测试一下你是否依旧爱的深沉呢?看仿真就可以知道了。
无标题.png

仿真截图如下:
无标题.png
由于页面所限,不能将仿真截图放的很大,大家要想验证,可以编写相应代码后,仿真观察。


此帖出自FPGA/CPLD论坛


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-2 22:23 , Processed in 0.089326 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表