最近用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刚学,会的并不多。所以如果有哪位朋友做过相关的项目,可以不可以把代码贴出来参考参考啊!
|