OpenCores
URL https://opencores.org/ocsvn/usbhostslave/usbhostslave/trunk

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [buffers/] [RxFifoBI.v] - Diff between revs 22 and 37

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 22 Rev 37
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)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.