Forum Discussion
Altera_Forum
Honored Contributor
13 years agoSFL roadmap:
1. SFL implementation in VHDL: -- declaration component SFL PORT ( noe_in : IN STD_LOGIC ); end component; --instantiation SFL_inst : SFL PORT MAP ( noe_in => '0'); 2. Creation of JAM file a) convert SOF-file to JIC b) use Quartus programmer tool to convert JIC to JAM 3. Software side ...depends on your system... here is just a code snippet showing some JAM wrapper routines for lower level bit banging functions you have to do, anything else is from Altera, an experienced C guy will implement/verify it within a day ... static BYTE TckLevel=0; static BYTE TmsLevel=1; static BYTE TdiLevel=1; # ifdef FAST_JTAG_PROGRAMMING# define TCK_GPO_BIT (1L<<17)# define TDI_GPO_BIT (1L<<26)# define TDO_GPIO_BIT (1L<<8)# endif void JamInit(void) { # ifdef FPGA_EEPROM UWORD32 u32_low = 0; UWORD32 u32_high = 1; bySetDirectionVio(JTAG_TMS, IOCTRL_DIR_OUTPUT_DONTCARE); # if SDI_OUT_OPTION == SDI_2972 bySetVioBurst(SPI_CS_SDI_OUT, &u32_high, 1); # endif // TCK=0 TckLevel=0; bySetVioBurst(JTAG_TCK, &u32_low, 1); // TMS=1 TmsLevel=1; bySetVioBurst(JTAG_TMS, &u32_high, 1); // TDI=1 TdiLevel=1; bySetVioBurst(JTAG_TDI, &u32_high, 1); # endif } void JamClose(void) { # ifdef FPGA_EEPROM bySetDirectionVio(JTAG_TMS, IOCTRL_DIR_INPUT); # endif } void JamTmsHigh(void) { # ifdef FPGA_EEPROM UWORD32 u32_high = 1; if(TmsLevel != 1) bySetVioBurst(JTAG_TMS, &u32_high, 1); TmsLevel = 1; # endif } void JamTmsLow(void) { # ifdef FPGA_EEPROM UWORD32 u32_low = 0; if(TmsLevel != 0) bySetVioBurst(JTAG_TMS, &u32_low, 1); TmsLevel = 0; # endif } void JamTdiHigh(void) { # ifdef FPGA_EEPROM # ifdef FAST_JTAG_PROGRAMMING UWORD32 u32; if(TdiLevel != 1) { GET_REG(GP_OUTPUT,u32); u32 |= TDI_GPO_BIT; SET_REG(GP_OUTPUT,u32); } TdiLevel = 1; # else UWORD32 u32_high = 1; if(TdiLevel != 1) bySetVioBurst(JTAG_TDI, &u32_high, 1); TdiLevel = 1; # endif # endif } void JamTdiLow(void) { # ifdef FPGA_EEPROM # ifdef FAST_JTAG_PROGRAMMING UWORD32 u32; if(TdiLevel != 0) { GET_REG(GP_OUTPUT,u32); u32 &= ~TDI_GPO_BIT; SET_REG(GP_OUTPUT,u32); } TdiLevel = 0; # else UWORD32 u32_low = 0; if(TdiLevel != 0) bySetVioBurst(JTAG_TDI, &u32_low, 1); TdiLevel = 0; # endif # endif } void JamTckHigh(void) { # ifdef FPGA_EEPROM # ifdef FAST_JTAG_PROGRAMMING UWORD32 u32; if(TckLevel != 1) { GET_REG(GP_OUTPUT,u32); u32 |= TCK_GPO_BIT; SET_REG(GP_OUTPUT,u32); } TckLevel = 1; # else UWORD32 u32_high = 1; if(TckLevel != 1) bySetVioBurst(JTAG_TCK, &u32_high, 1); TckLevel = 1; # endif # endif } void JamTckLow(void) { # ifdef FPGA_EEPROM # ifdef FAST_JTAG_PROGRAMMING UWORD32 u32; if(TckLevel != 0) { GET_REG(GP_OUTPUT,u32); u32 &= ~TCK_GPO_BIT; SET_REG(GP_OUTPUT,u32); } TckLevel = 0; # else UWORD32 u32_low = 0; if(TckLevel != 0) bySetVioBurst(JTAG_TCK, &u32_low, 1); TckLevel = 0; # endif # endif } int JamTdoRead(void) { # ifdef FPGA_EEPROM # ifdef FAST_JTAG_PROGRAMMING UWORD32 u32_1, u32_2; do { GET_REG(GPIO_EXT_PORTA,u32_1); GET_REG(GPIO_EXT_PORTA,u32_2); } while(u32_1 != u32_2); if(u32_1 & TDO_GPIO_BIT) return 1; else return 0; # else UWORD32 u32_res; byGetVioBurst(JTAG_TDO, &u32_res, 1); if(u32_res) return 1; else return 0; # endif # endif }