51单片机与FPGA接口逻辑设计(原创) FPGA可以嵌入Picoblaze或MicroBlaze软核,进行控制,但这样做的话显然大材小用,完全可以不用嵌入软核,而用我们熟悉的51单片机。 至于51单片机与FPGA接口的协议可以自己设计,下面讨论的是51单片机控制DDS的相位累加器。 51单片机通过串口接受PC机给出的DATA(相位累加值),再通过与FPGA的通信,告诉FPGA相位累加模块(Accumulator)累加值。MCU_FPGA所做的工作是把收到的数据出入模块内的ROM里,使得改变模块里的ROM地址,就能改变输出的累加值。FPGA_MCU通讯的时序为:
DIN:48位累加值串行输入 CLK_WR:输入写信号时钟,DIN的数据稳定后,CLK_WR上升沿写入FPGA内部的寄存器,寄存器的数据移位。 DIN_PRO:写保护,DIN_PRO=0时,模块内ROM的输出随地址变化而变化;DIN_PRO=1,模块内ROM的输出锁存,输出保持DIN_PRO=0时ROM地址所对应的ROM值。 WR:写信号,WR=1时,把FPGA内部寄存器的值写入此时ADDRESS[2:0]地址的ROM空间。 ADDRESS:ROM地址位,3根地址线决定ROM深度为8。ROM的大小为248x8 bit。 实际中,如果采用上面这个时序,大部分时间都出错,这是因为FPGA的时钟是100MHz,周期就是10ns,而51单片机晶振为12MHz左右,指令周期为1MHz,也就是1μs,是极其容易产生大于10ns的干扰,这样的话通讯就会出错。 要解决这个问题,可以让写信号时钟和写信号都差分,只有差分时,写时钟和写信号有正负时才有效,这样才不容易经常出错。 相当于下图的设计
通讯时序为:
DIN、CLK_WR+、CLK_WR-、DIN_PRO、WR+、WR-和ADDRESS一共用了7条线,可以用51单片机的P1口线。其中ADDRESS只有1条,决定DDS频率寄存器只有两个,存两个相位累加字,ADDRESS决定DDS采用哪个相位累加字,从而决定DDS的输出频率,ADDRESS从0变到1或从1变到0,DDS频率变化。 写信号时钟CLK_WR+为正,CLK_WR-为负时,写入DIN的值,所以CLK_WR+和CLK_WR-是“与”的逻辑关系。 写信号WR+为正,WR-为负时,FPGA内部寄存器的值写入此时ADDRESS地址所对应的ROM。所以WR+与WR-也是一个“与”的关系。 实验证明采用这种时序通讯时很少出现误码。 PS:很多时候高电平有效很容易受到干扰,因为干扰通常都是把信号从低拉到高。而低电平有效不容易收到干扰,因为干扰不太可能把信号电平从高拉到低。采用差分的话就更能保证数据的正确,因为干扰通常都是把“正管脚”从低拉到高,而“负管脚”保持高电平不变高电平不变,此时信号相“与”为0,无效。详细可以看差分信号抗干扰相关资料。 参考资料: 1)MCS-51单片机与CPLD/FPGA接口逻辑设计
2)基于FPGA的8051微控制器接口实现-与非网 http://www./html/08-11/1171326011159H4vQ.shtml 3)dsp和fpga如何实现通讯最优? -- EDN电子设计技术 http://bbs./showtopic.aspx?id=92478 4)锁存器与触发器的verilog描述 http://linux./bbs/archiver/tid-1019408.html 5)32位带锁存移位寄存器(verilog) http://q.blog.sina.com.cn/einfo/blogfile/41904063010097u7&dpc=1 6)关于类似373锁存器与162245收发器的Verilog代码问题 |
|