Line 84... |
Line 84... |
wire rstSyncToBusClk;
|
wire rstSyncToBusClk;
|
wire [7:0] fifoDataIn;
|
wire [7:0] fifoDataIn;
|
wire [7:0] busDataIn;
|
wire [7:0] busDataIn;
|
reg [7:0] busDataOut;
|
reg [7:0] busDataOut;
|
reg fifoREn;
|
reg fifoREn;
|
reg forceEmptySyncToUsbClk;
|
wire forceEmptySyncToUsbClk;
|
wire forceEmptySyncToBusClk;
|
wire forceEmptySyncToBusClk;
|
wire [15:0] numElementsInFifo;
|
wire [15:0] numElementsInFifo;
|
wire fifoSelect;
|
wire fifoSelect;
|
|
|
reg [5:0] forceEmptyShift;
|
reg forceEmptyReg;
|
reg forceEmpty;
|
reg forceEmpty;
|
reg forceEmptySyncToUsbClkFirst;
|
reg forceEmptyToggle;
|
|
reg [2:0] forceEmptyToggleSyncToUsbClk;
|
|
|
//sync write
|
//sync write
|
always @(posedge busClk)
|
always @(posedge busClk)
|
begin
|
begin
|
if (writeEn == 1'b1 && fifoSelect == 1'b1 &&
|
if (writeEn == 1'b1 && fifoSelect == 1'b1 &&
|
Line 103... |
Line 104... |
forceEmpty <= 1'b1;
|
forceEmpty <= 1'b1;
|
else
|
else
|
forceEmpty <= 1'b0;
|
forceEmpty <= 1'b0;
|
end
|
end
|
|
|
//generate 'forceEmptySyncToBusClk'
|
//detect rising edge of 'forceEmpty', and generate toggle signal
|
//assuming that 'busClk' < 5 * 'usbClk'. ie 'busClk' < 240MHz
|
|
always @(posedge busClk) begin
|
always @(posedge busClk) begin
|
if (rstSyncToBusClk == 1'b1)
|
if (rstSyncToBusClk == 1'b1) begin
|
forceEmptyShift <= 6'b000000;
|
forceEmptyReg <= 1'b0;
|
|
forceEmptyToggle <= 1'b0;
|
|
end
|
else begin
|
else begin
|
if (forceEmpty == 1'b1)
|
if (forceEmpty == 1'b1)
|
forceEmptyShift <= 6'b111111;
|
forceEmptyReg <= 1'b1;
|
else
|
else
|
forceEmptyShift <= {1'b0, forceEmptyShift[5:1]};
|
forceEmptyReg <= 1'b0;
|
|
if (forceEmpty == 1'b1 && forceEmptyReg == 1'b0)
|
|
forceEmptyToggle <= ~forceEmptyToggle;
|
end
|
end
|
end
|
end
|
assign forceEmptySyncToBusClk = forceEmptyShift[0];
|
assign forceEmptySyncToBusClk = (forceEmpty == 1'b1 && forceEmptyReg == 1'b0) ? 1'b1 : 1'b0;
|
|
|
|
|
// double sync across clock domains to generate 'forceEmptySyncToWrClk'
|
// double sync across clock domains to generate 'forceEmptySyncToUsbClk'
|
always @(posedge usbClk) begin
|
always @(posedge usbClk) begin
|
forceEmptySyncToUsbClkFirst <= forceEmptySyncToBusClk;
|
forceEmptyToggleSyncToUsbClk <= {forceEmptyToggleSyncToUsbClk[1:0], forceEmptyToggle};
|
forceEmptySyncToUsbClk <= forceEmptySyncToUsbClkFirst;
|
|
end
|
end
|
|
assign forceEmptySyncToUsbClk = forceEmptyToggleSyncToUsbClk[2] ^ forceEmptyToggleSyncToUsbClk[1];
|
|
|
// async read mux
|
// async read mux
|
always @(address or fifoDataIn or numElementsInFifo)
|
always @(address or fifoDataIn or numElementsInFifo)
|
begin
|
begin
|
case (address)
|
case (address)
|