AES算法有限域GF(2**8)上的x乘法运算Verilog实现
不可约多项式为:
有限域上的x乘法:
x的乘法实现Verilog代码:
module mul(
input[7:0] data_in,
output[7:0] data_out
);
reg[7:0] dat;
always @(data_in)
begin
dat <= {data_in[6:0],1'b0};
if(data_in[7] == 1)
begin
dat[4:0] <= 5'b11011 ^ {data_in[3:0],1'b0};
end
end
assign data_out = dat;
endmodule
x的更高次乘法可以通过重复应用x的乘法实现Verilog代码:
用空间换取时间,组合逻辑只需要一个时钟周期
module mul(
input[7:0] data_in,
input[7:0] data_sys,
output[7:0] data_out
);
reg [7:0] dat1 [7:0];
reg [7:0] dat;
always @(data_in,data_sys)
begin
dat1[0] = data_in;
dat1[1] = {data_in[6:0],1'b0};
dat = 8'b00000000;
if(data_in[7] == 1)
begin
dat1[1][4:0] = 5'b11011 ^ {data_in[3:0],1'b0};
end
dat1[2] = {dat1[1][6:0],1'b0};
if(dat1[1][7] == 1)
begin
dat1[2][4:0] = 5'b11011 ^ {dat1[1][3:0],1'b0};
end
dat1[3] = {dat1[2][6:0],1'b0};
if(dat1[2][7] == 1)
begin
dat1[3][4:0] = 5'b11011 ^ {dat1[2][3:0],1'b0};
end
dat1[4] = {dat1[3][6:0],1'b0};
if(dat1[3][7] == 1)
begin
dat1[4][4:0] = 5'b11011 ^ {dat1[3][3:0],1'b0};
end
dat1[5] = {dat1[4][6:0],1'b0};
if(dat1[4][7] == 1)
begin
dat1[5][4:0] = 5'b11011 ^ {dat1[4][3:0],1'b0};
end
dat1[6] = {dat1[5][6:0],1'b0};
if(dat1[5][7] == 1)
begin
dat1[6][4:0] = 5'b11011 ^ {dat1[5][3:0],1'b0};
end
dat1[7] = {dat1[6][6:0],1'b0};
if(dat1[6][7] == 1)
begin
dat1[7][4:0] = 5'b11011 ^ {dat1[6][3:0],1'b0};
end
if(data_sys[0]) dat = dat1[0];
if(data_sys[1]) dat = dat ^ dat1[1];
if(data_sys[2]) dat = dat ^ dat1[2];
if(data_sys[3]) dat = dat ^ dat1[3];
if(data_sys[4]) dat = dat ^ dat1[4];
if(data_sys[5]) dat = dat ^ dat1[5];
if(data_sys[6]) dat = dat ^ dat1[6];
if(data_sys[7]) dat = dat ^ dat1[7];
end
assign data_out = dat;
endmodule