1 . 1 大小端模式的概念
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低
1.2 举例说明
以存储存储0x12345678为例,reg[7:0] buf[3:0]的寄存器。
在大端模式下则存储数据的是低地址存放高字节,高地址存放低字节。
低地址
buf[0] (0x12) – 高位字节
buf[1] (0x34)
buf[2] (0x56)
buf[3] (0x78) – 低位字节
在小端模式下则存储数据的是高地址存放高字节,低地址存放低字节。
低地址
buf[0] (0x78) – 低位字节
buf[1] (0x56)
buf[2] (0x34)
buf[3] (0x12) – 高位字节
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH指令 [1] )进行大小端的切换
1.3 verilog 代码的实现
// 实现大端模式到小端模式的转换
// eg; input 6'b010101 output 6'b101010
//
module endian_rvs(date,en,out);
parameter N = 6;
input [N-1:0] date;
input en;
output [N-1:0] out;
reg [N-1:0] out;
always @(*) begin
if(en)
out = date_rvs(date);
else
out = 0;
end
function [N-1:0] date_rvs;
input[N-1:0] date_in;
integer i;
for(i=0;i<=N;i=i+1)begin
date_rvs[N-1-i] = date_in[i];
end
endfunction
endmodule
// testbench
module endian_rvs_tb;
reg[5:0] date_in;
reg en;
wire[5:0] out;
endian_rvs U1(.date(date_in),.en(en),.out(out));
initial begin
en = 0;
#5;
en = 1;
date_in = 6'b001010;
#5;
date_in = 6'b010100;
#5;
en = 0;
$finish;
end
initial begin
`ifdef DUMP_VPD
$vcdpluson();
`endif
end
endmodule