零、系统概述
这个程序实现了如下功能:
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];