?? blocklib.vhd
字號:
-- -- _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/-- _/ _/ ____________________________________________ -- _/ _/ / / -- _/_/ _/ / NAND01GR3B / -- _/_/_/ _/ / / -- _/_/ _/ / 1Gbit / -- _/_/ _/ / 8 bit, 2112 Byte Page, 1.8 V, NAND / -- _/ _/ / / -- _/ _/ / VHDL Behavioral Model / -- _/ _/ / Version 3.0 / -- _/_/ _/ / /-- _/_/_/ _/ / Copyright (c) 2006 STMicroelectronics / -- _/_/_/ _/ /___________________________________________/ -- _/_/_/_/_/ _/ -- ----------------------------------------------------------------------------------------------------------------------------------------LIBRARY IEEE; Use IEEE.std_logic_1164.all;LIBRARY Work; Use work.UserData.all; Use work.Data.all; use work.StringLib.all; use work.CUIcommandData.all;Package BlockLib is SubType Lock_type is bit_vector(2 downto 0); Constant UNLOCK : Lock_type := "110"; Constant LOCK : Lock_type := "010"; Constant LOCKDOWN : Lock_type := "001"; Constant UNLOCKDOWN : Lock_type := "101"; Constant first_block : Natural := 0; Constant last_block : Natural := nBlock - 1; SubType BlockDim_range is integer range last_Block downto first_Block; Type AddrBoundary_type is record addrStart: AddrMem_type; addrEnd: AddrMem_type; End Record; Type BlockBoundary_Type is array (BlockDim_range) of AddrBoundary_type; Type BlockLockTaskName_type is (none, getStatusByAddress, getStatusByBlock, putLock, putUnLock, putLockDown); type BlockLockTask_type is record task : BlockLockTaskName_type; currentStatus : Lock_type; -- there are 4 states : Locked, Unlocked, Locked-down, Unlocked in Locked-down area startBlock : BlockDim_range; endBlock : BlockDim_range; address : AddrMem_type; isUnLocked : Boolean; eventTime : time; end record; Type vectorBlockLockTask_type is array (Integer range <>) of BlockLockTask_type; Procedure initBlock(Signal BlockBoundary: out BlockBoundary_type); Function getBlock(BlockBoundary:BlockBoundary_type; Address: AddrMem_type) Return BlockDim_range; Procedure getBoundaryBlock(b: out AddrBoundary_type; Index: out BlockDim_range; BlockBoundary: BlockBoundary_type; Address: AddrMem_type); Function getAddrBlockStart(BlockBoundary:BlockBoundary_type; Address: AddrMem_type) Return AddrMem_Type; Function getAddrBlockEnd(BlockBoundary:BlockBoundary_type; Address: AddrMem_type) Return AddrMem_Type; Function getAddrBlockStartbyNumber(BlockBoundary:BlockBoundary_type;i:BlockDim_range) Return AddrMem_Type; Function getAddrBlockEndbyNumber(BlockBoundary:BlockBoundary_type;i:BlockDim_range) Return AddrMem_Type; Function getBlockNumber(BlockBoundary: BlockBoundary_type; Address: AddrMem_type) Return BlockDim_range; End BlockLib;Package body BlockLib is Procedure getBoundaryBlock(b: out AddrBoundary_type; Index: out BlockDim_range; BlockBoundary:BlockBoundary_type; Address: AddrMem_type) is Variable i: BlockDim_range; begin i := first_block; while (i <= nBlock - 1 and (Address > (BlockBoundary(i).AddrEnd))) loop i := i + 1; end loop; Index := i; b.AddrStart := BlockBoundary(i).AddrStart; b.AddrEnd := BlockBoundary(i).AddrEnd; end getBoundaryBlock; Function getBlock(BlockBoundary:BlockBoundary_type; Address: AddrMem_type) Return BlockDim_range is Variable i: BlockDim_range; begin i := first_block; while (i < nBlock and (Address > (BlockBoundary(i).AddrEnd))) loop i := i + 1; end loop; if i = nBlock then printString("+++ General Error +++ Check Source: getBlock in BlockLib"); return 0; else Return i; end if; end getBlock; Procedure initBlock(Signal BlockBoundary: out BlockBoundary_type) is variable i_addrBlock : Integer; Variable addrBlock : BlockBoundary_Type; begin i_addrBlock:=0; if BlockSize > 0 then for iBlock in first_block to last_block loop addrBlock(iBlock).addrStart := i_addrBlock; addrBlock(iBlock).addrEnd := i_addrBlock + BlockSize - 1; i_addrBlock := i_addrBlock + BlockSize; end loop; end if; BlockBoundary <= addrBlock; end initBlock; Function getAddrBlockStart(BlockBoundary: BlockBoundary_type; Address: AddrMem_type) Return AddrMem_Type is Variable i : BlockDim_range; Variable b : AddrBoundary_type; Begin getBoundaryBlock(b, i, BlockBoundary, Address); return b.Addrstart; End getAddrBlockStart; Function getAddrBlockEnd( BlockBoundary:BlockBoundary_type; Address: AddrMem_type) Return AddrMem_Type is Variable i : BlockDim_range; Variable b : AddrBoundary_type; Begin getBoundaryBlock(b, i, BlockBoundary, Address); return b.AddrEnd; end getAddrBlockEnd; Function getAddrBlockStartbyNumber( BlockBoundary:BlockBoundary_type; i:BlockDim_range) return AddrMem_type is Begin return BlockBoundary(i).AddrStart; end getAddrBlockStartbyNumber; Function getAddrBlockEndbyNumber( BlockBoundary:BlockBoundary_type; i:BlockDim_range) return AddrMem_type is Begin return BlockBoundary(i).AddrEnd; end getAddrBlockEndbyNumber; Function getBlockNumber(BlockBoundary:BlockBoundary_type; Address: AddrMem_type) Return BlockDim_range is Variable i : BlockDim_range; Variable b : AddrBoundary_type; Begin getBoundaryBlock(b, i, BlockBoundary, Address); Return i; End getBlockNumber;end BlockLib;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -