简单的序列检测器
//输入大写字母、小写字母和符号,输出 I Love You! 字符串module ily(
input wire clk, //系统时钟
input wire rst_n, //复位
input wirelowercase,//小写字母和符号
input wire capital, //大写
output reg love //输出字符串 I Love You!
);
reg state; //状态寄存器
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
love<= 0; //初始化
state <= 0; //状态赋初值
end
else
begin
case(state)
0:begin //这里的“I”也可以写成I的asciilove=73
if(capital == "I") //检测到 I 输出,并跳转
begin
love <= "I";
state <= 1;
end
else
state <= 0; //检测不到 I 一直等待
end
1:begin
if(lowercase == " ")//检测到空格输出 也可以写成空格的ascii码 love=64
begin
love <= " ";
state <= 2;
end
else
state <= 1;//检测不到空格 一直等待
end
2:begin
if(capital == "L")//检测到L输出love=76
begin
love <= "L";
state <= 3;
end
else
state <= 2;
end
3:begin
if(lowercase == "o")//检测到o输出love=111
begin
love <= "o";
state <= 4;
end
else
state <= 3;
end
4:begin
if(lowercase == "v")//检测到v输出love=118
begin
love <= "v";
state <= 5;
end
else
state <= 4;
end
5:begin
if(lowercase == "e")//检测到e输出love=101
begin
love <= "e";
state <= 6;
end
else
state <= 5;
end
6:begin
if(lowercase == " ")//检测到空格输出love=64
begin
love <= " ";
state <= 7;
end
else
state <= 6;
end
7:begin
if(capital == "Y")//检测到Y输出love=89
begin
love <= "Y";
state <= 8;
end
else
state <= 7;
end
8:begin
if(lowercase == "o")//检测到o输出love=111
begin
love <= "o";
state <= 9;
end
else
state <= 8;
end
9:begin
if(lowercase == "u")//检测到u输出love=117
begin
love <= "u";
state <= 10;
end
else
state <= 9;
end
10:begin
if(lowercase == "!")//检测到!输出love=33
begin
love <= "!";
state <= 0;
end
else
state <= 10;
end
default : state <= 0;
endcase
end
end
endmodule
测试代码如下:
`timescale 1ns/1ns//时间单位是1ns 时间精度是1ns
module ily_tb;
reg clk;
reg rst_n;
reg lowercase;
reg capital;
wire love;
initial begin
clk = 1;
rst_n = 0;
lowercase = 0;
capital = 0;
#200
rst_n = 1;
//随机输出
/*forever begin
#20 lowercase = "a"; capital = "A";
#20 lowercase = "o"; capital = "B";
#20 lowercase = "c"; capital = "I";
#20 lowercase = "v"; capital = "L";
#20 lowercase = "!"; capital = "D";
#20 lowercase = "a"; capital = "Y";
#20 lowercase = "e"; capital = "S";
#20 lowercase = " "; capital = "A";
#20 lowercase = "u"; capital = "A";
end*/
//有序输出
/* forever begin
#20 capital = "I";
#20 lowercase = " ";
#20 capital = "L";
#20 lowercase = "o";
#20 lowercase = "v";
#20 lowercase = "e";
#20 lowercase = " ";
#20 capital = "Y";
#20 lowercase = "o";
#20 lowercase = "u";
#20 lowercase = "!";
end */
end
/* initial//通过任务产生随机数
begin
forever begin
#400 //启动任务
locale();//任务必须写在initial块里启动
end
end
initial
begin
forever begin
#400
cap();
end
end
task cap(); //产生大写字母的任务
integer i;
begin
for(i=0;i<200;i=i+1)
begin
@(posedge clk);
capital <= {$random}%i;
end
end
endtask
task locale(); //产生小写字母的任务
integer i;
begin
for(i=0;i<200;i=i+1)
begin
@(posedge clk);
lowercase <= {$random}%i;
end
end
endtask */
initial begin//产生随机数
forever begin
#20 lowercase <= {$random}%128;
end //产生0-127之间的一个数
end //如果写成 $ramdom%128 会产生一个-127~127之间的数
initial begin
forever begin
#20 capital <= {$random}%128;
end
end
always #10 clk=~clk;
ily ily_inst(
.clk (clk),
.rst_n (rst_n),
.lowercase (lowercase),//小写字母和符号
.capital (capital), //大写
.love (love)
);
endmodule 提个建议,关于楼主的注释习惯方面的。端口信号名一定要定义,还有,写代码很重要,但是配套的文档讲解更加重要。希望文档中多多描述,最起码要具备三点,设计目的,设计思路,设计结论。设计目的就是你想实现的效果,设计思路是你针对目的,在设计代码架构时的思路,例如使用状态机、线性序列机,状态机不一定强制要求有状态转移图,但是最起码要有状态介绍。设计结论,个人认为需要包含两点,第一,编译警告是否存在,如果存在且是可以接受的,讲明原因。第二,仿真结果,最起码有1~3张modelsim的仿真结果贴上来,以验证你的设计确实能够实现你想要的效果。 小梅哥 发表于 2015-8-6 08:28
提个建议,关于楼主的注释习惯方面的。端口信号名一定要定义,还有,写代码很重要,但是配套的文档讲解更加 ...
小梅哥点评很到位,另外,代码最好不要直接复制粘贴上来,而是需要先在notpad++里面编辑一下,这个你可以参考伟大的小梅哥编写的教程
评语很新颖 很到位 谢谢几位老师的建议,我以后会努力从这几方面改进的。以后还希望几位老师多多指点。 加油 :):):):):):) 简单的序列检测器 简单的序列检测器 简单的序列检测器 简单的序列检测器
页:
[1]