51单片机与FPGA接口逻辑设计(原创)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
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,无效。详细可以看差分信号抗干扰相关资料。
参考资料:
http://www.laogu.com/wz_54842.htm
2)基于FPGA的8051微控制器接口实现-与非网
http://www.eefocus.com/html/08-11/1171326011159H4vQ.shtml
3)dsp和fpga如何实现通讯最优? -- EDN电子设计技术
http://bbs.ednchina.com/showtopic.aspx?id=92478
4)锁存器与触发器的verilog描述
http://linux.chinaunix.net/bbs/archiver/tid-1019408.html
5)32位带锁存移位寄存器(verilog)
http://q.blog.sina.com.cn/einfo/blogfile/41904063010097u7&dpc=1
6)关于类似373锁存器与162245收发器的Verilog代码问题
用户1385927 2010-1-14 09:40
coyoo 2009-8-18 13:58
tengjingshu_112148725 2009-2-10 21:49
用户142112 2009-2-10 19:01
tengjingshu_112148725 2009-2-10 10:24
用户142112 2009-2-8 11:53