1
0
mirror of https://github.com/pConst/basic_verilog.git synced 2025-01-14 06:42:54 +08:00
2019-05-24 14:03:34 +03:00

212 lines
7.5 KiB
Verilog

/*
This file is a simple top level that will generate one of four types of
Avalon-MM master. As a result all the ports must be declared and it will be
up to the component .tcl file to stub unused signals.
*/
// altera message_off 10034
module custom_master (
clk,
reset,
// control inputs and outputs
control_fixed_location,
control_read_base,
control_read_length,
control_write_base,
control_write_length,
control_go,
control_done,
control_early_done,
// user logic inputs and outputs
user_read_buffer,
user_write_buffer,
user_buffer_input_data,
user_buffer_output_data,
user_data_available,
user_buffer_full,
// master inputs and outputs
master_address,
master_read,
master_write,
master_byteenable,
master_readdata,
master_readdatavalid,
master_writedata,
master_burstcount,
master_waitrequest
);
parameter MASTER_DIRECTION = 0; // 0 for read master, 1 for write master
parameter DATA_WIDTH = 32;
parameter MEMORY_BASED_FIFO = 1; // 0 for LE/ALUT FIFOs, 1 for memory FIFOs (highly recommend 1)
parameter FIFO_DEPTH = 32;
parameter FIFO_DEPTH_LOG2 = 5;
parameter ADDRESS_WIDTH = 32;
parameter BURST_CAPABLE = 0; // 1 to enable burst, 0 to disable it
parameter MAXIMUM_BURST_COUNT = 2;
parameter BURST_COUNT_WIDTH = 2;
input clk;
input reset;
// control inputs and outputs
input control_fixed_location;
input [ADDRESS_WIDTH-1:0] control_read_base; // for read master
input [ADDRESS_WIDTH-1:0] control_read_length; // for read master
input [ADDRESS_WIDTH-1:0] control_write_base; // for write master
input [ADDRESS_WIDTH-1:0] control_write_length; // for write master
input control_go;
output wire control_done;
output wire control_early_done; // for read master
// user logic inputs and outputs
input user_read_buffer; // for read master
input user_write_buffer; // for write master
input [DATA_WIDTH-1:0] user_buffer_input_data; // for write master
output wire [DATA_WIDTH-1:0] user_buffer_output_data; // for read master
output wire user_data_available; // for read master
output wire user_buffer_full; // for write master
// master inputs and outputs
output wire [ADDRESS_WIDTH-1:0] master_address;
output wire master_read; // for read master
output wire master_write; // for write master
output wire [(DATA_WIDTH/8)-1:0] master_byteenable;
input [DATA_WIDTH-1:0] master_readdata; // for read master
input master_readdatavalid; // for read master
output wire [DATA_WIDTH-1:0] master_writedata; // for write master
output wire [BURST_COUNT_WIDTH-1:0] master_burstcount; // for bursting read and write masters
input master_waitrequest;
generate // big generate if statement to select the approprate master depending on the direction and burst parameters
if(MASTER_DIRECTION == 0)
begin
if(BURST_CAPABLE == 1)
begin
burst_read_master a_burst_read_master(
.clk (clk),
.reset (reset),
.control_fixed_location (control_fixed_location),
.control_read_base (control_read_base),
.control_read_length (control_read_length),
.control_go (control_go),
.control_done (control_done),
.control_early_done (control_early_done),
.user_read_buffer (user_read_buffer),
.user_buffer_data (user_buffer_output_data),
.user_data_available (user_data_available),
.master_address (master_address),
.master_read (master_read),
.master_byteenable (master_byteenable),
.master_readdata (master_readdata),
.master_readdatavalid (master_readdatavalid),
.master_burstcount (master_burstcount),
.master_waitrequest (master_waitrequest)
);
defparam a_burst_read_master.DATAWIDTH = DATA_WIDTH;
defparam a_burst_read_master.MAXBURSTCOUNT = MAXIMUM_BURST_COUNT;
defparam a_burst_read_master.BURSTCOUNTWIDTH = BURST_COUNT_WIDTH;
defparam a_burst_read_master.BYTEENABLEWIDTH = DATA_WIDTH/8;
defparam a_burst_read_master.ADDRESSWIDTH = ADDRESS_WIDTH;
defparam a_burst_read_master.FIFODEPTH = FIFO_DEPTH;
defparam a_burst_read_master.FIFODEPTH_LOG2 = FIFO_DEPTH_LOG2;
defparam a_burst_read_master.FIFOUSEMEMORY = MEMORY_BASED_FIFO;
end
else
begin
latency_aware_read_master a_latency_aware_read_master(
.clk (clk),
.reset (reset),
.control_fixed_location (control_fixed_location),
.control_read_base (control_read_base),
.control_read_length (control_read_length),
.control_go (control_go),
.control_done (control_done),
.control_early_done (control_early_done),
.user_read_buffer (user_read_buffer),
.user_buffer_data (user_buffer_output_data),
.user_data_available (user_data_available),
.master_address (master_address),
.master_read (master_read),
.master_byteenable (master_byteenable),
.master_readdata (master_readdata),
.master_readdatavalid (master_readdatavalid),
.master_waitrequest (master_waitrequest)
);
defparam a_latency_aware_read_master.DATAWIDTH = DATA_WIDTH;
defparam a_latency_aware_read_master.BYTEENABLEWIDTH = DATA_WIDTH/8;
defparam a_latency_aware_read_master.ADDRESSWIDTH = ADDRESS_WIDTH;
defparam a_latency_aware_read_master.FIFODEPTH = FIFO_DEPTH;
defparam a_latency_aware_read_master.FIFODEPTH_LOG2 = FIFO_DEPTH_LOG2;
defparam a_latency_aware_read_master.FIFOUSEMEMORY = MEMORY_BASED_FIFO;
end
end
else
begin
if(BURST_CAPABLE == 1)
begin
burst_write_master a_burst_write_master(
.clk (clk),
.reset (reset),
.control_fixed_location (control_fixed_location),
.control_write_base (control_write_base),
.control_write_length (control_write_length),
.control_go (control_go),
.control_done (control_done),
.user_write_buffer (user_write_buffer),
.user_buffer_data (user_buffer_input_data),
.user_buffer_full (user_buffer_full),
.master_address (master_address),
.master_write (master_write),
.master_byteenable (master_byteenable),
.master_writedata (master_writedata),
.master_burstcount (master_burstcount),
.master_waitrequest (master_waitrequest)
);
defparam a_burst_write_master.DATAWIDTH = DATA_WIDTH;
defparam a_burst_write_master.MAXBURSTCOUNT = MAXIMUM_BURST_COUNT;
defparam a_burst_write_master.BURSTCOUNTWIDTH = BURST_COUNT_WIDTH;
defparam a_burst_write_master.BYTEENABLEWIDTH = DATA_WIDTH/8;
defparam a_burst_write_master.ADDRESSWIDTH = ADDRESS_WIDTH;
defparam a_burst_write_master.FIFODEPTH = FIFO_DEPTH;
defparam a_burst_write_master.FIFODEPTH_LOG2 = FIFO_DEPTH_LOG2;
defparam a_burst_write_master.FIFOUSEMEMORY = MEMORY_BASED_FIFO;
end
else
begin
write_master a_write_master(
.clk (clk),
.reset (reset),
.control_fixed_location (control_fixed_location),
.control_write_base (control_write_base),
.control_write_length (control_write_length),
.control_go (control_go),
.control_done (control_done),
.user_write_buffer (user_write_buffer),
.user_buffer_data (user_buffer_input_data),
.user_buffer_full (user_buffer_full),
.master_address (master_address),
.master_write (master_write),
.master_byteenable (master_byteenable),
.master_writedata (master_writedata),
.master_waitrequest (master_waitrequest)
);
defparam a_write_master.DATAWIDTH = DATA_WIDTH;
defparam a_write_master.BYTEENABLEWIDTH = DATA_WIDTH/8;
defparam a_write_master.ADDRESSWIDTH = ADDRESS_WIDTH;
defparam a_write_master.FIFODEPTH = FIFO_DEPTH;
defparam a_write_master.FIFODEPTH_LOG2 = FIFO_DEPTH_LOG2;
defparam a_write_master.FIFOUSEMEMORY = MEMORY_BASED_FIFO;
end
end
endgenerate
endmodule