module modexpng_mmm_pad
(
clk, rst_n,
fsm_state,
load_xy_addr_lsb,
pad_x_rd_addr, pad_y_rd_addr,
pad_x_rd_ena, pad_y_rd_ena,
pad_x_rd_dout, pad_y_rd_dout,
load_x_din, load_y_din
);
//
// Includes
//
`include "modexpng_parameters.vh"
//`include "modexpng_parameters_x8.vh"
`include "modexpng_mmm_fsm.vh"
//
// Parameters
//
parameter INDEX_WIDTH = 6;
//
// Ports
//
input clk;
input rst_n;
input [FSM_STATE_WIDTH-1:0] fsm_state;
input [INDEX_WIDTH-1:0] load_xy_addr_lsb;
input [WORD_WIDTH-1:0] load_x_din;
input [WORD_WIDTH-1:0] load_y_din;
input [INDEX_WIDTH-1:0] pad_x_rd_addr;
input [INDEX_WIDTH-1:0] pad_y_rd_addr;
input pad_x_rd_ena;
input pad_y_rd_ena;
output [WORD_WIDTH-1:0] pad_x_rd_dout;
output [WORD_WIDTH-1:0] pad_y_rd_dout;
//
// Registers
//
reg [INDEX_WIDTH-1:0] pad_x_wr_addr;
reg [INDEX_WIDTH-1:0] pad_y_wr_addr;
reg pad_x_wr_ena;
reg pad_y_wr_ena;
reg [ WORD_WIDTH-1:0] pad_x_wr_din;
reg [ WORD_WIDTH-1:0] pad_y_wr_din;
bram_1wo_1ro_readfirst_ce #
(
.MEM_WIDTH (WORD_WIDTH),
.MEM_ADDR_BITS (INDEX_WIDTH)
)
pad_x
(
.clk (clk),
.a_addr (pad_x_wr_addr),
.a_en (pad_x_wr_ena),
.a_wr (pad_x_wr_ena),
.a_in (pad_x_wr_din),
.a_out (), // unused
.b_addr (pad_x_rd_addr),
.b_en (pad_x_rd_ena),
.b_out (pad_x_rd_dout)
);
bram_1wo_1ro_readfirst_ce #
(
.MEM_WIDTH (WORD_WIDTH),
.MEM_ADDR_BITS (INDEX_WIDTH)
)
pad_y
(
.clk (clk),
.a_addr (pad_y_wr_addr),
.a_en (pad_y_wr_ena),
.a_wr (pad_y_wr_ena),
.a_in (pad_y_wr_din),
.a_out (), // unused
.b_addr (pad_y_rd_addr),
.b_en (pad_y_rd_ena),
.b_out (pad_y_rd_dout)
);
always @(posedge clk)
//
case (fsm_state)
//
FSM_STATE_LOAD_T1T2_3: begin
pad_x_wr_addr <= load_xy_addr_lsb;
pad_y_wr_addr <= load_xy_addr_lsb;
end
//
default: begin
pad_x_wr_addr <= {INDEX_WIDTH{1'bX}};
pad_y_wr_addr <= {INDEX_WIDTH{1'bX}};
end
//
endcase
always @(posedge clk)
//
case (fsm_state)
//
FSM_STATE_LOAD_T1T2_3: begin
pad_x_wr_din <= load_x_din;
pad_y_wr_din <= load_y_din;
end
//
default: begin
pad_x_wr_din <= load_x_din;
pad_y_wr_din <= load_y_din;
end
//
endcase
always @(posedge clk or negedge rst_n)
//
if (!rst_n) begin
pad_x_wr_ena <= 1'b0;
pad_y_wr_ena <= 1'b0;
end else case (fsm_state)
//
FSM_STATE_LOAD_T1T2_3: begin
pad_x_wr_ena <= 1'b1;
pad_y_wr_ena <= 1'b1;
end
//
default: begin
pad_x_wr_ena <= 1'b0;
pad_y_wr_ena <= 1'b0;
end
//
endcase
endmodule