Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $ cat memory_controller.v
- module memory_controller(clk,
- devices_mem_en,
- device_1_mem_addr,
- device_2_mem_addr,
- device_3_mem_addr,
- device_1_mem_di,
- device_2_mem_di,
- device_3_mem_di,
- devices_mem_we,
- devices_do_ack,
- mem_do);
- input clk;
- input [2:0] devices_mem_en;
- input [7:0] device_1_mem_addr;
- input [7:0] device_2_mem_addr;
- input [7:0] device_3_mem_addr;
- input [7:0] device_1_mem_di;
- input [7:0] device_2_mem_di;
- input [7:0] device_3_mem_di;
- input [2:0] devices_mem_we;
- output [2:0] devices_do_ack;
- output [7:0] mem_do;
- parameter DEVICE_1 = 3'd0;
- parameter DEVICE_2 = 3'd1;
- parameter DEVICE_3 = 3'd2;
- parameter NO_ONE = 3'b111;
- reg mem_enable = 0;
- reg [7:0] mem_addr = 7'd0;
- reg [7:0] mem_di = 7'd0;
- reg [2:0] current_slave = NO_ONE;
- reg mem_we = 0;
- reg [2:0] serving_slave = 2'd0;
- reg [2:0] devices_do_ack = 3'd0;
- always @(posedge clk)
- begin
- if (current_slave == NO_ONE)
- mem_enable <= 0;
- else
- mem_enable <= devices_mem_en[0] | devices_mem_en[1] | devices_mem_en[2];
- end
- always @(posedge clk)
- begin
- case (current_slave)
- DEVICE_1:
- begin
- mem_addr <= device_1_mem_addr;
- mem_di <= device_1_mem_di;
- mem_we <= devices_mem_we[0];
- end
- DEVICE_2:
- begin
- mem_addr <= device_2_mem_addr;
- mem_di <= device_2_mem_di;
- mem_we <= devices_mem_we[1];
- end
- DEVICE_3:
- begin
- mem_addr <= device_3_mem_addr;
- mem_di <= device_3_mem_di;
- mem_we <= devices_mem_we[2];
- end
- NO_ONE:
- begin
- mem_addr <= 7'd0;
- mem_di <= 7'd0;
- mem_we <= 0;
- end
- endcase
- end
- always @(posedge clk)
- begin
- case(current_slave)
- NO_ONE:
- begin
- devices_do_ack = 3'b000;
- if (devices_mem_en[0])
- current_slave <= DEVICE_1;
- else if (devices_mem_en[1])
- current_slave <= DEVICE_2;
- else if (devices_mem_en[2])
- current_slave <= DEVICE_3;
- else
- current_slave <= NO_ONE;
- end
- DEVICE_1:
- begin
- devices_do_ack = 3'b001;
- if (devices_mem_en[1])
- current_slave <= DEVICE_2;
- else if (devices_mem_en[2])
- current_slave <= DEVICE_3;
- end
- DEVICE_2:
- begin
- devices_do_ack = 3'b010;
- if (devices_mem_en[2])
- current_slave <= DEVICE_3;
- else if (devices_mem_en[0])
- current_slave <= DEVICE_1;
- end
- DEVICE_3:
- begin
- devices_do_ack = 3'b100;
- if (devices_mem_en[0])
- current_slave <= DEVICE_1;
- else if (devices_mem_en[1])
- current_slave <= DEVICE_2;
- end
- endcase
- end
- ram mem(clk, mem_enable, mem_addr, mem_di, mem_do, mem_we);
- endmodule
Add Comment
Please, Sign In to add comment