注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
Bruce李的个人空间 https://home.eeworld.com.cn/space-uid-611861.html [收藏] [复制] [分享] [RSS]
日志

关于北航夏宇闻verilog教材中序列检测器的一些讨论

热度 2已有 5894 次阅读2015-4-29 22:51 |个人分类:FPGA| 一个序列检测器

我学习verilog是参考的北航夏宇闻老师《verilog数字系统设计教程》。对其中第15章,例15.1的序列检测器的8个状态表示不能理解到位,自己结合之前学习的数字电路教程,写出了5个状态的状态机实现。现在就我设计的5个状态的状态机做一些说明。希望大家能告诉我夏老师教材中的这8个状态的设计原因以及你的想法。

讨论来自--较复杂时序逻辑实践第15章--夏宇闻

序列检测器10010

在时序逻辑的设计中,我初学常没有直接写出状态转移图的直觉,这次设计,用到了数字电路基础中,设计状态转移表,再去设计状态转移图。这样在设计中,只用到了5个状态,分别是IDLE, S1,S2,S3,S4这四个状态。其中,在化简时,将S5S2化简成为一个状态S2

其中各个状态

X:输入

Z:输出(当输入序列为10010时,输出为1,否则为0

S0(IDLE):没有收到一个有效的数

S1:收到1个有效的数

S2:收到2个有效的数

S3:收到3个有效的数

S4:收到4个有效的数

S5:收到5个有效的数

根据要求,我设计一个mealy型的状态转移图,然后想根据状态转移表,设计有限状态机。

我看到S5S2状态重叠,则化简状态转移图,将S5S2合并为S2           

新图为

则状态转移图为

在设计有限状态机时候,特别注意抓三点:输入,输出,确立状态(当前状态,下一状态)

这里用独热码来分配状态

IDLE = 5'b00001,

S1  = 5'b00010,

S2  = 5'b00100,

S3  = 5'b01000,

S4  = 5'b10000;

代码如下

//------------------SEQDET.v----------------------------------------

module SEQDET(State,Z,X,Clk,Rst_n

    );

//-------------定义输入输出-----------------

input X,Clk,Rst_n;

output Z;

output [4:0] State;

//------------定义内部寄存器----------------

reg [4:0] State;

wire Z;

//-------------确定状态变量-----------------

parameter IDLE = 5'b00001,

 S1   = 5'b00010,

 S2   = 5'b00100,

          S3   = 5'b01000,

              S4   = 5'b10000;

//---------------实现功能-------------------

assign Z=((State==S4)&&(X==0));//如果第四位正确而且下一位输入变量X是0

always@(posedge Clk)

if(!Rst_n)

begin

State <= IDLE;

end

else

case(State)

IDLE:

if(X==1)

State <= S1;

else

State <= IDLE;

S1:

if(X==0)

State <= S2;

else

State <= S1;

S2:

if(X==0)

State <= S3;

else

State <= S1;

S3:

if(X==1)

State <= S4;

else

State <= IDLE;

S4:

if(X==0)

State <= S2;

else

State <= S1;

default:

State <= IDLE;

endcase

endmodule

//--------------------------------代码如下------------------------------------------------------------
`timescale 1ns / 1ps
module SEQDET(State,Z,X,Clk,Rst_n
    );
//-------------定义输入输出-----------------
input X,Clk,Rst_n;
output Z;
output [4:0] State;
//------------定义内部寄存器----------------
reg [4:0] State;
wire Z;
//-------------确定状态变量-----------------
parameter IDLE = 5'b00001,
 S1   = 5'b00010,
 S2   = 5'b00100,
          S3   = 5'b01000,
              S4   = 5'b10000;
//---------------实现功能-------------------
assign Z=((State==S4)&&(X==0));//如果第四位正确而且下一位输入变量X是0
always@(posedge Clk)
if(!Rst_n)
begin
State <= IDLE;
end
else
case(State)
IDLE:
if(X==1)
State <= S1;
else
State <= IDLE;
S1:
if(X==0)
State <= S2;
else
State <= S1;
S2:
if(X==0)
State <= S3;
else
State <= S1;
S3:
if(X==1)
State <= S4;
else
State <= IDLE;
S4:
if(X==0)
State <= S2;
else
State <= S1;
default:
State <= IDLE;
endcase
endmodule
//----------------------------------------------测试文件--------------------------------------------
`timescale 1ns / 1ps
`define CLKCYCLE 50
module TEST_SEQDET;

// Inputs
reg Clk;
reg Rst_n;
reg [23:0] data;

// Outputs
wire [4:0] State;
wire Z;
wire X;
assign X=data[23];
// Instantiate the Unit Under Test (UUT)
SEQDET UTEST_SEQDET (
.State(State), 
.Z(Z), 
.X(X), 
.Clk(Clk), 
.Rst_n(Rst_n)
);
always #`CLKCYCLE Clk=~Clk;
initial begin

Clk = 0;
Rst_n = 0;
#100;
#100 Rst_n = 1;
data= 20'b1100_1001_0000_1001_0100;//移位输出
#(`CLKCYCLE*1000)$stop;
end
   always@(posedge Clk)
#2 data={data[22:0],data[23]};
endmodule
//---------------------------------------仿真波形----------------------------------------------------

如图,观察波形,确实也实现了序列检测器的功能。
这里有些疑问:
教材的那八个状态是怎么观察分配出来的呢?尤其是F,G这两个状态,是怎么找出来的?
希望浏览过我贴子的FPGA爱好者能给予解答。

还有,因为喜欢电子,电子工程世界网站的页面规划还蛮有条有理的,我打算常驻这个论坛了。希望更多的电子爱好者能把一些平时遇到的问题还有经验总结下来。如果可以提供开源的项目代码那是更好了。希望咱们电子界能有好的学习气氛。

---------------------------------------------------此帖因为有论坛留言重新编辑---------------------------------------------------------
留言的主要问题是:序列检查器应该能检查出10010,但10010出现后应该有一个信号表明已经发现该序列,但当后面还有010出现时您设计的序列检查器能不能发现这也符合10010序列。虽然这两个相同序列有一部重合。即后面有效序列中的最前的10其实是属于上一个有效序列最后两个比特。您考虑了这个问题了吗?

答:我在之前的设计中注意到重叠序列的检测,在代码中用IDLE,S1-S4来避免了重叠序列不能检测出的问题。

鉴于ID为夏宇闻的用户在此帖下面留言我重新查看了我的这的这个讨论帖,并再次仿真了波形,用红色记号标出了序列检测器对于重叠序列可以正常检测的结果,现在将仿真结果再附图如下:

开始阶段

中间部分仿真

标记的是信号检测器的输出和输出,X为输入,Z为输出,经过代码设计和仿真观察,我的设计能够检查出重叠序列。

Bruce李
西安电子科技大学
2015-05-16


发表评论 评论 (3 个评论)
回复 夏宇闻 2015-4-30 15:36
序列检查器应该能检查出10010,但10010出现后应该有一个信号表明已经发现该序列,但当后面还有010出现时您设计的序列检查器能不能发现这也符合10010序列。虽然这两个相同序列有一部重合。即后面有效序列中的最前的10其实是属于上一个有效序列最后两个比特。您考虑了这个问题了吗?
回复 夏宇闻 2015-4-30 16:08
您是一个十分认真学习的好学生,喜欢动脑筋,思考和提出问题这个习惯非常好,希望您继续努力!
回复 zaza灰 2018-12-13 21:47
我还弄出来7个状态,把书中的F态合并到A了,
书中代码关于G态里面的“else state <=B及该行的注释”也不能理解啊。。不应该就是else state <=G吗?
西电师兄还在吗

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章