123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- `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//测试端口
- );
- input Clk, BckIn, LrckIn, DataIn;
- input StartFlag;
- output BckOut, LrckOut, DataOut;
- output DinWenOut,FifoRenOut;//测试端口
-
- ///// 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;
-
- ///// Out Part
- reg [1:0] BckOutCounter = 0;
- reg [5:0] LrckOutCounter = 0;
- reg FifoRen = 0;
- reg DataOut;
- reg [6:0] InnerInputCounter=0;
- reg [4:0] DoutReadCounter = 0;
- reg [1:0] ReadState = 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;
-
- ///// 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((DinState==2'd2)||(DinState==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 <= 5'd0;
- end
- else
- begin
- if(DinState==2'd2)
- begin
- if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
- DinInnerCounter <= 5'd0;
- else
- DinInnerCounter <= DinInnerCounter + 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@(posedge BckIn)
- begin
- if(StartFlag == 1'b0)
- begin
- DinState <= 2'd0;
- end
- else
- begin
- case(DinState)
- 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 == 16'd45998 ) )
- begin
- DinState <= 2'd3;
- end
- end
- 2'd3:
- begin
- if( DinStateCounter == 16'd46000 )
- 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(DinState == 2'd2 || DinState == 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(DinState)
- 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 == 16'd45998) && (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) || (DinInnerCounter > 5'd23 && DinInnerCounter < 5'd31))
- begin
- DinWen <= 1'd0;
- end
- else if((DinStateCounter <= 16'd45998) && ( ( DinInnerCounter <=5'd23 || DinInnerCounter == 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@(posedge Clk)
- begin
- BckOutCounter <= BckOutCounter + 2'd1;
- end
-
- always@(negedge BckOut)
- begin
- // if(ReadStart == 1'b0)
- // LrckOutCounter <= 6'd55;
- // else
- LrckOutCounter <= LrckOutCounter + 6'd1;
- end
-
- always@(negedge BckOut)
- begin
- if((LrckOutCounter==6'd63) || (LrckOutCounter==6'd31))
- DoutReadCounter <= 5'd0;
- else
- DoutReadCounter <= DoutReadCounter + 5'd1;
- end
-
-
-
- // always@(negedge BckOut)
- // begin
- // if(FifoWord >= 6'd16)
- // ReadStart <= 1'b1;
- // end
-
- always@(negedge BckOut)
- begin
- if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) && (ReadState == 2'd0) )
- FifoRen <= 1'd1;
- else if( (LrckOutCounter == 6'd62 || LrckOutCounter == 6'd30) && (ReadState == 2'd1) )
- FifoRen <= 1'd1;
- else if( (FifoWord == 6'd1) && (FifoRen == 1'd1) && (ReadState == 2'd1) )
- FifoRen <= 1'd0;
- else if( ((LrckOutCounter == 6'd55 || LrckOutCounter == 6'd23)) && (FifoRen == 1'd1) && (ReadState == 2'd1) )
- FifoRen <= 1'd0;
- 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) && (FifoRen == 1'd1) )
- ReadState <= 2'd0;
- end
- end
-
- always@(negedge BckOut)
- begin
- if(FifoRen == 1'b1)
- DataOut <= FifoReadOut;
- else
- DataOut <= 1'b0;
- end
-
- endmodule
|