使用verilog代码,设计电路,判断输入序列能否被三整除,能的时候输出1,不能的时候输出0
分析:一个输入被三除,对于余数来说只存在三种可能,分别为0,1,2。加上IDLE的默认状态,我们需要四个状态。但是注意是一边位移一边输入
1、当前能被3整除,余数为0。后续输入1,整体扩大2倍+1,所以次态余数为2*0+1=1;
2、当前能被3整除,余数为0。后续输入0,整体扩大2倍,依然能整除,次态余数为2*0=0;
3、当前余数为1,后续输入0,整体扩大2倍,所以次态余数为2*1=2;
4、当前余数为1,后续输入1,整体扩大2倍+1,次态余数为2*1+1=3可以被整除,次态余数为0;
5、当前余数为2,后续输入0,次态余数2*2=4,除3后次态余数为1;
6、当前余数为2,后续输入1,次态余数2*2+1=5,除3后次态余数为2;
module m3(clk,rst,seq,test);
input clk,rst,seq;
output test;
reg [2:0]state,nstate;
parameter IDLE=3'd0,s0=3'd1,s1=3'd2,s2=3'd3;
always@(posedge clk or negedge rst)begin
if(!rst)
state<=IDLE;
else
state<=nstate;
end
always@(*)begin
case(state)
IDLE: nstate=seq?s1:s0;
s0: nstate=seq?s1:s0;
s1: nstate=seq?s0:s2;
s2: nstate=seq?s2:s1;
default:nstate=IDLE;
endcase
end
assign test=state==s0?1:0;
endmodule
`timescale 1ns/1ps
module m3_tb();
reg clk;
reg rst;
reg seq;
wire test;
m3 u1(.clk(clk),.rst(rst),.seq(seq),.test(test));
always
#5 clk=~clk;
always #9.999 seq=$random;
initial begin
clk=0;
rst=1;
#15 rst=0;
#30 rst=1;
#3000;
$stop;
end
endmodule