blob: fafdcd2b4628d4b77e9aa41ef8ddc0b3df23f3ac [file] [log] [blame]
`timescale 1ns / 1ps
module encoder_core (
//inputs
i_clk,
i_rstn,
i_valid,
i_ena,
i_load_si,
i_a,
i_b,
i_si,
//outputs
o_a,
o_b,
o_y,
o_w,
o_so
);
parameter MAX_BLOCK_WIDTH = 10,
P_WIDTH = 10,
MAX_DATA_WIDTH = MAX_BLOCK_WIDTH+2;
input i_clk;
input i_rstn;
input i_valid;
input i_ena;
input i_load_si;
input i_a;
input i_b;
input[3:0] i_si;
output o_a;
output o_b;
output o_y;
output o_w;
output[3:0] o_so;
reg[3:0] s_reg;
//
always @(posedge i_clk)
begin
if (i_rstn == 0) //
s_reg <= 0;
else begin
if (i_load_si == 1)
s_reg <= i_si;
else if (i_valid == 1 && i_ena == 1)
begin
s_reg[3] <= i_a ^ i_b ^ s_reg[1] ^ s_reg[0];
s_reg[2] <= s_reg[3] ^ i_b;
s_reg[1] <= s_reg[2];
s_reg[0] <= s_reg[1] ^ i_b;
end
else
s_reg <= s_reg;
end
end
assign o_a = i_a;
assign o_b = i_b;
assign o_y = i_a ^ i_b ^ s_reg[1] ^ s_reg[0] ^ s_reg[3] ^ s_reg[2] ^ s_reg[0];
assign o_w = i_a ^ i_b ^ s_reg[1] ^ s_reg[0] ^ s_reg[2] ^ s_reg[1] ^ s_reg[0];
assign o_so = s_reg;
endmodule