基于Spartan6系列FPGA的AD4683双道数据采集+SRAM+串口发送设计——学习笔记整理第二天-20220312

博主在上午遇到了AMS1117-5V芯片封装与设计不匹配的问题,幸亏免费打样还有补救机会,提醒以后要注意封装、原理图和电气连接的验证。下午和晚上,博主成功编写了AD4683读时序的代码,实现了250KSPS的采样率,并通过功能仿真验证。分享了Verilog代码并强调了功能仿真中的检查流程。
摘要由CSDN通过智能技术生成

上午:

想尝试着把设计的电路板的电源电路部分进行焊接,结果上手就发现,AMS1117-5V的芯片封装与我设计的并不一致,查阅其数据手册其有三种封装,自己设计的时候没有注意,好在这块板子打的时候是免费的,还有一次机会可以补救。这也提醒自己之后在提交给厂家之前要重点观察:封装的对应性、封装与原理图的对应性、原理图电气连接的正确性等一系列问题,避免后悔莫急。

下午+晚上:

主要进行了AD4683读时序的编写,保证了采样率为250KSPS,通过功能仿真最终实现了读时序的功能,现附上读时序的代码:


/* 本文件搭建一个同步双通道的AD4683控制模块 */

/*
	input	clk,			驱动时钟,25MHz
	input	rst_n,			复位信号
	input	AD_SDA,			AD4683通道A的数据线
	input	AD_SDB,			AD4683通道B的数据线
	input	AD_RdorWr_Req,	AD4683读或写取请求信号(读为1,写为2,空闲为0)
	(计划利用串口接收模块接受标志,来开启读取或写寄存器)
	
	output	reg				CS_n			AD4683片选寄存器
	output	reg				AD_SDI,			AD4683写操作数据线
	output	reg				SPI_Clock,		AD4683的SPI驱动时钟
	output	reg		[15:0]	ChannelA_Data,	输出至SRAM的A通道数据
	output	reg		[15:0]	ChannelB_Data,	输出至SRAM的B通道数据
	output	reg				AD_Read_Finish	AD4683读取结束标志
*/

module AD4683_Control
(
	input			clk,		
	input			rst_n,
	input			AD_SDA,
	input			AD_SDB,
	input	[1:0]	AD_RdorWr_Req,
	
	output	reg				CS_n,
	output	reg				AD_SDI,
	output	reg				SPI_Clock,
	output	reg		[15:0]	ChannelA_Data,
	output	reg		[15:0]	ChannelB_Data,
	output	reg				AD_Read_Finish
	
);

/*
	参数定义:
			Read	= 2'd1,
			Writer	= 2'd2,
			Idle	= 2'd0;
	
*/

parameter	Read	= 2'd1,
			Write	= 2'd2,
			Idle	= 2'd0;
			




/*
	Cnt_Total:7位的计数器
	
	用于控制AD4683的250KHz的采样率时序读取
	
*/
reg [6:0]	Cnt_Total;
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		Cnt_Total <=7'd0;
	else 
		begin
			case(AD_RdorWr_Req)
				Idle:	Cnt_Total <= 7'd0;
				Read:	
						begin
							if(Cnt_Total<7'd100)
								Cnt_Total <= Cnt_Total + 7'd1;
							else
								Cnt_Total <=7'd0;
						end
				Write:Cnt_Total <= 7'd0;		/*暂时还没配置写的程序*/
				default:Cnt_Total <= 7'd0;
			endcase
		end
		




/*	片选管脚CS_n	*/
/*
	1、复位后默认为高电平
	2、空闲状态保持高电平
	3、当且仅当输入的空闲状态信号变为0,即处于忙碌状态,且有
	读或写请求时才进行拉低
*/
always	@(posedge clk or negedge rst_n)
	if(!rst_n)
		CS_n <= 1'b1;
	else
		begin
			case(AD_RdorWr_Req)
				Idle:	CS_n <= 1'b1;
				Read:
						begin
							if(Cnt_Total < 7'd49)
								CS_n <= 1'b0;
							else if(Cnt_Total == 7'd49)
								CS_n <= 1'b1;
							else if(Cnt_Total == 7'd100)
								CS_n <= 1'b0;
						end
				Write:	CS_n <= 1'b1;		/*暂时还没配置写的程序*/
				default:CS_n <= 1'b1;
			endcase
				
		end


/*
	定义数据个数寄存器,利用SPI时序读取16个数据
*/
reg [4:0]Cnt_data;
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		Cnt_data <=5'd0;
	else if((Cnt_Total >= 9) && Cnt_data<5'd16 && CS_n == 1'b0)
		Cnt_data <=Cnt_data + 1;		
	else if(CS_n == 1'b1 )
		Cnt_data <=5'd0;
		
		
/*	
	ChannelA_Data:通道A数据寄存器	

	读取条件:
	Cnt_Tsclk = 9(意味着相对延时Tsclked=400ns)
	输入驱动时钟上升沿读取数据
 */
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		ChannelA_Data <=16'h00;
	else if((Cnt_Total >= 4'd9 && Cnt_Total < 5'd25) && (Cnt_data <5'd16) && CS_n == 0)
		begin
			ChannelA_Data <={ChannelA_Data[14:0],AD_SDA};
		end
		
/*	
	ChannelB_Data:通道A数据寄存器	

	读取条件:
	Cnt_Tsclk = 9(意味着相对延时Tsclked=400ns)
	输入驱动时钟上升沿读取数据
 */
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		ChannelB_Data <=16'h00;
	else if((Cnt_Total >= 4'd9 && Cnt_Total < 5'd25) && (Cnt_data <5'd16) && CS_n == 0)
		begin
			ChannelB_Data <={ChannelB_Data[14:0],AD_SDB};
		end	
	

endmodule



		
		

在功能仿真的时候,可以对照着功能时序图,一边更改verilog源文件与testbench文件,更改后只需要在Modelsim的菜单栏的Compile中对更改的文件进行编译,然后对仿真图进行Restart后,可以重新看更改后的仿真结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值