디지털 IC 설계 연구 노트
6. 시퀀스 감지
1. 设计思想
2. Verilog 代码
3. Modelsim仿真
- 감지 시퀀스 "Hello"
1 디자인 아이디어
- 데이터 스트림 입력은 "H"를 기다립니다. "H"가 감지되면 상태 2로 들어가고, 그렇지 않으면 "H"를 계속 기다립니다.
- 현재 문자가 "e"인지 확인하고 "e"이면 상태 3을 입력하고 그렇지 않으면 1을 반환합니다.
- 현재 문자가 "l"인지 확인하고, 그렇다면 상태 4로 들어가고, 그렇지 않으면 상태 1로 돌아갑니다.
- 현재 문자가 "l"인지 확인하고, 그렇다면 상태 5로 들어가고, 그렇지 않으면 상태 1로 돌아갑니다.
- 현재 문자가 "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 시뮬레이션
[참고] : 개인 학습 노트, 실수가 있으면 알려주세요. 이건 예의입니다 ~~~