某XX科笔试题目:
首先需要画状态机:
module top(
input sys_clk, //50M 20ns
input rst_n ,
input din
);
reg [5:0] state_c,state_n;
reg out1;
parameter IDLE = 6'b000001;
parameter S1 = 6'b000010;
parameter S2 = 6'b000100;
parameter S3 = 6'b001000;
parameter S4 = 6'b010000;
parameter S5 = 6'b100000;
//四段式状态机
//第一段:同步时序always模块,格式化描述次态寄存器迁移到现态寄存器(不需更改)
always@(posedge sys_clk or negedge rst_n)begin
if(!rst_n)begin
state_c <= IDLE;
end
else begin
state_c <= state_n;
end
end
//第二段:组合逻辑always模块,描述状态转移条件判断
always@(*)begin
case(state_c)
IDLE:begin
if(din==1'b1)begin
state_n = S1;
end
else begin
state_n = state_c;
end
end
S1:begin
if(din==1'b0)begin
state_n = S2;
end
else begin
state_n = state_c;
end
end
S2:begin
if(din==1'b0)begin
state_n = S3;
end
else begin
state_n = S1;
end
end
S3:begin
if(din==1'b1)begin
state_n = S4;
end
else begin
state_n = IDLE;
end
end
S4:begin
if(din==1'b0)begin
state_n = S5;
end
else begin
state_n = S1;
end
end
S5:begin
if(din==1'b0)begin
state_n = S3;
end
else begin
state_n = S1;
end
end
default:begin
state_n = IDLE;
end
endcase
end
//第四段:同步时序always模块,格式化描述寄存器输出(可有多个输出)
always @(posedge sys_clk or negedge rst_n)begin
if(!rst_n)begin
out1 <=1'b0; //初始化
end
else if(state_c==S4&&din==1'b0)begin
out1 <= 1'b1;
end
else begin
out1 <= 1'b0;
end
end
endmodule
测试代码:
`timescale 1ps/1ps
module top_tb;
reg clk;
reg rst_n;
reg [23:0] data;
initial clk=1;
wire seq_binary;
always #3333 clk=~clk; //150
//always #2500 clk=~clk; //150M
//用循环移位的方式待测数据码流
always@(negedge clk) #5 data = {data[22 : 0], data[23]};
assign seq_binary = data[23]; //将最高位输入到序列检测器中
initial begin
rst_n=0;
#201
rst_n=1;
data = 24'b0011_1100_1001_0000_1001_0100;
repeat(3000)
@(posedge clk);
// #2000
//$stop;
end
wire rst_write = clk & rst_n; //复位期间不应写入数据
top top_inst(
.sys_clk (clk),
.rst_n (rst_n),
.din (seq_binary)
);
endmodule