i2cramin.tdf
来自「基于fpga的屏幕测试程序」· TDF 代码 · 共 87 行
TDF
87 行
INCLUDE "lpm_ram_dq";PARAMETERS ( SUBADDRESS=0, SUBADDRESSBITS=8, -- lpm_dq_ram related LPM_WIDTH=8, LPM_WIDTHAD=8, LPM_NUMWORDS=256, LPM_OUTDATA="REGISTERED", LPM_FILE="", USE_EAB="ON" );CONSTANT I2CBUSWIDTH = SUBADDRESSBITS+20;CONSTANT LASTADD = SUBADDRESS+LPM_NUMWORDS-1;SUBDESIGN i2cRamIn ( sysclk: INPUT; i2cBusIn[I2CBUSWIDTH-1..0]: INPUT; i2cBusOut[I2CBUSWIDTH-1..0]: OUTPUT; address[LPM_WIDTHAD-1..0]: INPUT; dataIn[LPM_WIDTH-1..0]: INPUT; we: INPUT; )VARIABLE add[SUBADDRESSBITS-1..0]: NODE; shiftedAdd[SUBADDRESSBITS-1..0]: NODE; clk,rd: NODE; sel: SOFT; waitCounter[1..0]: DFF; myRam: lpm_ram_dq WITH (LPM_WIDTH=LPM_WIDTH, LPM_WIDTHAD=LPM_WIDTHAD, LPM_NUMWORDS=LPM_NUMWORDS, LPM_INDATA="REGISTERED", LPM_ADDRESS_CONTROL="REGISTERED", LPM_OUTDATA=LPM_OUTDATA, LPM_FILE=LPM_FILE, USE_EAB=USE_EAB);BEGIN-- dissecting the i2c busclk=i2cBusIn[0];rd=i2cBusIn[2];add[]=i2cBusIn[I2CBUSWIDTH-1..20];-- wait logicwaitCounter[].clk=cLk;sel=rd & add[]>=SUBADDRESS & add[]<=LASTADD;IF (sel) THEN IF (waitCounter[]<3) THEN waitCounter[]=waitCounter[]+1; ELSE waitCounter[]=waitCOunter[]; END IF;ELSE waitCounter[]=0;END IF;-- the ram itselfmyRam.inclock=sysClk;myRam.data[]=dataIn[];myRam.we=we;myRam.outclock=clk;shiftedAdd[]=add[]-SUBADDRESS;IF sel THEN myRam.address[]=shiftedAdd[LPM_WIDTHAD-1..0];ELSE myRam.address[]=address[];END IF;i2cBusOut[19..12]=i2cBusIn[19..12] & (myRam.q[] # !sel); -- data outi2cBusOut[2..0]=i2cBusIn[2..0]; -- rd/wr/clki2cBusOut[3]=(waitCounter[]!=3 & sel) # i2cBusIn[3]; -- waiti2cBusOut[11..4]=i2cBusIn[11..4]; -- data ini2cBusOut[I2CBUSWIDTH-1..20]=i2cBusIn[I2CBUSWIDTH-1..20]; -- addressEND;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?