123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- `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,
- FifoWordOut0,FifoWordOut1,FifoWordOut2,FifoWordOut3,RegDataInOut,DinWenDelayOut
- );
- input Clk, BckIn, LrckIn, DataIn;
- input StartFlag;
- output BckOut, LrckOut, DataOut;
- output FifoWordOut0,FifoWordOut1,FifoWordOut2,FifoWordOut3,RegDataInOut,DinWenDelayOut;
-
- parameter ConstDinStateCounterFull = 16'd44000;
- parameter ConstDinStateCounter = 16'd43998;
- parameter ConstFifiReadOutterCounter = 16'd43999;
-
- ///// 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 = 0;
- reg [5:0] DinInnerCounter = 0;
- reg [1:0] DinStateNeg = 0;
-
- ///// Out Part
- reg [1:0] BckOutCounter = 0;
- reg [5:0] LrckOutCounter = 0;
- reg FifoRen = 0;
- reg FifoRenPos = 0;
- reg DataOut = 0;
- reg [6:0] InnerInputCounter=0;
- reg [4:0] DoutReadCounter = 0;
- reg [1:0] ReadState = 0;
- reg [4:0] DoutReadCounterPos = 0;
- reg [1:0] ReadStatePos = 0;
- reg [31:0] FifoShifter = 0;
- reg [15:0] FifiReadOutterCounter = 0;
- // reg ReadStart = 0;
- wire [5:0] FifoWord;
- wire FifoEmp;
- wire FifoReadOut;
-
- assign BckOut = BckOutCounter[1];
- assign LrckOut = LrckOutCounter[5];
-
- //测试端口
- assign FifoWordOut0 = FifoWord[0];
- assign FifoWordOut1 = FifoWord[1];
- assign FifoWordOut2 = FifoWord[2];
- assign FifoWordOut3 = FifoWord[3];
- assign RegDataInOut = RegDataIn;
- assign DinWenDelayOut = DinWenDelay;
-
- ///// 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@(posedge BckIn)
- begin
- if(StartFlag == 1'b0)
- begin
- InnerInputCounter <= 7'd62;
- end
- else
- begin
- if((DinStateNeg==2'd2)||(DinStateNeg==2'd0))
- begin
- if(InnerInputCounter < 7'd62)
- begin
- InnerInputCounter <= InnerInputCounter + 7'd1;
- end
- else
- begin
- if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
- InnerInputCounter <= 7'd0;
- end
- end
- else
- InnerInputCounter <= 7'd62;
- end
- end
-
- always@(posedge BckIn)
- begin
- if(StartFlag == 1'b0)
- begin
- DinInnerCounter <= 6'd0;
- end
- else
- begin
- if(DinStateNeg==2'd2)
- begin
- if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
- DinInnerCounter <= 6'd0;
- else
- DinInnerCounter <= DinInnerCounter + 5'd1;
- end
- else
- DinInnerCounter <= 6'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) && ( DinStateCounter == ConstDinStateCounter ) )
- begin
- DinState <= 2'd3;
- end
- end
- 2'd3:
- begin
- if( DinStateCounter == ConstDinStateCounterFull )
- begin
- DinState <= 2'd1;
- end
- end
-
- endcase
- 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) && (InnerInputCounter == 7'd62))
- begin
- DinStateCounter <= DinStateCounter + 16'd1;
- end
- else
- DinStateCounter <= DinStateCounter;
- 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( (DinStateCounter == ConstDinStateCounter) || (DinInnerCounter == 5'd24))
- begin
- DinWen <= 1'd0;
- end
- else if((DinStateCounter <= ConstDinStateCounter) && ( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) )
- 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@(posedge Clk)
- begin
- BckOutCounter <= BckOutCounter + 2'd1;
- end
- always@(negedge BckOut)
- begin
- LrckOutCounter <= LrckOutCounter + 6'd1;
- end
-
- always@(posedge BckOut)
- begin
- DoutReadCounterPos <= DoutReadCounter;
- end
-
- always@(negedge BckOut)
- begin
- if((LrckOutCounter==6'd63) || (LrckOutCounter==6'd31))
- DoutReadCounter <= 5'd0;
- else
- DoutReadCounter <= DoutReadCounterPos + 5'd1;
- end
-
- always@(posedge BckOut)
- begin
- FifoRenPos <= FifoRen;
- end
-
- always@(negedge BckOut)
- begin
- if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) && (ReadStatePos == 2'd0) )
- FifoRen <= 1'd1;
- else if( (LrckOutCounter == 6'd62) && (ReadStatePos == 2'd1) )
- FifoRen <= 1'd1;
- else if( (LrckOutCounter == 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@(posedge BckOut)
- begin
- if(StartFlag == 1'b0)
- begin
- FifiReadOutterCounter <= 16'd0;
- end
- else
- begin
- if(ReadStatePos == 1'b0)
- FifiReadOutterCounter <= 16'd0;
- else
- begin
- if( (LrckOutCounter == 6'd62) && (FifiReadOutterCounter < ConstFifiReadOutterCounter))
- FifiReadOutterCounter <= FifiReadOutterCounter + 16'd1;
- else
- FifiReadOutterCounter <= FifiReadOutterCounter;
- end
- end
- end
-
-
- always@(negedge BckOut)
- begin
- if(StartFlag == 1'b0)
- begin
- ReadState <= 2'd0;
- end
- begin
- if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) )
- ReadState <= 2'd1;
- else if( (FifoWord <= 6'd1) && (ReadState == 2'd1) && (FifiReadOutterCounter == ConstFifiReadOutterCounter ) )
- ReadState <= 2'd0;
- end
- end
-
- always@(negedge BckOut)
- begin
- FifoShifter <= {FifoShifter[29:0], DataOut};
- end
-
- always@(negedge BckOut)
- begin
- if(ReadStatePos == 1'b0)
- DataOut <= 1'b0;
- else
- begin
- if(FifoRenPos == 1'b1)
- DataOut <= FifoReadOut;
- else
- DataOut <= FifoShifter[30];
- end
- end
-
- endmodule
|