EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——字符状态机之战 & {! m4 s+ H c- {
% [2 l* r9 q1 d, e; o3 \7 q0 u作为一个电子男,一直被女孩子认为是刻板、不懂浪漫的,其实不然,我们可以以我们独特而又与众不同的方式来表达我们的浪漫情怀。这一战我们就用我们电子男特有的方式对我们最亲爱的人说一声ILoveYou!当然这句深情的话我们是用Verilog说的呦!下面来看看说出这句话需要怎样的准备: 首先设计一个电路,输入输出如上图所示,输入端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 然后建立起顶层文件 具体如下: - l# t1 @8 p0 @. F% K, M7 x
1. 端口定义: 2. 控制逻辑
( v/ x" U+ t6 U8 n" w9 I
7 _7 U! ~/ p( T6 R, ]+ z
# N7 R- V# p* d5 Z最后编写测试代码如下:
5 r8 t% b) |) S8 Y
2 w* r1 }. R9 Q6 U* m7 @- ~在软件中设置iloveu_tb为测试文件之后,查看仿真波形,将cap_flow、low_flow和output_flow的radix设置为ASCII 放大上图,可以看到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; 大家稍加思考就可明白其中的原因啦!下面就让我们把这几行代码用于测试中来测试一下你是否依旧爱的深沉呢?看仿真就可以知道了。 & Q, h# {% y# ?: C
仿真截图如下: 由于页面所限,不能将仿真截图放的很大,大家要想验证,可以编写相应代码后,仿真观察。 k$ U) w, _. @3 g( e0 C9 t0 Z
|