本帖最后由 jinyi7016 于 2016-10-19 14:49 编辑
本人在此之前还从未使用过任何的FPGA产品,所以此次试用也是从零学起。 首先是锆石的教程,真是入门的不二选择。可以这么快的小窥FPGA 的门径,也是多亏了锆石的各种教程。我不仅仅是试用了一款开发板,更是学到了一种技术,对我而言一种全新的技术。 锆石的教程与例程都是非常的丰富,一方面是方便的学习,但也一方便使学习者变得懒惰了。所有工程都打开就好了,这里我都是从头新建的工程,把一切的流程全都自己走一便,尽管是简单的新建工程也是。这样,既可以熟悉软件的使用,也可以在流程中对FPGA有更深的认识。 FPGA有着及其丰富的应用环境,从工业品到消费品都可以找到FPGA的影子。但对于我而言,还是要用到工业上。用其实现各种功能当然是很好的,但是我又是一个ARM与DSP的开发工程师,将这三都结合起来,看上去是更有意义的。所以就产生了这次试用的项目。
模拟一种资源竞争的情况下,使用FPGA 来管理STM32与DSP2812 不会存在同时访问同一资源。比如共用一片SD 卡,共用一片外部RAM 或FLASH 等等,都会存在竞争关系,即不可以同时访问这些资源。 还有就是在PCB面积有限的情况下,又要使用大量的逻辑器件,如几片138 ,几片非门,几片与门之类的,PCB 上放不下,产品尺寸又不能调整,那就只能用一片FPAG (或CPLD )了。 虽然学习使用了Qsys ,但是在这样的项目中,使用Qsys 与使用一片单片机也没有什么区别,所以这里不使用Qsys ,单纯使用硬件语言。 由于手头资源有限,也为了可以直观的看的运行结果,现以PC上的串口为要竞争的公共资源。STM32与DSP都要通过这个串口,向PC发送数据,但是一条总线上若是有两个设备同时在发收,总线势必会乱掉了,这时就要使用FPGA来调节了。
系统结构图如下:
如图,在没有FPGA时,同时给两个开发板上电,PC的串口助手上收不到数据,但是在断电时收到的却是乱码。
STM32的串口2使用9600波特率,偶校验方式进行通讯。
DSP串口配置程序
- void InitScic(void)
- {
- EALLOW;
- GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0;
- GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;
- GpioCtrlRegs.GPBQSEL2.bit.GPIO62 = 3;
- GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1;
- GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1;
-
- ScicRegs.SCICCR.all =0x0007;
- ScicRegs.SCICTL1.all =0x0003;
- ScicRegs.SCICTL2.bit.TXINTENA =1;
- ScicRegs.SCICTL2.bit.RXBKINTENA =1;
- ScicRegs.SCIHBAUD =0x0000;
- ScicRegs.SCILBAUD =0x0027;
- ScicRegs.SCICCR.bit.LOOPBKENA =0;
-
- ScicRegs.SCICTL1.all =0x0023;
- PieVectTable.SCIRXINTC = &scicRxFifoIsr;
- PieVectTable.SCITXINTC = &scicTxFifoIsr;
- EDIS;
- }
复制代码
STM32以9600,偶校验每秒发关两次,字符依次为1、2、3、4、5; DSP以115200,无校验发送,每秒发关一次,字符依次为A、B、C、D、E; 当FPGA接收到了一定量的数据就会以115200波特率发送到PC机的串口中,如下图。
FPGA程序如下:
- module A4_Uart_Top
- (
- //输入端口
- CLK_50M,RST_N,UART_RX,UART_RX_DSP,UART_RX_ST,
- //输出端口
- UART_TX,UART_TX_DSP,UART_TX_ST
- );
- input CLK_50M;
- input RST_N;
- input UART_RX;
- output UART_TX;
- input UART_RX_DSP;
- output UART_TX_DSP;
- input UART_RX_ST;
- output UART_TX_ST;
- wire rx_bps_start;
- wire tx_bps_start;
- wire rx_bps_flag;
- wire tx_bps_flag;
- wire [7:0] out_rx_data;
- wire [7:0] out_tx_data;
- wire rx_bps_dsp_start;
- wire tx_bps_dsp_start;
- wire rx_bps_dsp_flag;
- wire tx_bps_dsp_flag;
- wire [7:0] out_rx_dsp_data;
- wire [7:0] out_tx_dsp_data;
- wire rx_bps_st_start;
- wire tx_bps_st_start;
- wire rx_bps_st_flag;
- wire tx_bps_st_flag;
- wire [7:0] out_rx_st_data;
- wire [7:0] out_tx_st_data;
- Uart_Bps_Module Uart_Rx_Bps_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .bps_start (rx_bps_start ),
- .bps_flag (rx_bps_flag )
- );
- Uart_Rx_Module Uart_Rx_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .UART_RX (UART_RX ),
- .rx_bps_start (rx_bps_start ),
- .rx_bps_flag (rx_bps_flag ),
- .out_rx_data (out_rx_data )
- );
- Uart_Bps_Module Uart_Tx_Bps_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .bps_start (tx_bps_start ),
- .bps_flag (tx_bps_flag )
- );
- Uart_Tx_Module Uart_Tx_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .UART_TX (UART_TX ),
- .tx_bps_start (tx_bps_start ),
- .tx_bps_flag (tx_bps_flag ),
- .tx_start_flag (rx_bps_start ),
- .in_rx_data (out_rx_dsp_data ),
- .out_tx_data (out_tx_data ),
- );
- Uart_Bps_Module Uart_Rx_DSP_Bps_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .bps_start (rx_bps_dsp_start ),
- .bps_flag (rx_bps_dsp_flag )
- );
- Uart_Rx_Module Uart_Rx_DSP_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .UART_RX (UART_RX_DSP ),
- .rx_bps_start (rx_bps_dsp_start ),
- .rx_bps_flag (rx_bps_dsp_flag ),
- .in_rx_data (out_rx_dsp_data ),
-
- );
- Uart_Bps_Module Uart_Tx_DSP_Bps_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .bps_start (tx_bps_dsp_start ),
- .bps_flag (tx_bps_dsp_flag )
- );
- Uart_Tx_Module Uart_Tx_DSP_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .UART_TX (UART_TX_DSP ),
- .tx_bps_start (tx_bps_dsp_start ),
- .tx_bps_flag (tx_bps_dsp_flag ),
- .tx_start_flag (rx_bps_dsp_start ),
- .in_rx_data (out_rx_dsp_data ),
- .out_tx_data (out_tx_dsp_data ),
- );
- Uart_Bps_Module Uart_Rx_ST_Bps_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .bps_start (rx_bps_dsp_start ),
- .bps_flag (rx_bps_dsp_flag )
- );
- Uart_Rx_Module Uart_Rx_ST_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .UART_RX (UART_RX_ST ),
- .rx_bps_start (rx_bps_st_start ),
- .rx_bps_flag (rx_bps_st_flag ),
- .out_rx_data (out_rx_st_data )
- );
- Uart_Bps_Module Uart_Tx_ST_Bps_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .bps_start (tx_bps_st_start ),
- .bps_flag (tx_bps_st_flag )
- );
- Uart_Tx_Module Uart_Tx_ST_Init
- (
- .CLK_50M (CLK_50M ),
- .RST_N (RST_N ),
- .UART_TX (UART_TX_ST ),
- .tx_bps_start (tx_bps_st_start ),
- .tx_bps_flag (tx_bps_st_flag ),
- .tx_start_flag (rx_bps_st_start ),
- .in_rx_data (out_rx_st_data ) ,
- .out_tx_data (out_tx_st_data ),
- );
- endmodule
复制代码
硬件如下图,DSP板是自己打样的开发板,只焊接了必要的元件。
本次项目基本完成。 最后,再次感谢电子民烧友与锆石提供的这次试用机会。
6
评分
-
查看全部评分
|
|
|
|
牛 !!!!!!!
|
|
|
|
|
RE: 【锆石A4 FPGA试用体验】多芯片协同工作的管理(结项) [修改]
|
|
|
|
|