verilog实现大小端转换及在axi中的应用

1、大小端的定义
大端:高位字节在前,低位字节在后;
小端:高位字节在后,低位字节在前;
例:有一个wdata=0hc2d3_e47f,要写入addr=0h4000,
数据的高位是c2,低位是7f,地址的高位是04,低位是01。
当采用大端时:
4001-c2,4002-d3,4003-e4,4004-7f;
当采用小端时:
4001-7f,4002-e4,4003-d3,4004-c2;
通常因特网协议中使用大端模式,x86体系使用小端模式,数据在本地和网络间进行交换时,需要进行大小端转换。
2、verilog实现大小端转换

module top_module 
		(
		input   [31:0] in,
		output  [31:0] out
		);

	assign out[31:24] =in[ 7: 0];
	assign out[23:16] =in[15: 8];
	assign out[15: 8] =in[23:16];
	assign out[ 7: 0] =in[31:24];

	assign out = {in[7-:8],in[15-:8],in[23-:8],in[31-:8]};

endmodule

在实际应用中,大小端转换首先要考虑的是data width,32/64/128/256; 其次,对于axi协议,需要同时转换对应的strb信号;最后,如果考虑模块化,则需要定义不同的分支如无大小端转换操作,全转换操作,或16bit转化操作,以及写读通道。

上述代码是简单地32位数据位宽的全转换操作,对于axi,如
data_out = {data_in[7-:8], data_in[15-:8], data_in[23-:8], data_in[31-:8]};
strb_out = {strb_in[0], strb_in[1],strb_in[2],strb_in[3]};

3、在axi中的应用
例:data bus采用大端,wdata=0hc2d3_e47f,addr=0h4001;
module由endian信号决定,当endian=1‘b0时,采用大端;endian=1’b1时,采用小端;
特殊情况,假设32位地址只有前6bit有效,高位地址未分配,无效。

endian=1’b0时:
axsize=2,32位有效
wdata_bus=0hc2d3_e47f
wdata_module=0hc2d3_e47f (低8位0111_1111,前6位有效)
实际低8位存储数据 0011_1111
rdata=0h0000_003f

endian=1’b1时:
axsize=2,32位有效
wdata_bus=0hc2d3_e47f
wdata_module=0h7fe4_d3c2 (低8位1100_0010,前6位有效)
实际低8位存储数据 0000_0010
rdata=0h0000_0002

实现大小端可以用reg去控制endian实现转换,特殊情况也可以直接force来转换。

在实际应用个

发布了38 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45270982/article/details/104643631