简介
今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。开发板输入时钟为50MHz。
序列检测器设计
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
**关键步骤:**正确码的接收必须是连续的,要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
利用Moore状态机和Mealy状态机来分别实现对输入序列数"1101"的检测。
Moore状态机序列检测器设计
解题分析:
如果现态是s0,输入为0,那么下一状态还是停留在s0;如果输入1,则转移到状态s1。
在状态s1,如果输入为0,则回到状态s0;如果输入为1,那么就转移到s2。
在s2状态,如果输入为1,则停留在状态s2;如果输入为0,那么下一状态为s3。
在s3状态,如果输入为1,则转移到状态s4,输出1;如果输入为0,则返回状态s0。
在s4状态,如果输入为0,回到初始状态s0;如果输入为1,下一状态为s1。
状态转移图
Mealy状态机序列检测器设计
状态转移图
对比Mealy状态机与Moore状态机的状态图可知:
Moore状态机的检测结果输出是与时钟同步的;而Mealy状态机的检测结果输出是异步的,当输入发生变化时,输出就立即变化。因此Mealy状态机的输出比Moore状态机状态的输出提前一个周期。
代码:
Moore状态机序列检测器设计
`timescale 1ns/1ps
module seq_detect_moore(
input clk,
input rst_n,
input din,
output dout
);
localparam s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100;
reg [2:0] state_curt; //state current
reg [2:0] state_next; //state next
//first, state transtion
always@(posedge clk, negedge rst_n)
begin
if(!rst_n)
state_curt <= s0;
else
state_curt <= state_next;
end
//second, next state logic
always @ *
case(state_curt)
s0:if(din)
state_next = s1;
else
state_next = s0;
s1:if(din)
state_next = s2;
else
state_next = s0;
s2:
if(din)
state_next = s2;
else
state_next = s3;
s3:if(din)
state_next = s4;
else
state_next = s0;
s4:if(din)
state_next = s1;
else
state_next = s0;
default:
state_next = s0;
endcase
//thrid, output logic
assign dout = (state_curt==s4)? 1'b1:1'b0;
endmodule
Mealy状态机序列检测器设计
`timescale 1ns/1ps
module seq_detect_mealy(
input clk,
input rst_n,
input din,
output dout
);
localparam s0 = 2'b00,
s1 = 2'b01,
s2 = 2'b10,
s3 = 2'b11;
reg [1:0] state_curt;//state current
reg [1:0] state_next;//state next
//first, state transition
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
state_curt <= s0;
else
state_curt <= state_next;
end
//second, next state logic
always@(*)
begin
case(state_curt)
s0: if(din)
state_next = s1;
else
state_next = s0;
s1: if(din)
state_next = s2;
else
state_next = s0;
s2: if(din)
state_next = s2;
else
state_next = s3;
s3: if(din)
state_next = s0;
else
state_next = s0;
default:
state_next = s0;
endcase
end
//third, output logic
assign dout = ((state_curt == s3)&(din==1'b1))? 1'b1:1'b0;
endmodule
顶层文件
`timescale 1ns/1ps
module seq_top(
input clk,
input rst_n,
input din,
output dout0,
output dout1
);
seq_detect_moore m0(
.clk(clk),
.rst_n(rst_n),
.din(din),
.dout(dout0)
);
seq_detect_mealy m1(
.clk(clk),
.rst_n(rst_n),
.din(din),
.dout(dout1)
);
endmodule
测试文件
`timescale 1ns/1ps
module tb_seq_detect;
reg clk;
reg rst_n;
reg [0:0] din;
wire [0:0] dout0;
wire [0:0] dout1;
parameter DATA_NUM = 4'b1101;
reg [3:0] data;
always #10 clk = ~clk;
initial
begin
clk = 1'b0;
rst_n = 1'b0;
#100
rst_n = 1'b1;
data = DATA_NUM;
repeat(10000)
begin
@(posedge clk);
begin
data = {data[2:0],data[3]};
din = data[3];
end
end
end
seq_top uut(
.clk(clk),
.rst_n(rst_n),
.din(din),
.dout0(dout0),
.dout1(dout1)
);
endmodule
仿真结果:
对比Mealy状态机与Moore状态机的状态图可知:
Moore状态机的检测结果输出是与时钟同步的;而Mealy状态机的检测结果输出是异步的,当输入发生变化时,输出就立即变化。因此Mealy状态机的输出比Moore状态机状态的输出提前一个周期。