`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2022/05/17 23:16:57 // Design Name: // Module Name: CounterTest // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module CPLD_Transmitter( Clk, BckIn, LrckIn, DataIn, BckOut, LrckOut, DataOut, StartFlag, DinWenOut,FifoRenOut,FifoWord5,FifoWord4,FifoWord3,FifoWord2,FifoWord1,FifoWord0,RegDataInOut,FifoReadOutOut//测试端口 ); input Clk, BckIn, LrckIn, DataIn; input StartFlag; output BckOut, LrckOut, DataOut; output DinWenOut,FifoRenOut,FifoWord5,FifoWord4,FifoWord3,FifoWord2,FifoWord1,FifoWord0,RegDataInOut,FifoReadOutOut;//测试端口 ///// In Part reg RegLrckIn = 0; reg RegDataIn = 0; reg PreRegLrckIn = 0; reg PreRegDataIn = 0; reg DinWen = 0; reg DinWenDelay = 0; reg [15:0] DinStateCounter = 0; reg [1:0] DinState; reg [4:0] DinInnerCounter = 0; reg [15:0] DinStateCounterNeg = 0; reg [1:0] DinStateNeg; reg [4:0] DinInnerCounterNeg = 0; ///// Out Part reg [1:0] BckOutCounter = 0; reg [5:0] LrckOutCounter = 0; reg FifoRen = 0; reg [1:0] BckOutCounterPos = 0; reg [5:0] LrckOutCounterPos = 0; reg FifoRenPos = 0; reg DataOut; reg [6:0] InnerInputCounter=0; reg [4:0] DoutReadCounter = 0; reg [1:0] ReadState = 0; reg [6:0] InnerInputCounterNeg=0; reg [4:0] DoutReadCounterPos = 0; reg [1:0] ReadStatePos = 0; // reg ReadStart = 0; wire [5:0] FifoWord; wire FifoEmp; wire FifoReadOut; assign BckOut = BckOutCounter[1]; assign LrckOut = LrckOutCounter[5]; //测试端口赋值 assign DinWenOut = DinWenDelay; assign FifoRenOut = FifoRen; assign FifoWord5 = FifoWord[5]; assign FifoWord4 = FifoWord[4]; assign FifoWord3 = FifoWord[3]; assign FifoWord2 = FifoWord[2]; assign FifoWord1 = FifoWord[1]; assign FifoWord0 = FifoWord[0]; assign RegDataInOut = RegDataIn; assign FifoReadOutOut = FifoReadOut; ///// In Part Logic always@(posedge BckIn) begin if(StartFlag == 1'b0) begin PreRegLrckIn <= 1'b0; PreRegDataIn <= 1'b0; end else begin PreRegLrckIn <= LrckIn; PreRegDataIn <= DataIn; end end always@(negedge BckIn) begin if(StartFlag == 1'b0) begin RegLrckIn <= 1'b0; RegDataIn <= 1'b0; end else begin RegLrckIn <= PreRegLrckIn; RegDataIn <= PreRegDataIn; end end always@(negedge BckIn) begin if(StartFlag == 1'b0) begin InnerInputCounterNeg <= 7'd62; end else begin InnerInputCounterNeg <= InnerInputCounter; end end always@(posedge BckIn) begin if(StartFlag == 1'b0) begin InnerInputCounter <= 7'd62; end else begin if((DinStateNeg==2'd2)||(DinStateNeg==2'd0)) begin if(InnerInputCounterNeg < 7'd62) begin InnerInputCounter <= InnerInputCounterNeg + 7'd1; end else begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) InnerInputCounter <= 7'd0; end end else InnerInputCounter <= 7'd62; end end always@(negedge BckIn) begin if(StartFlag == 1'b0) begin DinInnerCounterNeg <= 5'd0; end else begin DinInnerCounterNeg <= DinInnerCounter; end end always@(posedge BckIn) begin if(StartFlag == 1'b0) begin DinInnerCounter <= 5'd0; end else begin if(DinStateNeg==2'd2) begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) DinInnerCounter <= 5'd0; else DinInnerCounter <= DinInnerCounterNeg + 5'd1; end else DinInnerCounter <= 5'd0; end end always@(negedge BckIn) begin if(StartFlag == 1'b0) begin DinWenDelay <= 5'd0; end else begin DinWenDelay <= DinWen; end end always@(negedge BckIn) begin if(StartFlag == 1'b0) begin DinStateNeg <= 2'd0; end else begin DinStateNeg <= DinState; end end always@(posedge BckIn) begin if(StartFlag == 1'b0) begin DinState <= 2'd0; end else begin case(DinStateNeg) 2'd0: begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) begin DinState <= 2'd2; end end 2'd1: begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) begin DinState <= 2'd2; end end 2'd2: begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && ( DinStateCounterNeg == 16'd45998 ) ) begin DinState <= 2'd3; end end 2'd3: begin if( DinStateCounterNeg == 16'd46000 ) begin DinState <= 2'd1; end end endcase end end always@(negedge BckIn) begin if(StartFlag == 1'b0) begin DinStateCounterNeg <= 16'd0; end else begin DinStateCounterNeg <= DinStateCounter; end end always@(posedge BckIn) begin if(StartFlag == 1'b0) begin DinStateCounter <= 16'd0; end else begin if(DinStateNeg == 2'd2 || DinStateNeg == 2'd3) begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && (InnerInputCounterNeg == 7'd62)) begin DinStateCounter <= DinStateCounterNeg + 16'd1; end else DinStateCounter <= DinStateCounterNeg; end else DinStateCounter <= 16'd0; end end always@(posedge BckIn) begin if(StartFlag == 1'b0) begin DinWen <= 1'd0; end else begin case(DinStateNeg) 2'd0: begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) begin DinWen <= 1'd1; end end 2'd1: begin if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) begin DinWen <= 1'd1; end end 2'd2: begin if( ( (DinStateCounterNeg == 16'd45998) && (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) || (DinInnerCounterNeg > 5'd23 && DinInnerCounterNeg < 5'd31)) begin DinWen <= 1'd0; end else if((DinStateCounterNeg <= 16'd45998) && ( ( DinInnerCounterNeg <=5'd23 || DinInnerCounterNeg == 5'd31 ) || ((RegLrckIn == 1'b1) && (LrckIn == 1'b0)) || ((RegLrckIn == 1'b0) && (LrckIn == 1'b1)) ) ) DinWen <= 1'd1; end endcase end end IP_FIFO IP_FIFO( .aclr(!StartFlag), .data(RegDataIn), .rdclk(BckOut), .rdreq(FifoRen), .wrclk(BckIn), .wrreq(DinWenDelay), .q(FifoReadOut), // .rdempty(FifoEmp), .rdusedw(FifoWord) ); ///// Out Part Logic always@(negedge Clk) begin BckOutCounterPos <= BckOutCounter; end always@(posedge Clk) begin BckOutCounter <= BckOutCounterPos + 2'd1; end always@(posedge BckOut) begin LrckOutCounterPos <= LrckOutCounter; end always@(negedge BckOut) begin LrckOutCounter <= LrckOutCounterPos + 6'd1; end always@(posedge BckOut) begin DoutReadCounterPos <= DoutReadCounter; end always@(negedge BckOut) begin if((LrckOutCounterPos==6'd63) || (LrckOutCounterPos==6'd31)) DoutReadCounter <= 5'd0; else DoutReadCounter <= DoutReadCounterPos + 5'd1; end always@(posedge BckOut) begin FifoRenPos <= FifoRen; end always@(negedge BckOut) begin if( (LrckOutCounterPos == 6'd62) && (FifoWord >= 6'd6) && (ReadStatePos == 2'd0) ) FifoRen <= 1'd1; else if( (LrckOutCounterPos == 6'd62 || LrckOutCounterPos == 6'd30) && (ReadStatePos == 2'd1) ) FifoRen <= 1'd1; else if( (FifoWord == 6'd1) && (FifoRenPos == 1'd1) && (ReadStatePos == 2'd1) ) FifoRen <= 1'd0; else if( ((LrckOutCounterPos == 6'd55 || LrckOutCounterPos == 6'd23)) && (FifoRenPos == 1'd1) && (ReadStatePos == 2'd1) ) FifoRen <= 1'd0; end always@(posedge BckOut) begin if(StartFlag == 1'b0) begin ReadStatePos <= 2'd0; end else begin ReadStatePos <= ReadState; end end always@(negedge BckOut) begin if(StartFlag == 1'b0) begin ReadState <= 2'd0; end begin if( (LrckOutCounterPos == 6'd62) && (FifoWord >= 6'd6) ) ReadState <= 2'd1; else if( (FifoWord == 6'd1) && (FifoRenPos == 1'd1) ) ReadState <= 2'd0; end end always@(negedge BckOut) begin if(FifoRenPos == 1'b1) DataOut <= FifoReadOut; else DataOut <= 1'b0; end endmodule