mirror of
				https://github.com/Klagarge/Cursor.git
				synced 2025-10-31 14:09:17 +00:00 
			
		
		
		
	Initial commit
This commit is contained in:
		| @@ -0,0 +1,73 @@ | ||||
| -- ------------------------------------------------------------------------------ | ||||
| --  Copyright 2013 HES-SO Valais Wallis (www.hevs.ch) | ||||
| -- ------------------------------------------------------------------------------ | ||||
| --  FIFO bridge with bus width adaption  | ||||
| --    A shift register that connects two FIFOs with different bus width. | ||||
| --    Many IP blocks nowadays have FIFO or FIFO-like interfaces and often they | ||||
| --    have to be connected. This block can the be used for this task, even if | ||||
| --    the bus size of the two FIFO interfaces is different. | ||||
| --    The Rx side bus width has to be a multiple of the Tx side bus width.  | ||||
| --  | ||||
| --    Created on 2013-10-18 | ||||
| -- | ||||
| --    Author: Oliver A. Gubler (oliver.gubler@hevs.ch) | ||||
| --  | ||||
| --    2014-10-06: *modify introduction text | ||||
| --                +add some comment | ||||
| --                *change readRx to a pulse | ||||
| --                *fix bug on shift of shiftreg_s | ||||
| --    2013-10-18: +intital release | ||||
| -- ------------------------------------------------------------------------------ | ||||
| -- | ||||
|  | ||||
| library Common;  | ||||
|   use Common.CommonLib.all;  | ||||
|  | ||||
| ARCHITECTURE behavioral OF fifoBridgeRxToTxBusWidthAdaptionRxBigger IS | ||||
|    | ||||
|   signal cnt_s: unsigned(requiredBitNb(dataBitNbRx)-1 downto 0); | ||||
|   signal shiftreg_s: std_ulogic_vector(dataBitNbRx-1 downto 0); | ||||
|   signal emptyRx_s: std_ulogic; -- internal empty signal | ||||
|   signal writeTx_s: std_ulogic; -- internal write signal | ||||
|    | ||||
|   constant ratio_rxtx_c: positive range 1 to dataBitNbRx/dataBitNbTx:= dataBitNbRx/dataBitNbTx; | ||||
|      | ||||
| BEGIN | ||||
|    | ||||
|   rx0: process(clock, reset) | ||||
|   begin | ||||
|     if reset = '1' then | ||||
|       shiftreg_s <= (others => '0'); | ||||
|       emptyRx_s <= '1'; | ||||
|       cnt_s <= (others => '0'); | ||||
|       writeTx_s <= '0'; | ||||
|       dataTx <= (others => '0'); | ||||
|       readRx <= '0'; | ||||
|     elsif rising_edge(clock) then | ||||
|       writeTx_s <= '0'; | ||||
|       readRx <= '0'; | ||||
|       -- fetch data | ||||
|       if emptyRx_s = '1' and emptyRx = '0' then | ||||
|         emptyRx_s <= '0'; | ||||
|         shiftreg_s <= dataRx; | ||||
|         readRx <= '1'; | ||||
|       end if; | ||||
|       -- shift data and put out | ||||
|       -- after each write, wait one cylce to check if full gets high | ||||
|       if emptyRx_s = '0' and fullTx = '0' and writeTx_s = '0' then | ||||
|         shiftreg_s <= shiftreg_s(dataBitNbRx-dataBitNbTx-1 downto 0) & std_ulogic_vector(to_unsigned(0,dataBitNbTx)); | ||||
|         dataTx <= shiftreg_s(dataBitNbRx-1 downto dataBitNbRx-dataBitNbTx); | ||||
|         writeTx_s <= '1'; | ||||
|         cnt_s <= cnt_s +1; | ||||
|         if cnt_s >= ratio_rxtx_c-1 then | ||||
|           cnt_s <= (others => '0'); | ||||
|           emptyRx_s <= '1'; | ||||
|         end if; | ||||
|       end if;   | ||||
|     end if; | ||||
|   end process; | ||||
|  | ||||
|   writeTx <= writeTx_s; | ||||
|  | ||||
| END ARCHITECTURE behavioral; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user