FPGA---Aurora

1. Aurora_ip介绍(以8b/10b为例)

1.功能:两个fpga之间进行通讯的工具
2.区别:	8b/10b,axi_stream的数据位宽是32bit(我设置的)
		64b/66b,axi_stream的数据位宽是64bit(我设置的)
	为什么64b的比8b的好呢?
			因为8b的浪费了20%的带宽(也就是速度慢了)
	一般来说小数据量用8b就可以了,大数据量就得用64b了,具体还是要看项目的要求

ip核的设置

aurora_ip核
另外界面就不放了,那俩保持默认,或者你想初学时想要时钟少一点就看看第三个界面的设置吧,我懒得搞了

话不多说,直接放程序(初学者,我就不放过fifo的了,这个不过fifo的程序接收数据的时候跳了一下,别直接用哦,好好研究一下吧

 AURORA_TOP.V
module Aurora_TOP #(
	parameter DATA_LEN		= 32					,//这俩我是为了可以随时更改aurora的模式(8b或者64b的)
	parameter KEEP_LEN		= 4						
) (
	input						usr_rst				,//系统复位信号
	input						usr_clk				,//系统时钟,这里使用是为了产生aurora需要的两个复位信号,和init_clk直接连到一起的
	
	input						i_gt_clk_p			,//gt差分时钟,125mhz的
	input						i_gt_clk_n			,
	input						i_init_clk			,//初始化时钟,50mhz的

	output						o_aurora_txp		,//看名字
	output						o_aurora_txn		,

	input						i_aurora_rxp		,//看名字
	input						i_aurora_rxn			
);

	wire						s_reset				;
	wire						s_gt_reset			;

	wire						s_user_clk			;

	wire		[DATA_LEN-1:0]	s_axi_tx_tdata		;
	wire		[KEEP_LEN-1:0]	s_axi_tx_tkeep		;
	wire						s_axi_tx_tlast		;
	wire						s_axi_tx_tvalid		;
	wire						s_axi_tx_tready		;

	wire		[DATA_LEN-1:0]	s_axi_rx_tdata		;
	wire		[KEEP_LEN-1:0]	s_axi_rx_tkeep		;
	wire						s_axi_rx_tlast		;
	wire						s_axi_rx_tvalid		;

	wire						s_channel_up		;
	wire						s_lane_up			;

	wire						s_hard_err			;
	wire						s_soft_err			;
	wire						s_frame_err			;
//产生aurora需要的复位信号
	AURORA_RST u_Aurora_rst(
		.usr_clk				( usr_clk			),
		.usr_rst				( usr_rst			),

		.o_reset				( s_reset			),
		.o_gt_reset				( s_gt_reset		)
	);
//很简单的一个axi的程序
	AURORA_AXI u_Aurora_axi(
		.usr_clk				( s_user_clk		),
		.usr_rst				( usr_rst			),

		.i_channel_up			( s_channel_up		),

		.o_axi_tx_tdata			( s_axi_tx_tdata	),
		.o_axi_tx_tkeep			( s_axi_tx_tkeep	),
		.o_axi_tx_tlast			( s_axi_tx_tlast	),
		.o_axi_tx_tvalid		( s_axi_tx_tvalid	),
		.i_axi_tx_tready		( s_axi_tx_tready	),

		.i_axi_rx_tdata			( s_axi_rx_tdata	),
		.i_axi_rx_tkeep			( s_axi_rx_tkeep	),
		.i_axi_rx_tlast			( s_axi_rx_tlast	),
		.i_axi_rx_tvalid		( s_axi_rx_tvalid	)
	);

//初学时无关的输入都设置为0(我也是初学者,还不是很懂那些输入信号)
	aurora_8b10b_0 u_aurora_8b10b_0 (

		.reset					( s_reset			),
		.gt_reset				( s_gt_reset		),

		.gt_refclk1_p			( i_gt_clk_p		),
		.gt_refclk1_n			( i_gt_clk_n		),
		.init_clk_in			( i_init_clk		),
		.drpclk_in				( i_init_clk		),

		//speed = 3.125,lane_width = 4 --> data_width = 32
		//because 8b/10b,so data_width = 32*(10/8) = 40
		//so o_user_clk = 3.125g/40 = 78.125mhz,输出的user时钟,给子模块当时时钟用的

		.user_clk_out			( s_user_clk		),

		.channel_up				( s_channel_up		),//o
		.lane_up				( s_lane_up			),//o

		.s_axi_tx_tdata			( s_axi_tx_tdata	),//i
		.s_axi_tx_tkeep			( s_axi_tx_tkeep	),//i
		.s_axi_tx_tlast			( s_axi_tx_tlast	),//i
		.s_axi_tx_tvalid		( s_axi_tx_tvalid	),//i
		.s_axi_tx_tready		( s_axi_tx_tready	),//o

		.m_axi_rx_tdata			( s_axi_rx_tdata	),//o
		.m_axi_rx_tkeep			( s_axi_rx_tkeep	),//o
		.m_axi_rx_tlast			( s_axi_rx_tlast	),//o
		.m_axi_rx_tvalid		( s_axi_rx_tvalid	),//o
 
		.hard_err				( s_hard_err		),//o
		.soft_err				( s_soft_err		),//o
		.frame_err				( s_frame_err		),//o

		.rxp					( i_aurora_rxp		),//i
		.rxn					( i_aurora_rxn		),//i

		.txp					( o_aurora_txp		),//o
		.txn					( o_aurora_txn		),//o

		.sync_clk_out			( ),
		.gt_reset_out			( ),
		.gt_refclk1_out			( ),

		.loopback				( 3'b000),
		.drpaddr_in				( 'd0	),
		.drpen_in				( 'd0	),
		.drpdi_in				( 'd0	),
		.drprdy_out				( ),
		.drpdo_out				( ),
		.drpwe_in				( 'd0	),

		.power_down				( 1'b0	),
		.tx_lock				( ),
		.tx_resetdone_out		( ),
		.rx_resetdone_out		( ),
		.link_reset_out			( ),
		.pll_not_locked_out		( ),
		.sys_reset_out			( ),

		.gt0_qplllock_out		( ),
		.gt0_qpllrefclklost_out	( ),
		.gt_qpllclk_quad2_out	( ),
		.gt_qpllrefclk_quad2_out( )
	);

endmodule
 AURORA_RST.V(这个是借鉴哪个博主的,忘了)
module AURORA_RST (
	input						usr_clk				,
	input						usr_rst				,

	output						o_reset				,
	output						o_gt_reset			
	
);
	parameter GT_RESET_START	= 128				;//说了她最少得拉低128个时钟
	parameter GT_RESET_END		= 256				;//另一个复位只要比上面长就行,256=128*2,就是凭心里咋舒服咋来
	parameter RESET_MAX			= GT_RESET_END + GT_RESET_START;

	reg							r_reset				;
	reg							r_gt_reset			;

	reg					[10:0]	r_start_cnt			;
	wire						s_start				;

	reg					[10:0]	r_cnt				;

	assign s_start = (r_start_cnt < RESET_MAX - 1 && r_start_cnt > 'd0);

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_start_cnt <= 'd0;
		end else begin
			if(r_start_cnt == RESET_MAX - 1) begin
				r_start_cnt <= r_start_cnt;
			end else begin
				r_start_cnt <= r_start_cnt + 1'b1;
			end
		end
	end

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_cnt <= 'd0;
		end else if(s_start) begin
			if(r_cnt == RESET_MAX - 1) begin
				r_cnt <= 'd0;
			end else begin
				r_cnt <= r_cnt + 1'b1;
			end
		end else ;
	end

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_gt_reset <= 1'b0;
		end else begin
			if(r_cnt == GT_RESET_START - 1) begin
				r_gt_reset <= 1'b1;
			end else if (r_cnt == GT_RESET_END - 1 || r_cnt == 0 ) begin
				r_gt_reset <= 1'b0;
			end 
		end
	end

	assign o_gt_reset = r_gt_reset;

	always @ (posedge usr_clk) begin
		if (s_start) begin
			r_reset <= 1'b1;
		end else begin
			r_reset <= 1'b0;
		end
	end

	assign o_reset = r_reset;

endmodule
 AURORA_AXI.V,这个就不多介绍了,很简单的(当时学的时候主要是初始化有点烦)
module AURORA_AXI #(
	parameter DATA_LEN			= 32				,
	parameter KEEP_LEN			= 4				
) (
	input						usr_clk				,
	input						usr_rst				,

	input						i_channel_up		,

	output		[DATA_LEN-1:0]	o_axi_tx_tdata		,
	output		[KEEP_LEN-1:0]	o_axi_tx_tkeep		,
	output						o_axi_tx_tlast		,
	output						o_axi_tx_tvalid		,
	input						i_axi_tx_tready		,

	input		[DATA_LEN-1:0]	i_axi_rx_tdata		,
	input		[KEEP_LEN-1:0]	i_axi_rx_tkeep		,
	input						i_axi_rx_tlast		,
	input						i_axi_rx_tvalid		
);

	localparam NUM				= 63				;

	localparam C_TXIDLE			= 4'h0				;
	localparam C_TXDATA			= 4'h1				;
	localparam C_TXEND			= 4'hf				;

	localparam C_RXIDLE			= 4'h0				;
	localparam C_RXDATA			= 4'h1				;
	localparam C_RXEND			= 4'hf				;

	reg					[ 3:0]	r_t_now				;
	reg					[ 3:0]	r_t_next			;

	reg					[ 3:0]	r_r_now				;
	reg					[ 3:0]	r_r_next			;

	reg			[DATA_LEN-1:0]	r_axi_tx_tdata		;
	reg			[DATA_LEN-1:0]	r_axi_rx_tdata		;

	reg					[10:0]	r_tx_cnt			;
	reg							r_axi_tx_tlast		;
	reg							r_axi_tx_tvalid		;


	assign o_axi_tx_tkeep = 4'hf;

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_t_now <= C_TXIDLE;
		end else begin
			r_t_now <= r_t_next;
		end
	end

	always @ (*) begin
		r_t_next = C_TXIDLE;
		case (r_t_now)
			C_TXIDLE	:	begin
								if(i_channel_up) begin
									r_t_next = C_TXDATA;
								end else begin
									r_t_next = C_TXIDLE;
								end
							end

			C_TXDATA	:	begin
								if(o_axi_tx_tlast && o_axi_tx_tvalid && i_axi_tx_tready) begin
									r_t_next = C_TXEND;
								end else begin
									r_t_next = C_TXDATA;
								end
							end

			C_TXEND		:	begin
									r_t_next = C_TXIDLE;
							end

			default		:	r_t_next = C_TXIDLE;
		endcase
	end

	always @(posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_axi_tx_tlast <= 1'b0;
		end else begin
			if(i_axi_tx_tready && o_axi_tx_tvalid) begin
				if(r_tx_cnt == 'd63) begin
					r_axi_tx_tlast <= 1'b1;
				end else begin
					r_axi_tx_tlast <= 1'b0;
				end
			end else ;
		end
	end

	assign o_axi_tx_tlast = r_axi_tx_tlast;

	always @(posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_axi_tx_tvalid <= 1'b0;
		end else begin
			if(i_axi_tx_tready) begin
				if(r_t_next == C_TXDATA) begin
					r_axi_tx_tvalid <= 1'b1;
				end else begin
					r_axi_tx_tvalid <= 1'b0;
				end
			end else ;
		end
	end

	assign o_axi_tx_tvalid = r_axi_tx_tvalid;

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_tx_cnt <= 'd0;
		end else begin
			if(r_t_next == C_TXDATA && i_axi_tx_tready) begin
				r_tx_cnt <= r_tx_cnt + 'd1;
			end else if(r_t_next == C_TXEND) begin
				r_tx_cnt <= 'd0;
			end 
		end
	end

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_axi_tx_tdata <= 'dz;
		end else begin
			if(r_t_next == C_TXDATA && i_axi_tx_tready) begin
				r_axi_tx_tdata <= r_axi_tx_tdata + 'd1;
			end else if(r_t_next == C_TXIDLE) begin
				r_axi_tx_tdata <= 'd0;
			end 
		end
	end

	assign o_axi_tx_tdata = r_axi_tx_tdata;

	always @ (posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_r_now <= C_RXIDLE;
		end else begin
			r_r_now <= r_r_next;
		end
	end

	always @ (*) begin
		r_r_next = C_RXIDLE;
		case (r_r_now)
			C_RXIDLE	:	begin
								if(i_axi_rx_tvalid) begin
									r_r_next = C_RXDATA;
								end else begin
									r_r_next = C_RXIDLE;
								end
							end

			C_RXDATA	:	begin
								if(i_axi_rx_tlast) begin
									r_r_next = C_RXEND;
								end else begin
									r_r_next = C_RXDATA;
								end
							end

			C_RXEND		:	begin
								r_r_next = C_RXIDLE;
							end

			default		:	r_r_next = C_RXIDLE;	
		endcase
	end

	always @(posedge usr_clk or posedge usr_rst) begin
		if(usr_rst) begin
			r_axi_rx_tdata <= 'dz;
		end else begin
			if(i_axi_rx_tvalid) begin
				r_axi_rx_tdata <= i_axi_rx_tdata;
			end else begin
				r_axi_rx_tdata <= 'dz;
			end
		end
	end


endmodule
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Aurora黑金FPGA是一种高级可编程逻辑器件,具有极强的处理能力和灵活性。它基于黑金平台,集成了成熟的FPGA技术和先进的计算资源,为用户提供了更高的性能和更广泛的应用领域。 Aurora黑金FPGA具有较大的逻辑门数量和RAM容量,可以支持复杂的逻辑设计和实现。它还拥有高速的数据处理能力,能够快速响应输入信号并进行高效的运算处理。同时,Aurora黑金FPGA还具备低功耗和低延迟的特点,能够在不损失性能的情况下实现能耗的有效控制。 Aurora黑金FPGA还支持多种对外接口和通信协议,包括PCIe、Gigabit Ethernet、HDMI等,方便与外部设备进行数据传输和通信。这使得Aurora黑金FPGA在无线通信、图像处理、人工智能等领域有着广泛的应用。 此外,Aurora黑金FPGA还提供了丰富的软件开发工具和开发环境,用户可以方便地进行代码的编写、仿真和调试。它还支持硬件描述语言,如Verilog和VHDL,用户可以根据自己的需求进行逻辑设计和开发。 总而言之,Aurora黑金FPGA是一款功能强大、性能优越的FPGA产品,具备高速、低功耗、多接口等特点,适用于各种复杂的计算和处理任务。它的应用领域广泛,有着广阔的发展前景。 ### 回答2: Aurora 黑金 FPGA 是一种由中国科技公司黑金电子研发的先进 FPGA 芯片。FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,可以在硬件级别上实现各种电子系统的功能,具有灵活性和高性能的特点。 Aurora 黑金 FPGA 是黑金电子在 FPGA 技术领域的重要突破。它采用了先进的制造工艺和设计理念,具有更高的性能和更低的功耗。该芯片在逻辑密度、时钟频率、片上存储容量等方面都有显著的提升,可以更好地满足现代高性能计算和通信应用的需求。 Aurora 黑金 FPGA 在设计上也具备了更好的可编程性和灵活性。它支持多种硬件编程语言和开发工具,并且具有丰富的逻辑单元和片上资源,可以实现复杂的算法和数据处理。同时,该芯片还支持多种通信接口和协议,可以灵活地与其他设备进行数据交换和通信。 Aurora 黑金 FPGA 在应用领域上具有广泛的适用性。它可以应用于人工智能、云计算、大数据分析、高速通信等各个领域。通过灵活的编程和配置,可以实现高性能、低功耗的计算和通信任务。该芯片也适用于无线通信网络、高清视频处理、工业控制系统等应用场景。 总结来说,Aurora 黑金 FPGA 是一款具有先进性能和灵活性的 FPGA 芯片。它的问世标志着中国在 FPGA 技术领域的重要突破,将为各个领域的高性能计算和通信应用提供强大的支持。 ### 回答3: Aurora黑金FPGA是一种专为边缘计算和人工智能应用而设计的高性能计算平台。它采用了最先进的FPGA(可编程逻辑门阵列)技术,具有高度的灵活性和可扩展性。 Aurora黑金FPGA的最大特点是其强大的计算能力。它采用了高速内存和并行处理架构,能够在处理海量数据和复杂计算任务时提供出色的性能。它支持低功耗运算,能够大大降低能源消耗,并且具有优异的功耗性能比。 此外,Aurora黑金FPGA还具有较高的并行计算能力。它可以同时处理多个任务,提升计算效率。同时,它还能够灵活适应不同的计算需求,通过重新编程来适配各种应用场景。这使得Aurora黑金FPGA在人工智能、机器学习、图像处理等领域具有广泛的应用前景。 Aurora黑金FPGA还提供了丰富的开发工具和编程接口,使得开发人员能够方便地进行软件开发和调试。同时,它还支持与其他硬件设备的高速通信,可以连接传感器、存储设备或其他外部设备,实现与整个系统的协同工作。 总之,Aurora黑金FPGA是一种具有强大计算能力、高度灵活性和可扩展性的计算平台,适用于各种边缘计算和人工智能应用。它能够提供出色的性能,并且具备广泛的开发和调试工具,为开发人员提供了极大的便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值