| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- module FifoCtrl #(
- parameter Fifo0ReadMsbAddr = 12'h0+12'd28,
- parameter Fifo1ReadMsbAddr = 12'h50+12'd28,
- parameter Fifo2ReadMsbAddr = 12'hf0+12'd28,
- parameter Fifo3ReadMsbAddr = 12'h140+12'd28,
- parameter Fifo4ReadMsbAddr = 12'h190+12'd28,
- parameter Fifo5ReadMsbAddr = 12'h1e0+12'd28,
- parameter Fifo6ReadMsbAddr = 12'h230+12'd28,
- parameter STAGES = 3
- )(
- input ToFifoTxWriteVal_i,
- input ToFifoTxReadVal_i,
- input ToFifoRxWriteVal_i,
- input ToFifoRxReadVal_i,
- input FifoTxFull_i,
- input FifoTxEmpty_i,
- input FifoRxFull_i,
- input FifoRxEmpty_i,
- input [11:0] SmcAddr_i,
- input [7:0] TxFifoWrdCnt_i,
- input [7:0] RxFifoWrdCnt_i,
- input FifoTxWrClock_i,
- input FifoTxRdClock_i,
- input FifoRxWrClock_i,
- input FifoRxRdClock_i,
- input FifoTxRst_i,
- input FifoRxRst_i,
- input FifoTxRstWrPtr_i,
- input FifoRxRstRdPtr_i,
- output [7:0] RxFifoUpDnCnt_o,
- output [7:0] TxFifoUpDnCnt_o,
- output EmptyFlagTxForDsp_o,
- output FifoTxWriteEn_o,
- output FifoTxReadEn_o,
- output FifoRxWriteEn_o,
- output FifoRxReadEn_o
- );
- reg fifoTxWriteEn;
- reg fifoTxReadEn;
- reg fifoRxWriteEn;
- reg fifoRxReadEn;
-
- (* dont_touch = "true" *)reg [7:0] txFifoWrPtr;
- (* dont_touch = "true" *)reg [7:0] txFifoRdPtr;
- (* dont_touch = "true" *)reg [7:0] rxFifoWrPtr;
- (* dont_touch = "true" *)reg [7:0] rxFifoRdPtr;
-
- (* dont_touch = "true" *)reg [7:0] rxFifoUpDnCnt;
- (* dont_touch = "true" *)reg [7:0] txFifoUpDnCnt;
-
- reg [1:0] readEnCnt;
- reg emptyFlagTxForDsp;
-
-
-
- wire requestToFifo0 =(SmcAddr_i == Fifo0ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo1 =(SmcAddr_i == Fifo1ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo2 =(SmcAddr_i == Fifo2ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo3 =(SmcAddr_i == Fifo3ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo4 =(SmcAddr_i == Fifo4ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo5 =(SmcAddr_i == Fifo5ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo6 =(SmcAddr_i == Fifo6ReadMsbAddr)?1'b1:1'b0;
- wire requestToFifo =(requestToFifo0|requestToFifo1|requestToFifo2|requestToFifo3|requestToFifo4|requestToFifo5|requestToFifo6)?1'b1:1'b0;
- wire [7:0] rxFifoWrPtrSync;
- wire [7:0] txFifoWrPtrSync;
- wire [7:0] txFifoRdPtrSync;
- wire rxFifoRstSync;
-
-
-
- // //================================================================================
- // // ASSIGNMENTS
-
- assign FifoTxWriteEn_o = fifoTxWriteEn;
- assign FifoTxReadEn_o = fifoTxReadEn;
- assign FifoRxWriteEn_o = fifoRxWriteEn;
- assign FifoRxReadEn_o = fifoRxReadEn;
-
-
- assign RxFifoUpDnCnt_o = rxFifoUpDnCnt;
- assign TxFifoUpDnCnt_o = txFifoUpDnCnt;
-
- assign EmptyFlagTxForDsp_o = emptyFlagTxForDsp;
-
- // //================================================================================
-
- RxFifoPtrSync #(
- .WIDTH(8),
- .STAGES(3)
- )
- rxFifoPtrSync (
- .ClkFast_i(FifoRxWrClock_i),
- .ClkSlow_i(FifoRxRdClock_i),
- .RxFifoWrPtr_i(rxFifoWrPtr),
- .RxFifoWrPtr_o(rxFifoWrPtrSync)
- );
- // TxFifoPtrSync #(
- // .WIDTH(8),
- // .STAGES(3)
- // )
- // txFifoPtrSync (
- // .ClkFast_i(FifoTxWrClock_i),
- // .ClkSlow_i(FifoTxRdClock_i),
- // .TxFifoWrPtr_i(txFifoWrPtr),
- // .TxFifoWrPtr_o(txFifoWrPtrSync)
- // );
- // RxFifoRstSync #(
- // .WIDTH(1),
- // .STAGES(3)
- // )
- // rxFifoRstSync (
- // .ClkFast_i(FifoRxWrClock_i),
- // .ClkSlow_i(FifoRxRdClock_i),
- // .RxFifoRst_i(FifoRxRst_i),
- // .RxFifoRst_o(rxFifoRstSync)
- // );
- TxFifoPtrSync #(
- .WIDTH(8),
- .STAGES(3)
- )
- txFifoPtrSync (
- .ClkFast_i(FifoTxRdClock_i),
- .ClkSlow_i(FifoTxWrClock_i),
- .TxFifoWrPtr_i(txFifoRdPtr),
- .TxFifoWrPtr_o(txFifoRdPtrSync)
- );
-
- always @(posedge FifoRxRdClock_i) begin
- if (FifoRxRstRdPtr_i) begin
- readEnCnt <= 1'b0;
- end
- else begin
- if (ToFifoRxReadVal_i) begin
- readEnCnt <= readEnCnt + 1'b1;
- end
- else begin
- readEnCnt <= 1'b0;
- end
- end
- end
-
-
-
- always @(posedge FifoTxWrClock_i) begin
- if (ToFifoTxWriteVal_i && !FifoTxFull_i) begin
- fifoTxWriteEn <= 1'b1;
- end
- else begin
- fifoTxWriteEn <= 1'b0;
- end
- end
-
-
- always @(posedge FifoTxRdClock_i ) begin
- if (ToFifoTxReadVal_i && !FifoTxEmpty_i) begin
- fifoTxReadEn <= 1'b1;
- end
- else begin
- fifoTxReadEn <= 1'b0;
- end
- end
-
-
- always @(posedge FifoRxWrClock_i) begin
- if (ToFifoRxWriteVal_i && !FifoRxFull_i) begin
- fifoRxWriteEn <= 1'b1;
- end
- else begin
- fifoRxWriteEn <= 1'b0;
- end
- end
-
-
- always @(posedge FifoRxRdClock_i) begin
- if (ToFifoRxReadVal_i && !FifoRxEmpty_i && requestToFifo && readEnCnt < 1 ) begin
- fifoRxReadEn <= 1'b1;
- end
- else begin
- fifoRxReadEn <= 1'b0;
- end
- end
-
-
- always @(posedge FifoTxWrClock_i ) begin
- if (FifoTxRstWrPtr_i) begin
- txFifoWrPtr <= 8'h0;
- end
- else begin
- if (fifoTxWriteEn ) begin
- txFifoWrPtr <= txFifoWrPtr + 1'b1;
- end
- end
- end
-
- always @(posedge FifoTxRdClock_i ) begin
- if (FifoTxRst_i) begin
- txFifoRdPtr <= 8'h0;
- end
- else begin
- if (fifoTxReadEn ) begin
- txFifoRdPtr <= txFifoRdPtr + 1'b1;
- end
- end
- end
-
-
- always @(posedge FifoRxWrClock_i) begin
- if (FifoRxRst_i) begin
- rxFifoWrPtr <= 8'h0;
- end
- else begin
- if (fifoRxWriteEn ) begin
- rxFifoWrPtr <= rxFifoWrPtr + 1'b1;
- end
- end
- end
-
- always @(posedge FifoRxRdClock_i) begin
- if (FifoRxRstRdPtr_i) begin
- rxFifoRdPtr <= 8'h0;
- end
- else begin
- if (fifoRxReadEn ) begin
- rxFifoRdPtr <= rxFifoRdPtr + 1'b1;
- end
- end
- end
-
-
- always @(posedge FifoRxRdClock_i) begin
- if (FifoRxRstRdPtr_i) begin
- rxFifoUpDnCnt <= 8'h0;
- end
- else begin
- rxFifoUpDnCnt <= rxFifoWrPtrSync - rxFifoRdPtr;
- end
- end
-
- always @(posedge FifoTxWrClock_i) begin
- if (FifoTxRst_i) begin
- txFifoUpDnCnt <= 8'h0;
- end
- else begin
- txFifoUpDnCnt <= txFifoWrPtr - txFifoRdPtrSync;
- end
- end
-
-
- // always @(posedge FifoTxWrClock_i) begin
- // if (FifoTxRstWrPtr_i) begin
- // emptyFlagTxForDsp <= 1'b1;
- // end
- // else begin
- // if (txFifoWrPtr == txFifoRdPtr) begin
- // emptyFlagTxForDsp <= 1'b1;
- // end
- // else begin
- // emptyFlagTxForDsp <= 1'b0;
- // end
- // end
- // end
- always @(*) begin
- if (txFifoUpDnCnt == 8'h0) begin
- emptyFlagTxForDsp <= 1'b1;
- end
- else begin
- emptyFlagTxForDsp <= 1'b0;
- end
- end
-
-
- // //================================================================================
-
- endmodule
|