Line 35... |
Line 35... |
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
|
module pit_wb_bus #(parameter ARST_LVL = 1'b0, // asynchronous reset level
|
module pit_wb_bus #(parameter ARST_LVL = 1'b0, // asynchronous reset level
|
parameter DWIDTH = 16)
|
parameter DWIDTH = 16,
|
|
parameter SINGLE_CYCLE = 1'b0)
|
(
|
(
|
// Wishbone Signals
|
// Wishbone Signals
|
output reg [DWIDTH-1:0] wb_dat_o, // databus output
|
output reg [DWIDTH-1:0] wb_dat_o, // databus output
|
output reg wb_ack_o, // bus cycle acknowledge output
|
output wb_ack_o, // bus cycle acknowledge output
|
input wb_clk_i, // master clock input
|
input wb_clk_i, // master clock input
|
input wb_rst_i, // synchronous active high reset
|
input wb_rst_i, // synchronous active high reset
|
input arst_i, // asynchronous reset
|
input arst_i, // asynchronous reset
|
input [ 2:0] wb_adr_i, // lower address bits
|
input [ 2:0] wb_adr_i, // lower address bits
|
input [DWIDTH-1:0] wb_dat_i, // databus input
|
input [DWIDTH-1:0] wb_dat_i, // databus input
|
Line 59... |
Line 60... |
input [47:0] read_regs // status register bits
|
input [47:0] read_regs // status register bits
|
);
|
);
|
|
|
|
|
// registers
|
// registers
|
|
reg bus_wait_state; // Holdoff wb_ack_o for one clock to add wait state
|
|
|
// Wires
|
// Wires
|
wire eight_bit_bus;
|
wire eight_bit_bus;
|
|
wire wb_wacc; // WISHBONE Write Strobe
|
|
|
//
|
//
|
// module body
|
// module body
|
//
|
//
|
|
|
Line 74... |
Line 77... |
|
|
assign async_rst_b = arst_i ^ ARST_LVL;
|
assign async_rst_b = arst_i ^ ARST_LVL;
|
assign sync_reset = wb_rst_i;
|
assign sync_reset = wb_rst_i;
|
|
|
// generate wishbone signals
|
// generate wishbone signals
|
wire wb_wacc = wb_cyc_i & wb_stb_i & wb_we_i & wb_ack_o;
|
assign wb_wacc = wb_cyc_i && wb_stb_i && wb_we_i && (wb_ack_o || SINGLE_CYCLE);
|
|
assign wb_ack_o = SINGLE_CYCLE ? wb_cyc_i && wb_stb_i : bus_wait_state;
|
|
|
// generate acknowledge output signal
|
// generate acknowledge output signal, By using register all accesses takes two cycles.
|
always @(posedge wb_clk_i)
|
// Accesses in back to back clock cycles are not possable.
|
wb_ack_o <= wb_cyc_i & wb_stb_i & ~wb_ack_o; // because timing is always honored
|
always @(posedge wb_clk_i or negedge async_rst_b)
|
|
if (!async_rst_b)
|
|
bus_wait_state <= 1'b0;
|
|
else if (sync_reset)
|
|
bus_wait_state <= 1'b0;
|
|
else
|
|
bus_wait_state <= wb_cyc_i && wb_stb_i && !bus_wait_state;
|
|
|
// assign data read bus -- DAT_O
|
// assign data read bus -- DAT_O
|
always @(posedge wb_clk_i)
|
always @(posedge wb_clk_i)
|
case ({eight_bit_bus, wb_adr_i}) // synopsys parallel_case
|
case ({eight_bit_bus, wb_adr_i}) // synopsys parallel_case
|
// 8 bit Bus, 8 bit Granularity
|
// 8 bit Bus, 8 bit Granularity
|