디지털 IC 설계 연구 노트 _ 시퀀스 감지

디지털 IC 설계 연구 노트

6. 시퀀스 감지

1. 设计思想
2. Verilog 代码
3. Modelsim仿真
  • 감지 시퀀스 "Hello"

1 디자인 아이디어
여기에 사진 설명 삽입

  1. 데이터 스트림 입력은 "H"를 기다립니다. "H"가 감지되면 상태 2로 들어가고, 그렇지 않으면 "H"를 계속 기다립니다.
  2. 현재 문자가 "e"인지 확인하고 "e"이면 상태 3을 입력하고 그렇지 않으면 1을 반환합니다.
  3. 현재 문자가 "l"인지 확인하고, 그렇다면 상태 4로 들어가고, 그렇지 않으면 상태 1로 돌아갑니다.
  4. 현재 문자가 "l"인지 확인하고, 그렇다면 상태 5로 들어가고, 그렇지 않으면 상태 1로 돌아갑니다.
  5. 현재 문자가 "o"인지 확인하십시오. 그렇다면 led 제어 핀을 구동하고 상태를 전환하고 상태 1로 돌아가 다음 "H"를 기다립니다. 그렇지 않으면 상태 1로 돌아갑니다.

2 Verilog 코드

module fsm_hello#(//one hot code
	parameter CH_H = 5'b00001,//00001 
	parameter CH_e = 5'b00010,//00010
	parameter CH_l1 = 5'b00100,//00100
	parameter CH_l2 = 5'b01000,//01000
	parameter CH_o = 5'b10000 //10000

)
(
	input clk, //50M
	input rst_n,
	input [7:0] data, //ASCII code
	
	output reg led
);
	reg [4:0] state;

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			led <= 1'b1;
			state <= CH_H;
			end else begin
				case(state)
					CH_H:
						if(data == "H")begin
							state <= CH_e;
							led <= led;
						end else begin
							state <= CH_H;
							led <= led;
							end
					CH_e:
						if(data == "e")begin
							state <= CH_l1;
							led <= led;
						end else begin
							state <= CH_H;
							led <= led;
							end
					CH_l1:
						if(data == "l")begin
							state <= CH_l2;
							led <= led;
						end else begin
							state <= CH_H;
							led <= led;
							end
					CH_l2:
						if(data == "l")begin
							state <= CH_o;
							led <= led;
						end else begin
							state <= CH_H;
							led <= led;
						end	
					CH_o:
						if(data == "o")begin
							state <= CH_H;
							led <= ~led;
						end else begin
							state <= CH_H;	
							led <= led;
							end
						default: begin
							state <= CH_H;
							led <= led;
						end
				endcase
				
			end
	end

endmodule

`timescale 1ns/1ns
`define clock_period 20

module tb_fsm_hello;
	reg clk;
	reg rst_n;
	reg [7:0] ascii;
	wire led;
	
	fsm_hello uut(
		.clk(clk),
		.rst_n(rst_n),
		.data(ascii),
		.led(led)
	);
	
	initial clk = 1;
	always #(`clock_period/2) clk = ~clk;
	
	initial begin
		rst_n = 0;
		ascii = 0;
		#(`clock_period*200);
		rst_n = 1;
		#(`clock_period*200+1);
		forever begin
			ascii = "I";
		#(`clock_period);
			ascii = "A";
		#(`clock_period);
			ascii = "M";
		#(`clock_period);
			ascii = "Y";
		#(`clock_period);
			ascii = "H";
		#(`clock_period);
			ascii = "M";
		#(`clock_period);
			ascii = "n";
		#(`clock_period);
			ascii = "A";
		#(`clock_period);
			ascii = "H";
		#(`clock_period);
			ascii = "e";
		#(`clock_period);
			ascii = "l";
		#(`clock_period);
			ascii = "l";
		#(`clock_period);
			ascii = "o";
		#(`clock_period);
			ascii = "A";
		#(`clock_period);
			ascii = "M";
		#(`clock_period);
			ascii = "X";
		#(`clock_period);
			ascii = "A";
		#(`clock_period);
			ascii = "M";
		#(`clock_period);
			ascii = "X";
		#(`clock_period);		
		
		end
		
		
	end

endmodule

2. Modelsim 시뮬레이션
여기에 사진 설명 삽입
[참고] : 개인 학습 노트, 실수가 있으면 알려주세요. 이건 예의입니다 ~~~

추천

출처blog.csdn.net/weixin_50722839/article/details/109584305