IC验证学习笔记(手撕代码)-5模三检测器

使用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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值