基于Aurora核的数位转换及数据传输实现

本文详细介绍了基于Aurora核实现的数位转换,包括4到12位、12到16位、16到8位的转换模块,以及在高速串行总线上的数据传输。通过Tra4To12、Tra12To16、Tra16To8等模块,实现了不同位数的数据转换,并在Aurora_TX模块的FRAME_GEN中完成。文章还讨论了Aurora官方示例的原理以及如何精简示例以适应特定需求,并展示了仿真波形验证了转换和传输的正确性。
摘要由CSDN通过智能技术生成

零、系统概述

这个程序实现了如下功能:
1、三组4位数据 合并成 一组12位数据输出;
2、四组12位数据 转为 三组16位数据输出;
3、16位数据 拆分为 两组8位数据输出;
4、8位数据经过Aurora核的处理通过高速串行总线发送给第二个Aurora核。
功能1、2、3均在Aurora_TX模块的FRAME_GEN中实现,其余部分为:
TX-only Simplex Aurora Core为实现发送功能的Aurora核
RX-only Simplex Aurora Core为实现接收功能的Aurora核
FRAME_RECE为处理接收数据的模块

系统总框图
↓↓↓↓↓
系统总框图TRA_TOP模块总框图
↓↓↓↓↓
在这里插入图片描述

一、Tra4To12实现模块

1、功能一框图
在这里插入图片描述

2、功能实现原理
这个模块实现了三个时钟采集三组数据,在第四个时钟并行输出三组数据的功能。
当valid_in信号拉高时、第一个时钟上升沿时,in_data的4位数据被存入寄存器中。经过三个时钟上升沿后,寄存器存入三组共12位数输出到out_data,并且valid_out被拉高,表示输出数据有效。
当valid_out置低时,out_data为0,方便调试不成功时排查错误。

3、功能一代码

`timescale 1ns/1ps

module tra4to12(
	input	[3:0]	in_data		,
	input			clk		    ,
	input			rst_n	    ,
	input			valid_in    ,
	output	[11:0]	out_data    ,
	output	reg		valid_out   
);

reg [1:0] 	cycle_status;
reg [11:0] 	out_data_cache;

parameter cycle0	=0;
parameter cycle1	=1;
parameter cycle2	=2;

always@(posedge clk or posedge rst_n)
	begin
	if(!valid_in) valid_out<=0;
	else
		begin
		if(!rst_n)
			begin
			out_data_cache[11:0]<=12'b0;
			valid_out<=0;
			cycle_status<=cycle0;
			end
		else
			begin
				case(cycle_status)
					cycle0:
						begin
						out_data_cache[11:8]<=in_data;
						cycle_status<=cycle1;
						valid_out<=0;
						end
					cycle1:
						begin
						out_data_cache[7:4]<=in_data;
						cycle_status<=cycle2;
						valid_out<=0;
						end
					cycle2:
						begin
						out_data_cache[3:0]<=in_data;
						cycle_status<=cycle0;
						valid_out<=1;
						end
				endcase
			end
		end
	end
	
assign out_data=valid_out?out_data_cache:12'b0;

endmodule

二、Tra12To16实现模块

1、功能二框图
在这里插入图片描述
2、功能二实现原理
这个模块实现了不同位数的数据互相转换的功能。
在cycle_status的每一状态,判断valid_in是否拉高,拉高则读取in_data存入out_data_cache;置低则维持状态。
在cycle_status的cycle1、cycle2、cycle3分别输出高16位、中16位、低16位。
当valid_out置低时,out_data为0,方便调试不成功时排查错误。
3、功能二代码

`timescale 1ns/1ps

module tra12to16(
	input		[11:0]	in_data		,
	input				clk		    ,
	input				rst_n	    ,
	input				valid_in    ,
	output	reg	[15:0]	out_data    ,
	output	reg			valid_out   
);

reg [1:0] 	cycle_status;
reg [1:0] 	cycle_status_next;
reg [47:0] 	out_data_cache;

parameter cycle0	=0;
parameter cycle1	=1;
parameter cycle2	=2;
parameter cycle3	=3;

always@(posedge clk or posedge rst_n)
	begin
	if(!rst_n)
		begin
		out_data_cache[47:0]<= 48'h000000;
		valid_out<=0;
		cycle_status<=cycle0;
		out_data<=0;
		end
	else
		begin
		case(cycle_status)
			cycle0:
				begin
				if(valid_in)
					begin
					out_data_cache[47:36]<=in_data;
					cycle_status<=cycle1;
					valid_out<=0;
					end
				else
					begin
					cycle_status<=cycle0;
					valid_out<=0;
					end
				end
			cycle1:
				begin
				if(valid_in)
					begin
					out_data_cache[35:24]<=in_data;
					cycle_status<=cycle2;
					valid_out<=1;
					end
				else
					begin
					cycle_status<=cycle1;
					valid_out<=0;
					end
				end
			cycle2:
				begin
				if(valid_in)
					begin
					out_data_cache[23:12]<=in_data;
					cycle_status<=cycle3;
					valid_out<=1;
					end
				else
					begin
					cycle_status<=cycle2;
					valid_out<=0;
					end	
				end
			cycle3:
				begin
				if(valid_in)
					begin
					out_data_cache[11:0]<=in_data;
					cycle_status<=cycle0;
					valid_out<=1;
					end
				else
					begin
					cycle_status<=cycle3;
					valid_out<=0;
					end
				end
		endcase
		end
	end

always@(valid_out)
	begin
	if(!valid_out)	out_data<=16'h0;
	else
		case(cycle_status)
			cycle2:out_data<=out_data_cache[47:32];
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值