题目
输入一个序列(每周期输入一个比特,高位先输入),判断当前接收到的bit所组成的无符号整数是否为3的倍数。例如
1:输出为0
10:输出为0
100:输出为0
1001:输出为1(模3为0)
方法
设当前接收到的比特所组成的数为x,下个输入的bit为b,则b被接收后,x更新为
x<----x*2+b
根据上式,我们可以设计状态机如下:
设置状态IDLE,S0,S1,S2,IDLE为空闲状态,接收第一个比特后进入S_状态,S0表示当前数模三为0,S1表示当前数模三为1,S2表示当前数模三为2,则有如下状态转换
S0:当b=0时,状态保持不变,当b=1时,进入S1状态;
S1:当b=0时,进入S2状态(1*2+0),当b=1时,进入S0状态(1*2+1=3);
S2:当b=0时,进入S1状态(2*2+0=4),当b=1时,进入S2状态(2*2+1=5(%3=2));
IDLE:当b=0时,进入状态S0,否则进入S1状态。
代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/19 17:51:25
// Design Name:
// Module Name: mod3
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
//功能:序列串行输入,判断当前序列能否被3整除
module mod3(
input logic clk,
input logic rst,
input logic bit_in,
output logic detected
);
logic [511:0] buff; //仅为了仿真
logic ref_out; //参考输出
logic error;
assign ref_out=(buff%3==0)?1'b1:1'b0;
assign error=(rst==0&&ref_out!=detected)?1'b1:1'b0;
//
typedef enum bit [2:0] {
IDLE,S0,S1,S2 //S0:mod 3 =0,S1:mod 3=1,S2:mod 3=2
} State;
State cur_state,next_state;
//buff
always_ff@(posedge clk,posedge rst)
if(rst)
buff<=0;
else
buff<={buff[510:0],bit_in};
//三段式状态机第一段
always_ff@(posedge clk,posedge rst)
if(rst)
cur_state<=IDLE;
else
cur_state<=next_state;
//三段式状态机第二段
always_comb
begin
case(cur_state)
IDLE:if(rst)
next_state=IDLE;
else if(bit_in)
next_state=S1;
else
next_state=S0;
S0:if(bit_in)
next_state=S1; //0*2+1=1
else
next_state=S0; //0*2+0=0
S1:if(bit_in) //1*2+1 mod 3 =0
next_state=S0;
else //1*2+0=2
next_state=S2;
S2:if(bit_in) //2*2+1 mod 3 =2
next_state=S2;
else //2*2+O mod 3 =1
next_state=S1;
default:next_state=IDLE;
endcase
end
//输出
always_ff@(posedge clk,posedge rst)
if(rst)
detected<=0;
else
begin
case(next_state)
IDLE:detected<=0;
S0:detected<=1;
S1:detected<=0;
S2:detected<=0;
default:detected<=0;
endcase
end
endmodule
测试平台
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/19 18:47:28
// Design Name:
// Module Name: mod3_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module mod3_test(
);
logic clk;
logic rst;
logic bit_in;
logic detected;
//clk
initial begin
clk=0;
end
always
#5 clk=~clk;
initial
begin
rst=1;
#50
rst=0;
end
//
always@(posedge clk,posedge rst)
if(rst)
bit_in<=0;
else
bit_in<=$random%2;
//inst
mod3 U(.*);
endmodule
仿真波形:
可以看到,rst为0后,error信号一直为低,功能无误。