Verilog设计“111”检测器与“01110”检测器并测试所有情况

这篇具有很好参考价值的文章主要介绍了Verilog设计“111”检测器与“01110”检测器并测试所有情况。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Verilog实现“111”检测器与“01110”检测器的设计

使用Quartus+modelsim完成本次设计

1. "111"检测器

Verilog设计“111”检测器与“01110”检测器并测试所有情况

分析

分析题目,得到其有限状态机为下图:
Verilog设计“111”检测器与“01110”检测器并测试所有情况

代码实现

module detector111(
	input X,
	input rst,
	input clk,
	output OUT
);
	reg [1:0]state;
	reg [1:0]next_state;
	parameter S0=2'd0,S1=2'd1,S2=2'd2,S3=2'd3;
	
	assign OUT = (state==S3)?1:0;			//define OUT=1 when S3 state
	
	
	always @ (posedge clk or posedge rst) 
		if (rst)
			state  <=  S0;
		else
			state  <=  next_state;
	
	always@(*)
		case(state)
		S0:if(X) next_state <= S1;
			else 	next_state <= S0;
		S1:if(X)	next_state <= S2;
			else  next_state <= S0;
		S2:if(X)	next_state <= S3;
			else	next_state <= S0;
		S3:if(X) next_state <= S3;
			else  next_state <= S0;
		default: next_state <= S0;
		endcase

endmodule 

Testbench

`timescale 1 ns/ 1 ns
module detector111_vlg_tst();
reg X;
reg clk;
reg rst;                                            
wire OUT;
                      
detector111 i1 (
	.OUT(OUT),
	.X(X),
	.clk(clk),
	.rst(rst)
);
	always #10 clk = ~clk;
	initial                                                
		begin                                                  
			 rst = 1;
			 clk = 0;
			#10 rst = 0; 
			#20 X = 1;
			#20 X = 0;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 X = 0;
			#20 X = 1;
			#20 X = 0;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 $stop;
		end				
	initial $monitor($time,"X=%b,OUT=%b",X,OUT);
endmodule

结果

Modelsim结果如下图所示,分析可知实现了题目要求。

Verilog设计“111”检测器与“01110”检测器并测试所有情况

逻辑综合出来的电路如下图所示:即只有S3状态才会输出OUT=1。

Verilog设计“111”检测器与“01110”检测器并测试所有情况

其中的state的状态机如下图所示(RLT viewer中所示),可见其与分析中绘制的状态机一致。

Verilog设计“111”检测器与“01110”检测器并测试所有情况


2. "01110"检测器

Verilog设计“111”检测器与“01110”检测器并测试所有情况

分析

题目中关键点为一下几点:

  • 检测01110,且他们不重叠。意思为要求检测到一个01110,然后从一个新的开始检测。
  • 同时输入AB,那么考虑A和B哪个是01110的开始标志
  • Z输出的是一个时钟周期宽度的高电平脉冲,所以要在always里进行赋值

根据题目绘制状态机如下图所示,其中S0表示01110中的0,以此类推,特别注意S1表示第一位是1即没有意义。其中输出为1即检测出01110的状态用红色标出

Verilog设计“111”检测器与“01110”检测器并测试所有情况
如果要测试所有情况,那么就是讲detector01110模块中的所有case模块都遍历到,及遍历以下所有情况,需要修改的只有testbench。而如果遍历所有情况,通过分析知道,每次AB的状态为2bit数,可以理解为4种前进的方向,然后一共5个状态,那么要遍历的次数为4^5=1024种情况,遍历即可。

			case(state)
			S0:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S011;
			endcase
			S01:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S0111;
			endcase		
			S011:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S1;
				4'b11:state<=S1;
			endcase			
			S0111:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase
			S1:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase	

代码实现

module detector01110(
	input clk,
	input clr,
	input A,
	input B,
	output reg Z	
);
	reg [3:0]state;
	parameter	S0 = 4'b0,
			  	S01 = 4'b01,
			  	S011 = 4'b011,
				S0111 = 4'b0111,
				S1 = 4'b10;//S1 is random because S01 has already existed
	always@(posedge clk or negedge clr)
	begin
	if(!clr) 
		begin 
		state <= S0;
		Z<=0;		
		end //for {A,B}=4'b00;
	else 
		begin
			Z = (state==S011&{A,B}==4'b10 | state==S0111&A==4'b0)?1:0;
			case(state)
			S0:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S011;
			endcase
			S01:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S0111;
			endcase		
			S011:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S1;
				4'b11:state<=S1;
			endcase			
			S0111:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase
			S1:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase		
		endcase		
		end	
	end
endmodule 

Testbench

`timescale 1 ns/ 1 ns
module detector01110_vlg_tst();
reg A;
reg B;
reg clk;
reg clr;
// wires                                               
wire Z;
                      
detector01110 ins1 (
// port map - connection between master ports and signals/registers   
	.A(A),
	.B(B),
	.Z(Z),
	.clk(clk),
	.clr(clr)
);
	always #10 clk = ~clk;
	
	integer i0;
	integer i1;
	integer i2;
	integer i3;
	integer i4;
	//5 layers circulation
    //4^5=1024
	initial                                                
		begin                                                  
			clr = 0;
			clk = 0;
			{A,B} = 4'b00;
			#15 clr = 1; 
			for(i0=0;i0<4;i0=i0+1)
			begin
				#20 {A,B} = i0;
				for(i1=0;i1<4;i1=i1+1)
				begin
					#20 {A,B} = i1;
					for(i2=0;i2<4;i2=i2+1)
					begin 
						#20 {A,B} = i2;
						for(i3=0;i3<4;i3=i3+1)
						begin
							#20 {A,B} = i3;
							for(i4=0;i4<4;i4=i4+1)
								#20 {A,B} = i4;
						end		
					end	
				end	
			end					
			#50 $stop;
		end			
		
	initial $monitor($time,"Z=%b",Z);
endmodule

结果

Modelsim仿真结果如下所示,经分析与预期一致
Verilog设计“111”检测器与“01110”检测器并测试所有情况

Verilog设计“111”检测器与“01110”检测器并测试所有情况

逻辑综合后的结果如下图所示:

Verilog设计“111”检测器与“01110”检测器并测试所有情况

state里的状态机如下图所示,符合预期:

Verilog设计“111”检测器与“01110”检测器并测试所有情况文章来源地址https://www.toymoban.com/news/detail-476348.html

到了这里,关于Verilog设计“111”检测器与“01110”检测器并测试所有情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 序列检测器的verilog实现

    设计一个序列检测同步时序逻辑电路,要实现的功能如下: 当已有输入码流出现序列 111000或101110时输出检测信号为1 ,否则输出为0。在时序上检测到完整序列的 下一个时钟周期 输出检测结果。输入信号有效为1时表示当前输入有效,否则表示无效。之前输入依旧计入序列中

    2024年02月06日
    浏览(54)
  • 利用Verilog HDL实现序列检测器,附上仿真程序。

    序列检测器的逻辑功能就是将一个指定的比特序列从一串较长的比特流中识别出来。 例如:针对一个较长的比特流010010010011110101010…,我们希望能将比特序列为“10010”的序列检测出来,并且每次检测到10010就将输出置“1”. 注意:如序列”100100100…\\\",根据以上的介绍,会在

    2024年02月06日
    浏览(65)
  • vivado序列检测器verilog代码ego1开发板验证

    名称:vivado序列检测器verilog代码ego1开发板验证 软件:VIVADO 语言:Verilog 代码功能: 设计一个111序列检测器。 要求:当检测到3个或3个以上的1时,输出为1,其他输入情况输出为0. 画出状态转移图,完成 Verilog描述。 本代码已在ego1开发板验证,开发板如下,其他开发板可以修改管

    2024年02月03日
    浏览(56)
  • 简单的状态机设计——序列检测器

    1.序列检测器 序列检测器是时序数字电路中非常常见的设计之一。它的逻辑功能是将一个指定的序列从数字码流中识别出来。 2.例1:\\\"10010\\\"序列检测器 对串行输入的数据进行检测,检测“10010”。设X为数字码流输入,Z为检出标记输出,高电平表示“发现指定序列”,低电平表

    2024年02月11日
    浏览(43)
  • 毕业设计 单片机心率检测器设计与实现 - stm32

    Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于STM32的心率检测器的设计与实现 大家可用于 课程设计 或 毕业设计 主控:STM32F103C8T6 MAX30102传感器 OLED屏幕:用于显示实时心率波形 未测试时的状态:心率波形显为平稳直线,即0 将手指放上进行心率测试: 还可以把

    2024年02月07日
    浏览(44)
  • 用jk触发器设计一个011序列检测器的设计分析过程

       心得体会:经过此次设计,加深了对时序逻辑电路的理解,当要求对一个连续的一串信号进行输入输出处理时可以用到有记忆存储、反馈功能的jk触发器或者d触发器。

    2024年02月04日
    浏览(47)
  • 【opencv】传统目标检测:Haar检测器实现人脸检测

    传统目标分类器主要包括Viola Jones Detector、HOG Detector、DPM Detector,本文主要介绍VJ检测器,在VJ检测器基础上发展出了Haar检测器,Haar检测器也是更为全面、使用更为广泛的检测器。 Viola Jones Detector是作为人脸检测器被Viola和Jones提出来的,后来Rainer Lienhart和Jochen Maydt将这个检测

    2024年02月12日
    浏览(40)
  • 1001序列检测器

    multisim仿真文件:1001序列检测器(mealy机)-单片机文档类资源-CSDN下载 modelsim仿真文件:1001序列检测器modelsim仿真和测试文件-单片机文档类资源-CSDN下载 实验报告:1001序列检测器实验报告-单片机文档类资源-CSDN下载 电 子 科 技 大 学 课程设计名称:           1001 序列检

    2024年02月06日
    浏览(47)
  • OpenCV分类检测器训练

    OpenCV中有两个程序可以训练级联分类器: opencv_haartraining 和opencv_traincascade。opencv_traincascade 是一个新程序,使用OpenCV 2.x API 以C++ 编写。这二者主要的区别是 opencv_traincascade 支持 Haar、Hog和 LBP(Local Binary Patterns) 三种特征,并易于增加其他的特征。与Haar特征相比,LBP特征是整数

    2024年02月17日
    浏览(46)
  • ChatGPT检测器(Detector)

    现阶段可使用的Detector如以下所示,在网页端有5个(3个支持中文),api有3个途径,代码运行成功的有一个。 名称 地址 特性 GPTZero https://gptzero.me/ 支持中英文,判定较为严格,有开源代码 OpenAI GPT2 Output Detector https://openai-openai-detector.hf.space/ 支持中英文,判定宽松 Hello-Simple

    2023年04月27日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包