【ATA】基于FPGA的高速数据采集ATA (Advanced Technology Attachment)接口verilog开发

1.软件版本

modelsim 6.5se

2.本算法理论知识

       在此ATA命令集中,记录了ATA协议中所有命令的代码,以及对应的命令传输类型和传输模式。通过将记录命令块寄存器组中命令寄存器的命令代码,与AEA命令集中的代码进行比较,找到此代码在命令集中对此命令的定义,进行命令分析,实现以下功能:

·命令操作类型:读或者写,通过读写信号RD/WR将命令传输类型发送给Flash文件系统,当RD/WR =1时,表示该命令类型为读操作,否则,为写操作。

·若该命令下的数据需要加/解密处理,则向加密核发出加懈密请求信号:加密请求信号en_en,解密请求信号de_en。当en_en=‘1’时,加密核对数据进行加密处理;当de_en=‘1’时,加密核则进:两信号不同时为‘1’。若命令下传输的数据不需要加解密,则发送数据直通请求,此时信号en_en=‘0,并且de_en=‘0’。

·解析得到命令类型的和传输模式,通过Trans_mode(l~0)信号将当前命令的传输模式发送给Flash文件系统和传输控制模块。

该命令解析模块在分析某一条命令下所传输的数据是否需要加解密处理的过程中,我们认真细致的分析了ATA/ATAPI-7协议中对每条命令的描述,很清晰地总结出命令代码及其传输类型和传输模式,以及在该条命令下传输的数据是否进行加/解密处理,得到了所有需要加解密处理的命令,如在PIO传输模式下,需要加密处理的写命令C5h(命令代码)和需要解密处理的读命令C4h;在Ultra-DMA传输模式下,需要加密处理的写命令CAH从和需要解密处理的读命令C8h;不需要进行加解密处理的设备识别命令Ech等。除此之外,其它命令下传输的数据均不需加解密处理,直接传输,即直通。通过ATA命令集模块对命令代码的分析,为Flash文件系统确定对Flash存储介质进行读或者写操作提供基本信息。

2 ATA数据传输方式

ATA接口的数据传输包括PIO和DMA两种方式。PIO方式是硬盘数据传输的基本方式。PIO方式分为又分为5种模式:mode0、mode1、mode2、mode3、mode4,各模式下接口传输最大速率分别为:3.3、5.6、8.3、11.1、16.7MB/S,在PIO方式下,数据的传输以数据块(1个或者多个扇区sector)为单位,每传输完一个数据块后,硬盘都会产生一个中断请求,并向主机报告命令执行结果。

在DMA方式下,主机和硬盘之间需要通过一系列握手信号建立一个DMA通道,数据以数据流的形式传输。当传输完一个命令的所有数据时,硬盘产生一个中断请求,并向主机报告命令执行结果。DMA方式分为Multiword DMA(简称MDMA)和Ultra DMA(简称UDMA)两种模式,其中MDMA分为3种模式:mode0、mode1、mode2,各模式下接口传输最大速率分别为:4.2、13.3、16.7MB/S;UDMA分6种模式:mode0、mode1、mode2、mode3、mode4、mode5,各模式下接口传输最大速率分别为:16.7、25、33.3、44.4、100、133MB/S。UDMA方式在选通信号的上升沿和下降沿均锁定数据,提高了数据的传输速率,并且在数据传输结束时还要进行CRC校验。

3 ATA协议及命令解析

ATA协议按用途分为17种子协议,17种子协议又都分为对Host端和对Device端的,下面着重介绍论文设计中使用到的对Device端10种子协议及子协议所包含的命令和子协议的状态机,其它子协议为简单的辅助协议或ATAPI协议,这里不予介绍。

图1 ATA子协议之间关系

ATA协议的包括17种子协议分别为:Power-on and hardware reset协议、Bus idle协议、No-data command协议、PIO data-in command协议、PIO data-out command协议、DMA command协议、EXECUTE DEVICE DIAGNOSTIC command协议、Ultra DMA data-in command协议、Ultra DMA data-out command协议、Ultra DMA CRC协议、Read/Write DMA Queued command协议、Signature and persistence协议、PACKET command协议、DEVICE RESET command协议、Single device配置协议、Software reset协议、Packet command协议等。

各个子协议之间的状态转换关系如图4-1,本论文着重介绍上面列出的前10种针对Device端的子协议,根据这些协议在数据传输中的作用可以分为用于数据传输类协议和非数据传输类协议,其中带PIO和DMA的协议为数据传输类协议,其它协议为非数据传输类协议。数据传输类协议主要完成数据输入输出传输及数据缓冲等功能,非数据传输类协议则主要完成协助数据传输、命令执行、总线等待、电源管理、软件硬件复位、设备诊断和设备使用安全等功能。

IDE接口的主机严格遵守ATA/ATAPI协议,在识别IDE接口上的硬件设备之后,按照ATA协议或者ATAPI协议的命令集对设备进行访问和操作。IDE设备盘遵守ATA/ATAPI协议中ATA协议的命令集,因此,我们必须对ATA/ATAPI协议中的所有命令集进行解析工作。

对于一个主机系统,从主机的角度来看,IDE设备的控制器就像两个I/O寄存器组。它们处于ISA总线中的I/O位置,而不是内存寻址空间。尽管PC兼容机中把I/O寻址空间限定在0到3FFh,但是它却可以使用从0到FFFFh的寻址空间。其中,命令寄存器组用来给磁盘驱动器发送命令并进行数据交换;控制寄存器组用来控制磁盘驱动器。

       我们设计的ATA主机控制器是基于WISHBONE协议的,其仅兼容PIO传输方式,由两个block。ATA主机控制器和wishbone控制器之间有两条数据通道,一条是wishbone控制器的数据通道,当准备进行数据传输的时候,ATA主机控制器接收来自控制器的指令。设置ATA主机控制器或则设置所连接的ATA设备。

3.部分源码

`include "timescale.v"

module atahost_pio_tctrl(clk, nReset, rst, IORDY_en, T1, 
                         T2, T4, Teoc, go, we, oe, done, dstrb, 
                         DIOR, DIOW, IORDY);

	parameter TWIDTH = 8;
	parameter PIO_MODE0_T1   =  6;  
	parameter PIO_MODE0_T2   = 28; 
	parameter PIO_MODE0_T4   =  2; 
	parameter PIO_MODE0_Teoc = 23; 

	input clk; 
	input nReset; 
	input rst; 
	
	
	input IORDY_en;     
	input [TWIDTH-1:0] T1;  
	input [TWIDTH-1:0] T2; 
	input [TWIDTH-1:0] T4; 
	input [TWIDTH-1:0] Teoc; 


	input go; // PIO controller selected 
	input we; // write enable signal. 1'b0 == read, 1'b1 == write

	output oe; // output enable 
	reg oe;
	output done; 
	output dstrb; // data strobe, latch data 
	reg dstrb;

	output DIOR; // IOread 
	reg DIOR;
	output DIOW; // IOwrite 
	reg DIOW;
	input  IORDY; // IOrDY 


	// PIO mode 0 settings
	wire [TWIDTH-1:0] T1_m0   = PIO_MODE0_T1;
	wire [TWIDTH-1:0] T2_m0   = PIO_MODE0_T2;
	wire [TWIDTH-1:0] T4_m0   = PIO_MODE0_T4;
	wire [TWIDTH-1:0] Teoc_m0 = PIO_MODE0_Teoc;

	// variable declaration
	reg busy, hold_go;
	wire igo;
	wire T1done, T2done, T4done, Teoc_done, IORDY_done;
	reg hT2done;

	always@(posedge clk or negedge nReset)
		if (~nReset)
			begin
				busy    <=   1'b0;
				hold_go <=   1'b0;
			end
		else if (rst)
			begin
				busy    <=   1'b0;
				hold_go <=   1'b0;
			end
		else
			begin
				busy    <=   (igo | busy) & !Teoc_done;
				hold_go <=   (go | (hold_go & busy)) & !igo;
			end

	assign igo = (go | hold_go) & !busy;

	ro_cnt #(TWIDTH, 1'b0, PIO_MODE0_T1)
		t1_cnt(
			.clk(clk),
			.rst(rst),
			.nReset(nReset),
			.cnt_en(1'b1),
			.go(igo),
			.d(T1),
			.q(),
			.done(T1done)
		);

	always@(posedge clk or negedge nReset)
		if (~nReset)
			begin
				DIOR <=   1'b0;
				DIOW <=   1'b0;
				oe   <=   1'b0;
			end
		else if (rst)
			begin
				DIOR <=   1'b0;
				DIOW <=   1'b0;
				oe   <=   1'b0;
			end
		else
			begin
				DIOR <=   (!we & T1done) | (DIOR & !IORDY_done);
				DIOW <=   ( we & T1done) | (DIOW & !IORDY_done);
				oe   <=   ( (we & igo) | oe) & !T4done;           
			end

	ro_cnt #(TWIDTH, 1'b0, PIO_MODE0_T2)
		t2_cnt(
			.clk(clk),
			.rst(rst),
			.nReset(nReset),
			.cnt_en(1'b1),
			.go(T1done),
			.d(T2),
			.q(),
			.done(T2done)
		);

	always@(posedge clk or negedge nReset)
		if (~nReset)
			hT2done <=   1'b0;
		else if (rst)
			hT2done <=   1'b0;
		else
			hT2done <=   (T2done | hT2done) & !IORDY_done;

	assign IORDY_done = (T2done | hT2done) & (IORDY | !IORDY_en);

	always@(posedge clk)
		dstrb <=   IORDY_done;

	ro_cnt #(TWIDTH, 1'b0, PIO_MODE0_T4)
		dhold_cnt(
			.clk(clk),
			.rst(rst),
			.nReset(nReset),
			.cnt_en(1'b1),
			.go(IORDY_done),
			.d(T4),
			.q(),
			.done(T4done)
		);

	assign done = T4done; 
	
	ro_cnt #(TWIDTH, 1'b0, PIO_MODE0_Teoc)
		eoc_cnt(
			.clk(clk),
			.rst(rst),
			.nReset(nReset),
			.cnt_en(1'b1),
			.go(IORDY_done),
			.d(Teoc),
			.q(),
			.done(Teoc_done)
		);

endmodule
    在ATA/ATAPI-5协议中,PIO传输方式可以分为PIO寄存器和PIO数据传输。PIO寄存器和PIO数据传输的传输过程基本相同。其Verilog代码如下所示:
	always@(posedge clk)
	begin : synch_incoming
		cIORDY <=   IORDY;
		cINTRQ <=   INTRQ;
		sIORDY <=   cIORDY;
		irq    <=    cINTRQ;
	end
	always@(posedge clk or negedge nReset)
		if (~nReset)
			begin
				RESETn <=   1'b0;
				DIORn  <=   1'b1;
				DIOWn  <=   1'b1;
				DA     <=   0;
				CS0n	  <=   1'b1;
				CS1n	  <=   1'b1;
				DDo    <=   0;
				DDoe   <=   1'b0;
			end
		else if (rst)
			begin
				RESETn <=  1'b0;
				DIORn  <=   1'b1;
				DIOWn  <=   1'b1;
				DA     <=   0;
				CS0n	  <=   1'b1;
				CS1n	  <=  1'b1;
				DDo    <=   0;
				DDoe   <=   1'b0;
			end
		else
			begin
				RESETn <=   !IDEctrl_rst;
				DA     <=   PIOa[2:0];
				CS0n   <=   !( !PIOa[3] & PIOreq); 
				CS1n   <=   !(  PIOa[3] & PIOreq); 
				DDo    <=   PIOd;
				DDoe   <=   PIOoe;
				DIORn  <=   !PIOdior;
				DIOWn  <=   !PIOdiow;
			end
	always@(posedge clk)
		if (dstrb)
			PIOq <=   DDi;
	always @(posedge clk or negedge nReset)
		if (~nReset)
			begin
				dPIOreq <=  1'b0;
				PIOgo   <=   1'b0;
			end
		else if (rst)
			begin
				dPIOreq <=   1'b0;
				PIOgo   <=   1'b0;
			end
		else
			begin
				dPIOreq <=   PIOreq & !PIOack;
				PIOgo   <=   (PIOreq & !dPIOreq) & IDEctrl_IDEen;
			end
	assign T1      = PIO_cmdport_T1;
	assign T2      = PIO_cmdport_T2;
	assign T4      = PIO_cmdport_T4;
	assign Teoc    = PIO_cmdport_Teoc;
	assign IORDYen = PIO_cmdport_IORDYen;
	atahost_pio_tctrl #(TWIDTH, PIO_mode0_T1, PIO_mode0_T2, PIO_mode0_T4, PIO_mode0_Teoc)
		PIO_timing_controller (
			.clk(clk),
			.nReset(nReset),
			.rst(rst),
			.IORDY_en(IORDYen),
			.T1(T1),
			.T2(T2),
			.T4(T4),
			.Teoc(Teoc),
			.go(PIOgo),
			.we(PIOwe),
			.oe(PIOoe),
			.done(PIOdone),
			.dstrb(dstrb),
			.DIOR(PIOdior),
			.DIOW(PIOdiow),
			.IORDY(sIORDY)
		);
	always@(posedge clk)
		PIOack <=  PIOdone | (PIOreq & !IDEctrl_IDEen);

4.仿真分析

    在ATA/ATAPI-5协议中,PIO传输方式可以分为PIO寄存器和PIO数据传输。PIO寄存器和PIO数据传输的传输过程基本相同。 

     PIO时序控制器主要用来控制PIO协议传输的时序,使其能够正常工作。其主要代码如下所示:

5.参考文献

[01]Michael Keating.片上系统—可重用设计方法学(第三版)[M].电子工业出版社.2004

[02]Mark Zwolinski.VHDL数字系统设计[M].电子工业出版社.2004

[03]Uwe Meyer-Baese.数字信号处理的FPGA实现[M].清华大学出版社.2003,01A08-34

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/124676023