先放實驗要求:
實驗源程序:
module
FrameSyn(stateout,dataouten,datawrong,reset,system_clk,mode);
output reg [3:0] stateout;
output dataouten,datawrong;
input [1:0] mode;
input reset,system_clk;
wire [1:0] state;
wire clk,datain,dataout;
always @(state)
begin
case
(state)
2'b00 : stateout = 4'b0001;
2'b01 : stateout = 4'b0010;
2'b10 : stateout = 4'b0100;
2'b11 : stateout = 4'b1000;
endcase
end
FrameSynM FrameSM0(.state(state),
.dataout(dataout), .dataouten(dataouten), .reset(reset), .clk(clk),
.datain(datain));
FrameDataCheck FrameDataCheck0(.Reset(reset),
.Clock(clk), .DataOut(dataout), .DataOutEn(dataouten),
.DataWrong(datawrong));
FrameTrans FrameTrans0(.Reset(~reset),
.Clock100M(system_clk), .Mode(mode), .Clock(clk),
.DataIn(datain));
endmodule
module FrameSynM(state,dataout,dataouten,reset,clk,datain);
output reg [1:0] state;
output reg dataouten;
output dataout;
input datain,clk,reset;
reg [7:0] data_count;
reg [7:0] frame;
reg [1:0] matchtimes,mismatchtimes;
assign dataout = datain;
always @(negedge reset or posedge clk)
begin
if
(!reset)
begin
state <= 2'b00;
frame <= 8'b0000_0000;
data_count <= 8'b0000_0000;
matchtimes <= 2'b00;
mismatchtimes <= 2'b00;
dataouten <= 0;
end
else
begin
frame <= {frame[6:0], datain};
if (state == 2'b00)
begin
if (frame == 8'b1001_1011)
begin
data_count <=0;
matchtimes <= matchtimes + 1;
mismatchtimes <= 2'b00;
end
else
begin