《FPGA设计心得之Aurora IP核例子简析与仿真.docx》由会员分享,可在线阅读,更多相关《FPGA设计心得之Aurora IP核例子简析与仿真.docx(19页珍藏版)》请在第一文库网上搜索。
1、FPGA设计心得之AUroraIP核例子简析与仿真定制framing接旦的IP核很简单,灵活配置如下参数即可:本例选择小端模式。F1owContro1暂时选择为NOneo(有必要后面专门研究,暂时最主要的还是弄懂用户接口信号的用法!)为分析方面,选择单通道传输数据。生成示例工程并分析如图,右击IP核,打开例子程序,保存到一个位置,即可自动打开例子工程。对于我们用户来说,最重要还是我们的用户程序,通过用户程序模块与AUrOraIP核交互,生成数据发出以及接收IP核传输的数据。文末同样会分享示例工程,所以这里就不把源码贴出来,占用篇幅,给阅读带来不便。GEN模块分析先打开gen模块,对于该模块,有
2、一段描述:/Description:Thismodu1eisapatterngeneratortotesttheAurora/passesit/aframing/sizeand/designsinhardware.ItgeneratesdataandthroughtheAurorachanne1.Ifconnectedtointerface,itgeneratesframesofvaryingseparation.1FSRisusedtogeneratethedataand1owerbitsof1FSRarepseudo-random/connectedtoREMbus.翻译过来:该模块是一个
3、模式生成器,用于在硬件中测试AUrOra设计。它生成数据并将其通过AUrOra通道。如果连接到成帧接口,它将生成大小和间隔不同的帧。1FSR用于生成伪随机数据,并且1FSR的低位连接到REM总线。首先,读了这段描述,一般肯定不知道具体干啥的,但是大概知道是生成一系列数据,并发送出去,而且用的是framing数据格式。让我们看看具体内容:看程序首先看输入输出:/UserInterfaceoutput0:15TX_D;outputTXREM;outputTX_SOF_N;outputTX_EOFN;outputTX_SRC_RDY_N;inputTX_DST_RDY_N;/SystemInterf
4、aceinputUSER_C1K;inputRESET;inputCHANNE1_UP;从这几个信号用户接口,可见,有一些我们熟悉的接口,但是和axi接口的名字起的不一样罢了;让我们对应下:从如下接口方向可以断定:saxitxtready为inputTX_DST_RDY_N;二者之间的关系:作为gen模块用户逻辑的条件,无论是tready还是RDY_N,有效即可。tready为RDY_N的反,从以N结尾也该明白了。也不卖关子了,其他的等价:/UserInterfaceoutput0:15TX_D;/dataoutputTXREM;/?outputTXSOF_N;/startofframeout
5、putTX_EOF_N;/endofframeoutputTX_SRCRDY_N;/va1idinputTXDSTRDY_N;/tready当AUrora通道还未准备好时,需要设计复位,让通道出于复位状态:a1ways(posedgeUSER_C1K)beginif(RESET)channe1_up_cnt=D1Y5,d;e1seif(CHANNE1_UP)if(&channe1_up_cnt)channe1_upent=D1Ychanne1upent;e1sechanne1_upent=D1Ychanne1upent+b1;e1sechanne1_up_cnt=D1Y5d0;endassig
6、nd1y_data_xfer=(&channe1_up_cnt);/GenerateRESETsigna1whenAurorachanne1isnotreadyassignreset_c=RESET!d1y_data_xfer;从上面的计数条件,可见CHANNE1_UP为通道准备好的标志,当其有效时,channe1_up_cnt则从0一直计数到5b1111并保持;否则,channe1_up_cnt为0;这样的话,当CHANNE1JJP无效时,d1y_data_xfer为0,那么reset_c为1即处于复位状态。当CHANNE1_UP为1,也即有效时,也会计数一段时间,确保稳定,之后d1y_da
7、ta_xfer为1那么reset_c的值取决于RESET,RESET无效时,停止复位。这样赢保了,RESET早就停止了复位,而通道还未准备好,等通道准备好了之后,才停止复位,发送逻辑开始有效执行。下面继续分析数据传输的部分:/TransmitData/GeneraterandomdatausingXNORfeedback1FSRa1ways(posedgeUSER_C1K)if(reset_c)begin=D1Y16,hBCD;/randomseed!id1e_.r)data_1fsr_rva1uee1seif(!TXDSTRDY_N&endbeginCIatafsr_r=D1Y!data_1
8、fsr_r3data_1fsr_r12data_1fsr_r14data_1fsr_r15,data_1fsr_r0:14;end/ConnectTX_DtotheDATA1FSRassignTX_D=1data_1fsr_r;可见,要发送的数据是一个有规则产生的随机数据,datafsr_r的初始值作为随机数的种子,之后通过异或非的方式产生随机数。这种产生随机数的方式属于线性反馈移位母储上面出现了一个陌生的变量id1e_r:/Stateregistersforone-hotstatemachineregid1e;regsing1e_cyc1e_frame_r;regsof_r;regdata_
9、cyc1e_r;regeof_r;wirereset_c;I1*wreDec1aratiOnS*wireifg_done_c;/Nextstatesigna1sforone-hotstatemachinewirewirenext_id1e_c;next_sing1e_cyc1e_frame_c;wirewirewirenext_sof_c;next_data_cyc1e_c;next_eof_c;它是状态机变量,众多为了描述状态机而设的变量之一。下面便是状态机部分,可以看出,是一个三段式状态机,很讲究!使用状态机的目的在于确定frame的起始,结束以及要发送数据还是什么也不发送等。/Frami
10、ngStatemachine/Useastatemachinetodeterminewhethertostartaframe,endaframe,send/dataorsendnothing/Stateregistersfor1-hotstatemachinea1ways(posedgeUSER_C1K)if(reset_c)beginid1e_r=D1Yb1;sing1e_cyc1e_frame_r=*D1YbO;sof_r=*D1YbO;data_cyc1e_r=D1Y1,b;eof_r=D1Y1,b;ende1seif(!TX_DSTRDY_N)beginid1e_r=D1Ynext_i
11、d1e_c;sing1e_cyc1e_frame_r=D1Ynext_sing1e_cyc1e_frame_c;sof_r=D1Ynext_sof_c;data_cyc1e_r=D1Ynext_data_cyc1e_ceof_r=D1Ynext_eof_c;end/NextstateIogiCfor1-hotstatemachineassignnext_id1e_c-!ifg_done_c&(sing1e_cyc1e_frame!eof_rIIid1e_r);assignnextsing1e_cyc1e_frame_c=(ifgdonec&(frame_size_r=0)&(id1e_rsin
12、g1e_cyc1e_frame_reof_r);(ifg_done_c&assignnext_sof_c(framesizer!=0)&(id1e_rsing1e_cyc1e_frame_reof_r);(frame_size_r!=(sof_rIIdata_cyc1e_r);(frame_size_r=(sof_rIIdatacyc1er);assignnext_data_cyc1e_cbytes_sent_r)&assignnext_eof_cbytes_sent_r)&/Output1ogicfor1hotstatemachinea1ways(posedgeUSER_C1K)if(res
13、et_c)beginTX_SOF_N=D1Yb1;TX_EOF_N=D1Yb1;TX_SRC_RDY_N=ende1seif(!TX_DST_RDY_N)beginD1Y1,b1;TX_S0F_Nsing1e_cyc1e_frame_r);=D1Y!(sof_rTX_E0F_Nsing1e_cyc1e_frame_r);=D1Y!(eof_rTX_SRCRDY.N=D1Yid1e_r;end程序设计的是一个所谓的独热码状态机,且不是一般的独热码设计方法,类似于:hd1bits,独热码状态机设计,非常重要这个状态机有5个状态,每循环一次,就可以发送一帧数据。五个状态如下:regid1e_r;/空
14、闲状态regSingIe_cyc1e_frame_r;单字帧,也就是一帧数据只有一个字或者少于一个字长regsof_r;帧起始regdata_cyc1e_r;有效赋值数据regeof_r;帧结束由于是独热码,故都是一位变量;次态变量:/Nextstatesigna1sforone-hotstatemachinewirenext_id1e_c;wirenext_sing1e_cyc1e_frame_c;wirenext_sof_c;wirenext_data_cyc1e_c;wirenext_eof_c;对应的次态部分代码:/Nextstate1ogicfor1-hotstatemachineassignnext_id1e_ceof_rIIid1e_r);assignnext_sing1e_cyc1e_frame_c(frame_size_r=0)&sing1e_cyc