MCU+FPGA架构的双路串行数据通信系统及方法与流程

文档序号:18940044发布日期:2019-10-23 01:04阅读:301来源:国知局
MCU+FPGA架构的双路串行数据通信系统及方法与流程

本发明涉及一种电数据传输技术领域,特别是一种基于mcu+fpga架构的双路串行数据通信系统及方法。



背景技术:

fpga(field-programmablegatearray,即现场可编程门阵列),内部包括可配置逻辑模块clb(configurablelogicblock)、输入输出模块iob(inputoutputblock)和内部连线(interconnect)三个部分,具有设计周期最短、开发费用最低、风险最小等特点,在通信设备的高速接口电路设计、数字信号处理等领域得到了广泛的应用。在很多应用场合,fpga都需要与mcu(microcontrollerunit,微控制单元)进行组合设计与应用,mcu多用于系统流程控制与特定算法运行,fpga可用于扩展支持外设,如串行外设。并行数据通讯具有传输效率高的特点,因此常应用于fpga与mcu之间数据通信。

在有些应用场合,需要mcu+fpga这类的组合控制系统在不同应用场景下支持不同的串行外设,如果每次需要通过修改mcu和fpga的软件程序来适配通信协议不同的外设,无疑会增大工作量且过程繁琐。



技术实现要素:

本发明的目的在于提供一种基于mcu+fpga架构的双路串行数据通信系统及方法。

实现本发明目的的第一种技术方案为:一种基于mcu+fpga架构的双路串行数据通信系统,包括mcu、fpga、第一串行通信外设和第二串行通信外设;其中mcu与fpga之间通过并行总线的形式进行数据通信,两者之间的信号包括时钟clk、复位resetn、片选信号csn、读信号xrdn、写信号xwen、7位地址总线address[6:0]及16位数据总线data[15:0],fpga与第一通信外设及第二通信外设之间通过串行总线的形式进行数据通讯。

采用上述系统,在mcu一端,文件main.c在主函数main()变量初始化部分声明且定义变量flag_firstin用于指示是否为首次进入或调用函数getdevice(),声明且定义指针变量initial,该指针指向外设fpga所在的地址空间,给定初始值为变量devicetype,作用为初始化并选择当前有效的串行通信外设编号,定义函数getdevice()实现mcu与fpga之间的并行数据通讯。

采用上述系统,每一串行通信外设前设置三态门且后端设置文件模块serialcom;双路串行通信系统数据流与端口映射描述如下,其中device1为第一串行通信外设,device2为第二串行通信外设:

(1)device_type=1时数据总线data值通过三态门k1传递到信号device1_datain,信号device1_datain与模块device1的端口device1_datain端口映射;模块device1收到并判断端口device1_datain的值,将对应的指令数据存入信号tx1_buffer,并发送到端口sout1,端口sout1与文件模块serialcom的信号sout1端口映射;模块serialcom的信号sout1与端口sout端口映射,并通过端口sout将模块device1指令数据发送到外设system;

(2)device_type=1时,模块serialcom的信号sin1与端口sin端口映射,并且信号sin1与模块device1的端口sin1端口映射,serialcom模块通过端口sin接收外设system的数据;模块device1端口sin1将外设system的数据存入信号rx1_buffer,端口device1_dataout与serialcom模块的信号device1_dataout进行端口映射;信号device1_dataout通过三态门k1将外设system的数据传递到数据总线data;

(3)device_type=2时,数据总线data值通过三态门k2传递到信号device2_datain,信号device2_datain与模块device2的端口device2_datain端口映射;模块device2收到并判断端口device2_datain的值,将对应的指令数据存入信号tx2_buffer,并发送到端口sout2,端口sout2与文件模块serialcom的信号sout2端口映射;模块serialcom的信号sout2与端口sout端口映射,并通过端口sout将模块device2指令数据发送到外设system;

(4)device_type=2时,模块serialcom的信号sin2与端口sin端口映射,并且信号sin2与模块device2的端口sin2端口映射,serialcom模块通过端口sin接收外设system的数据;模块device2端口sin2将外设system的数据存入信号rx2_buffer,端口device2_dataout与serialcom模块的信号device2_dataout进行端口映射;信号device2_dataout通过三态门k2将外设system的数据传递到数据总线data。

实现本发明目的的第二种技术方案为:一种根据权利要求1所述系统的数据通信方法,第一串行通信外设通过进程process11与进程process12向外设发送指令,通过进程process13与进程process14接收外设数据;其中

(1)进程process11的执行流程为:

a1,检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤b1、c1、d1;

b1,判断device1_datain是否为1,如果是,则将指令数据cmd1赋予信号tx1_buffe,并将发送状态标志tx1_rdy置1,然后执行步骤d1;如果否,则按顺序依次执行步骤c1、d1;

c1,判断device1_datain是否为2,如果是,则将指令数据cmd2赋予信号tx1_buffer,并将发送状态标志tx1_rdy置1,然后执行步骤d1;如果否,则执行步骤d1;

d1,判断信号tx1_rdy是否为1,如果是,则将信号tx1_rdy置0;

(2)进程process12的执行流程为:

a2,检测是否有时钟clk上升沿事件,如果是,则执行步骤b2。

b2,检测是否有信号tx1_rdy上升沿事件,如果是,则将信号tx1_buffer的数据发送到端口sout1;

(3)进程process13的执行流程为:

a3,检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤b3、c3。

b3,检测是否有数据帧接收起始信号start下降沿事件,如果是,则将端口sin1的数据接收到信号rx1_buffer,并将信号rx1_rdy置1,然后执行步骤(3);如果否,则执行步骤c3。

c3判断信号rx1_rdy是否为1,如果是,则将信号rx1_rdy置0;

(4)进程process14的执行流程为:

a4,检测是否有时钟clk上升沿事件,如果是,则执行步骤b4;

b4检测是否有信号rx1_rdy上升沿事件,如果是,则将信号rx1_buffer的数据发送到端口device1_dataout;

第二串行通信外设通过进程process21与进程process22向外设发送指令,通过进程process23与进程process24接收外设数据;其中

(5)进程process21的执行流程为:

a5,检测是否有时钟clk上升沿事件,如果是,则按顺序依次执行步骤b5、c5、d5。

b5,判断device2_datain是否为1,如果是,则将指令数据cmd3赋予信号tx2_buffer,并将发送状态标志tx2_rdy置1,然后执行步骤d5;如果否,则按顺序依次执行步骤c5、d5。

c5判断device2_datain是否为2,如果是,则将指令数据cmd4赋予信号tx2_buffer,并将发送状态标志tx2_rdy置1,然后执行步骤d5;如果否,则执行步骤d5;

d5判断信号tx2_rdy是否为1,如果是,则将信号tx2_rdy置0;

(6)进程process22的执行流程为:

a6,检测是否有时钟clk上升沿事件,如果是,则执行步骤b6。

b6,检测是否有信号tx2_rdy上升沿事件,如果是,则将信号tx2_buffer的数据发送到端口sout2。

(7)进程process23的执行流程为:

a7,检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤b7、c7。

b7,检测是否有数据帧接收起始信号start下降沿事件,如果是,则将端口sin2的数据接收到信号rx2_buffer,并将信号rx2_rdy置1,然后执行步骤c7;如果否,则执行步骤c7。

c7,判断信号rx2_rdy是否为1,如果是,则将信号rx2_rdy置0。

(8)进程process24的执行流程为:

a8检测是否有时钟clk上升沿事件,如果是,则执行步骤b8。

b8检测是否有信号rx2_rdy上升沿事件,如果是,则将信号rx2_buffer的数据发送到端口device2_dataout。

本发明可方便地选择和配置串行外设编号,省去了通过修改软件程序来适配外设协议的工作量。本发明的软件架构清晰、数据流程明确,易于扩展支持更多的外设。

下面结合说明书附图对本发明作进一步描述。

附图说明

图1为双路串行通讯系统电气连接图。

图2为参考数据帧格式示意图。

图3为mcu指令数据收发机理示意图。

图4为fpga串行通讯外设模块1示意图。

图5为fpga串行通讯外设模块2示意图。

图6为fpga数据收发与串行外设端口映射示意图。

图7为双路串行通信系统数据流与端口映射示意图。

具体实施方式

如图1所示,本发明涉及的电路系统包括微控制单元mcu、fpga、第一串行外设device1及第二串行外设device2。其中微控制单元mcu与fpga之间通过并行总线的形式进行数据通信,两者之间的信号包括时钟clk、复位resetn、片选信号csn、读信号xrdn、写信号xwen、7位地址总线address[6:0]及16位数据总线data[15:0]。fpga与第一串行外设device1及第二串行外设device2之间通过串行总线的形式进行数据通讯,接收数据用rd表示,发送数据用td表示。

如图2所示,假定本发明中的串行通信数据帧格式为18bit/frame,包括1个起始位startcode、3个sinkcode、2个framecode、3个deviceaddress、5个commandcode、3个crccode及1个停止位stopcode。

如图3所示,在微控制单元mcu一端,文件main.c列出了主函数main()的部分内容及实现方式。在变量初始化部分声明且定义unit型变量flag_firstin,初始值为0,该变量的作用为指示是否为首次进入或调用函数getdevice()。声明且定义指针变量initial,该指针指向外设fpga所在的地址空间,给定初始值为变量devicetype,作用为初始化并选择当前有效的串行通信外设编号,即设定fpga与串行外设device1通信或串行外设device2通信。

变量devicetype的设定可通过系统人机交互单元(如按键+液晶屏)实现,在此不对该部分内容描述。

定义函数getdevice(),返回值类型为void,参数为void。假定此前已定义指针变量deviceaddress,该指针指向外设fpga所在的地址空间,变量cmd为mcu向fpga发送的数据请求指令。假定此前已定义指针变量devicedata,该指针指向外设fpga所在的地址空间,变量readdata用于保存外设fpga所在地址devicedata中的数据。

函数getdevice()的执行流程为:

(1)向外设fpga所在地址deviceaddress发送数据请求指令cmd;

(2)判断是否第一次进入或调用函数getdevice(),如果是,则将状态标志flag_firstin置1并退出函数getdevice();如果否,则读取外设fpga所在地址devicedata并保存到变量readdata。

如图4所示,外设模块device1包括进程process1、进程process2、进程process3及进程process4,均为时钟clk事件驱动,进程process1与进程process2处理外设指令的发送,进程process3与进程process4处理外设数据的接收。

进程process1的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤(2)、(3)、(4)。

(2)判断device1_datain是否为1,如果是,则将指令数据cmd1赋予信号tx1_buffer(tx1_buffer<=cmd1),并将发送状态标志tx1_rdy置1(tx1_rdy<=‘1’),然后执行步骤(4);如果否,则按顺序依次执行步骤(3)、(4)。

(3)判断device1_datain是否为2,如果是,则将指令数据cmd2赋予信号tx1_buffer(tx1_buffer<=cmd2),并将发送状态标志tx1_rdy置1(tx1_rdy<=‘1’),然后执行步骤(4);如果否,则执行步骤(4)。

(4)判断信号tx1_rdy是否为1,如果是,则将信号tx1_rdy置0,即tx1_rdy<=‘0’。

进程process2的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则执行步骤(2)。

(2)检测是否有信号tx1_rdy上升沿事件,即rising_edge(tx1_rdy),如果是,则将信号tx1_buffer的数据发送到端口sout1。

进程process3的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤(2)、(3)。

(2)检测是否有数据帧接收起始信号start下降沿事件,即falling_edge(start),如果是,则将端口sin1的数据接收到信号rx1_buffer(rx1_buffer<=sin1),并将信号rx1_rdy置1(rx1_rdy<=‘1’),然后执行步骤(3);如果否,则执行步骤(3)。

(3)判断信号rx1_rdy是否为1,如果是,则将信号rx1_rdy置0,即rx1_rdy<=‘0’。

进程process4的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则执行步骤(2)。

(2)检测是否有信号rx1_rdy上升沿事件,即rising_edge(rx1_rdy),如果是,则将信号rx1_buffer的数据发送到端口device1_dataout。

如图5所示,外设模块device2包括进程process1、进程process2、进程process3及进程process4,均为时钟clk事件驱动,进程process1与进程process2处理外设指令的发送,进程process3与进程process4处理外设数据的接收。

进程process1的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤(2)、(3)、(4)。

(2)判断device2_datain是否为1,如果是,则将指令数据cmd3赋予信号tx2_buffer(tx2_buffer<=cmd3),并将发送状态标志tx2_rdy置1(tx2_rdy<=‘1’),然后执行步骤(4);如果否,则按顺序依次执行步骤(3)、(4)。

(3)判断device2_datain是否为2,如果是,则将指令数据cmd4赋予信号tx2_buffer(tx2_buffer<=cmd4),并将发送状态标志tx2_rdy置1(tx2_rdy<=‘1’),然后执行步骤(4);如果否,则执行步骤(4)。

(4)判断信号tx2_rdy是否为1,如果是,则将信号tx2_rdy置0,即tx2_rdy<=‘0’。

进程process2的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则执行步骤(2)。

(2)检测是否有信号tx2_rdy上升沿事件,即rising_edge(tx2_rdy),如果是,则将信号tx2_buffer的数据发送到端口sout2。

进程process3的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则按顺序依次执行步骤(2)、(3)。

(2)检测是否有数据帧接收起始信号start下降沿事件,即falling_edge(start),如果是,则将端口sin2的数据接收到信号rx2_buffer(rx2_buffer<=sin2),并将信号rx2_rdy置1(rx2_rdy<=‘1’),然后执行步骤(3);如果否,则执行步骤(3)。

(3)判断信号rx2_rdy是否为1,如果是,则将信号rx2_rdy置0,即rx2_rdy<=‘0’。

进程process4的执行流程为:

(1)检测是否有时钟clk上升沿事件,即rising_edge(clk),如果是,则执行步骤(2)。

(2)检测是否有信号rx2_rdy上升沿事件,即rising_edge(rx2_rdy),如果是,则将信号rx2_buffer的数据发送到端口device2_dataout。

如图6所示,serialcom.vhd为fpga软件中的顶层文件模块,包括进程process1、进程process2、进程process3、元件device1及实例化、元件device2及实例化。其中:

进程process1的驱动事件为片选信号csn和写信号xwen,执行流程为:

(1)检测片选信号csn和写信号xwen是否同时为低电平,即csn=‘0’andxwen=‘0’,如果是则按顺序依次执行步骤(2)、(3)、(4);

(2)判断地址总线的值是否为变量initial值,即address=initial,如果是,则将数据总线的值赋予信号device_type(device_type<=data),并将信号flag_type置1(flag_type<=‘1’),然后退出进程process1,如果否,则按顺序依次执行步骤(3)、(4)。

信号device_type用于指示当前与fpga映射与通信的串行外设编号,该信号的值可以为1或2,当信号值为1时,表示当前与fpga映射与通信的为外设device1;反之,信号值为2时,表示当前与fpga映射与通信的为外设device2。信号flag_type用于指示当前是否已收到mcu设定选择当前外设编号指令,当flag_type为1时表示收到mcu设定选择外设编号指令。

(3)判断信号device_type的值是否为1,如果是,则将数据总线的值赋予信号device1_datain并退出进程process1,如果否,则执行步骤(4)。

(4)判断信号device_type的值是否为2,如果是,则将数据总线的值赋予信号device2_datain并退出进程process1。

进程process2的驱动事件为片选信号csn和写信号xrdn,执行流程为:

(1)检测片选信号csn和写信号xrdn是否同时为低电平,即csn=‘0’andxrdn=‘0’,如果是则按顺序依次执行步骤(2)、(3)。

(2)判断信号device_type的值是否为1,如果是,则将信号device1_dataout的值赋予数据总线data,并退出进程process2,如果否,则执行步骤(3)。

(3)判断信号device_type的值是否为2,如果是,则将信号device2_dataout的值赋予数据总线data,并退出进程process2。

进程process3的驱动事件为状态信号flag_type,执行流程为:

(1)检测是否有flag_type上升沿事件,即rising_edge(flag_type),如果有,则按顺序依次执行步骤(2)、(3)、(4)。

(2)判断信号device_type的值是否为1,如果是,则将信号sout1映射到端口sout,信号sin1映射到端口sin,并执行步骤(4);如果否,则执行步骤(3)、(4)。

(3)判断信号device_type的值是否为2,如果是,则将信号sout2映射到端口sout,信号sin2映射到端口sin,并执行步骤(4)。

(4)将信号flag_type赋0,即flag_type<=‘0’。

元件device1及实例化,端口sin1映射到serialcom的信号sin1,端口sout1映射到serialcom的信号sout1,端口device1_datain映射到serialcom的信号device1_datain,端口device1_dataout映射到serialcom的信号device1_dataout,端口clk映射到serialcom的端口clk,端口resetn映射到serialcom的端口resetn。

元件device2及实例化,端口sin2映射到serialcom的信号sin2,端口sout2映射到serialcom的信号sout2,端口device2_datain映射到serialcom的信号device2_datain,端口device2_dataout映射到serialcom的信号device2_dataout,端口clk映射到serialcom的端口clk,端口resetn映射到serialcom的端口resetn。

如图7所示,该图描述了本发明双路串行通信系统数据流与端口映射,具体描述为:

当信号device_type的值等于1时,即device_type=1,三态门k1处于双向导通状态,数据总线data值存入信号device1_datain,信号device1_datain与模块device1的端口device1_datain进行端口映射。模块device1收到并判断端口device1_datain的值,将对应的指令数据存入信号tx1_buffer,并发送到端口sout1,端口sout1与顶层文件模块serialcom的信号sout1进行端口映射。由于device_type=1,模块serialcom的信号sout1与端口sout进行端口映射,并通过端口sout将device1指令数据发送到外设system。

在device_type=1时,模块serialcom的信号sin1与端口sin进行端口映射,并且信号sin1与模块device1的端口sin1进行端口映射,serialcom模块通过端口sin接收外设system的数据。模块device1端口sin1将外设system的数据存入信号rx1_buffer,端口device1_dataout与serialcom模块的信号device1_dataout进行端口映射。信号device1_dataout通过三态门k1将外设system的数据传递到数据总线data。

当信号device_type的值等于2时,即device_type=2,三态门k2处于双向导通状态,数据总线data值存入信号device2_datain,信号device2_datain与模块device2的端口device2_datain进行端口映射。模块device2收到并判断端口device2_datain的值,将对应的指令数据存入信号tx2_buffer,并发送到端口sout2,端口sout2与顶层文件模块serialcom的信号sout2进行端口映射。由于device_type=2,模块serialcom的信号sout2与端口sout进行端口映射,并通过端口sout将device2指令数据发送到外设system。

在device_type=2时,模块serialcom的信号sin2与端口sin进行端口映射,并且信号sin2与模块device2的端口sin2进行端口映射,serialcom模块通过端口sin接收外设system的数据。模块device2端口sin2将外设system的数据存入信号rx2_buffer,端口device2_dataout与serialcom模块的信号device2_dataout进行端口映射。信号device2_dataout通过三态门k2将外设system的数据传递到数据总线data。

本发明的数据流清晰明确,可根据此机理扩展支持更多的外设协议。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1