8857|9

78

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

单片机与FPGA并行通信 [复制链接]

最近用STM32和FPGA写了个DDS ,FPGA都是现学现卖。

用了4根地址线,8根数据线,和三根控制线.

我的STM32代码:

void Reset_DDS(void)
{
 
  GPIO_ResetBits(GPIOB,GPIO_Pin_1);
  delay_ms(10);
  GPIO_SetBits(GPIOB,GPIO_Pin_1);
}

 

void Send_8bits_data(unsigned char data)

  unsigned int reg;
   /*改变高八位的值*/
  reg=GPIO_ReadOutputData(GPIOB);
  reg=(data<<8)|(reg&0x00ff) ;
  GPIO_Write(GPIOB,reg) ;
 
}

void Send_Addr(unsigned char i)
{
   if(i==9)
     {
    GPIO_ResetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12)      ;
  }
   else if(i==8)
   {
    GPIO_ResetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_10)      ;
 }
   else if(i==7)
   {
 GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10)      ;
   }
   else if(i==6)
   {
 GPIO_ResetBits(GPIOA,GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_8|GPIO_Pin_9);
   }
   else if(i==5)
   {
 GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_12);
   }
  
   else if(i==4)
   {
    GPIO_ResetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_8);
 }
   else if(i==3)
   {
 GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_9);
   }
   else if(i==2)
   {
 GPIO_ResetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9);
   }
   else if(i==1)
   {
 GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12) ;
 GPIO_SetBits(GPIOA,GPIO_Pin_10);
   }
   else
 GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_12) ;
}

void WR_enable()
{
   delay_ms(10);
   GPIO_SetBits(GPIOC,GPIO_Pin_12);
   delay_ms(10);
   GPIO_ResetBits(GPIOC,GPIO_Pin_12);

}

void ReadData()
{
   delay_ms(10);
   GPIO_SetBits(GPIOB,GPIO_Pin_0);
   delay_ms(10);
   GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}


void WD_DDS_CH1(unsigned int data)
{

   Send_Addr(1);
 Send_8bits_data((u8)(data&0x000000ff)) ;
 WR_enable();

 Send_Addr(2);
 Send_8bits_data((u8)((data&0x0000ff00)>>8))  ;
 WR_enable();

    Send_Addr(3);
 Send_8bits_data((u8)((data&0x00ff0000)>>16)) ;
 WR_enable() ;

 Send_Addr(4);
 Send_8bits_data((u8)((data&0xff000000)>>24)) ;
 WR_enable();

 ReadData();
 
}

void WD_DDS_CH2(unsigned int data)
{
 
   Send_Addr(5);
 Send_8bits_data((u8)(data&0x000000ff)) ;
 WR_enable();

 Send_Addr(6);
 Send_8bits_data((u8)((data&0x0000ff00)>>8))  ;
 WR_enable();

    Send_Addr(7);
 Send_8bits_data((u8)((data&0x00ff0000)>>16)) ;
 WR_enable() ;

 Send_Addr(8);
 Send_8bits_data((u8)((data&0xff000000)>>24)) ;
 WR_enable();

 ReadData();
 
}

void WD_DDS_XW(unsigned int data)
{
   Send_Addr(9);
   Send_8bits_data((u8)(data&0xff)) ;
   WR_enable();
}

 

 

FPGA代码:

 

module DDS1(CLK1,DAC1,DAC2,Reset,writedata,SEL,data1,readdata);

input CLK1  ;
output[7:0] DAC1;
output[7:0] DAC2;
input Reset   ;
input writedata  ;
input[3:0] SEL ;    /* data select input */
input[7:0] data1;   /*input data1*/
input readdata;

reg [7:0]  Phase1;

reg [31:0] C1;
reg [31:0] B1;
reg [31:0] C11;
reg [31:0] B11;
reg reg_writedata;
reg reg_Reset;
reg reg_readdata;

parameter N=32'h000D1B71; //10Khz
parameter M=32'h0 ;

initial
begin
B1=0;
C1=0;
end

always @(posedge CLK1)
begin
reg_writedata<=writedata;
reg_Reset<=Reset;
reg_readdata<=readdata;
end

always @(posedge CLK1)
begin
  
    if(reg_Reset==1'b0)
       begin
     C11<=N;
       end

    if(reg_readdata==1'b1)
   begin
     C11<=C1;
   end
  
  if(reg_writedata==1'b1)
    begin
   case(SEL)
   4'b0101: C1[31:24]<=data1 ;
   4'b0110: C1[23:16]<=data1 ;
   4'b0111: C1[15:8] <=data1 ;
   4'b1000: C1[7:0]  <=data1 ;
   4'b1001: Phase1[7:0] <=data1[7:0] ;
   endcase
    end
   
end

always @(posedge CLK1  )
begin

    if(reg_Reset==1'b0)
       begin
     B11<=N;
       end
  
   if(reg_readdata==1'b1)
   begin
     B11<=B1;
   end
  
   if(reg_writedata==1'b1)
    begin
    case(SEL)
    4'b0001: B1[31:24]<=data1 ;
    4'b0010: B1[23:16]<=data1 ;
    4'b0011: B1[15:8] <=data1 ;
    4'b0100: B1[7:0]  <=data1 ;
    endcase
    end
   
end


DDS DDS2(.CLK(CLK1),.B(B11),.C(C11),.Phase(Phase1),.DAC0(DAC2),.DAC(DAC1)) ;

endmodule

 

 

 

但是发现用并行通信有时会出错。

大家有没有什么更好的想法啊,因为我的FPGA刚学,会的并不多。所以如果有哪位朋友做过相关的项目,可以不可以把代码贴出来参考参考啊!

此帖出自FPGA/CPLD论坛

最新回复

可以  详情 回复 发表于 2016-8-6 18:49
点赞 关注(1)
 

回复
举报

6892

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

这个问题主要就是FPGA的异步通信设计。 关于异步通信主要考虑两点:

1。不同时钟域信号的传递,需要时钟同步;

2。双向总线的正确使用;

3。总线通信的机制的正确设置;

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 

回复

141

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
程序代码一大段一大段的 是不是很难想象
此帖出自FPGA/CPLD论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

4
 
并行太费资源。建议用spi
此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

5
 

并行不难,管脚就是数据双向端口的控制而已!

对总线端口不用的时候赋值高阻!

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

6
 

.....

//我这里是要发送5组8位数据给单片机,可能由于FPGA跟单片机电平不同的问题,我建议用检测脉冲的方法来做握手信号

`define        UD #1
module senddata(
                  plase_h,
                  plase_l,
                  pinlv,
           
                  send_data,
                  RST_B,
                  SYSCLK,
                  mcu_in
                );

input [7:0]  plase_h;
input [7:0]  plase_l;
input [23:0] pinlv;

output [7:0] send_data;
reg [7:0]    send_data;




input RST_B;
input SYSCLK ;
input mcu_in ; //mcu_in为FPGA与单片机沟通的信号脉冲 ,每从单片机来一个脉冲,cnt加1计数,从而激发对应数据传输
wire  cnt ;
reg  cnt1;
reg  cnt_N;


always@(posedge mcu_in or negedge RST_B)
begin
       if(!RST_B)
           cnt1 <= `UD 1'h0;
       else
           cnt1 <= `UD cnt_N;
end
always @(*) begin
    if( cnt1 == 1'h6)
        
        cnt_N <= `UD 4'h0;
    else
        cnt_N <= `UD cnt1+ 1'h1;
end
assign cnt=cnt1;

always @(*)
begin case(cnt)
     1'h1: begin send_data = pinlv[7:0];      end
     1'h2: begin send_data = pinlv[15:8];     end
     1'h3: begin send_data = pinlv[23:16];    end
     1'h4: begin send_data = plase_h;       end
     1'h5: begin send_data = plase_l;       end
     default : begin   send_data = 8'h10;     end
     endcase
     end

endmodule
此帖出自FPGA/CPLD论坛
 
 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

7
 
MARK
此帖出自FPGA/CPLD论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

8
 
请问 你的问题解决了吗 我现在也行做stm32和fpga并行通信 有没有源代码可以瞅瞅
此帖出自FPGA/CPLD论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
请问在吗?我也做  STM32和FPGA做DDS,用ram给fpga写波形数据 不是很懂,希望您能给些指导。可以?
此帖出自FPGA/CPLD论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

10
 
可以
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表