FPGA OpenRISC (bylo Verilog a FPGA (bylo FPGA Altera a NIOS))
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Pondělí Únor 16 23:25:14 CET 2015
Muzete nekdo zkuseny mrknout na to, jak jsem napsal multiplexer sbernic?
(nejsou tam zatim vsechny signaly) je to ciste kombinacni logika.
Jestli neco neni uplne spatne - princip je ten, ze na interni signaly
privedu vystupni signaly z jednoho master a vybraneho slave, adresy a
data pak prenasim do vsech cilu (usetri logiku) a jen ridici signaly STB
a CYC budu maskovat smerem k SLAVE, smerem k masterum zase ACK, ERR, RTY
Podle simulace se zda, ze tam jsou docela velka zpozdeni, ale mam to
pres vstupy a vystupy, uvidime v realu... Lze to nejak ovlivnit? At to
napisu ruznymi zpusoby, vznikne celkem slozity propletenec LUTs bez
nejake pruhledne logiky...
Jde mi o posouzeni, jestli nejake konstrukce nejsou uplne spatne nebo
jak to udelat lip, prioritou je nenarocna implementace (tahle zatim
zabere 111 les, tedy spis LUT, bez registru)
module BusMatrix
(
input wb_clk,
input wb_rst,
// OR1K Instruction Master
input [31:0] or32_i_adr_i,
input or32_i_cyc_i,
input or32_i_stb_i,
output [31:0] or32_i_dat_o,
// OR1K Data Master
input [31:0] or32_d_adr_i,
input or32_d_cyc_i,
input or32_d_stb_i,
output [31:0] or32_d_dat_o,
// Debug Master
input [31:0] dbg_adr_i,
input dbg_cyc_i,
input dbg_stb_i,
output [31:0] dbg_dat_o,
// Internal rwx RAM Memory
output [31:0] irwx_ram_adr_o,
output irwx_ram_cyc_o,
output irwx_ram_stb_o,
input [31:0] irwx_ram_dat_i,
// Internal GPIO_0
output [31:0] gpio_0_adr_o,
output gpio_0_cyc_o,
output gpio_0_stb_o,
input [15:0] gpio_0_dat_i,
output [7:0] test_vect
);
`define MASTER_NONE 4'b0000
`define MASTER_I_OR1K_i 0
`define MASTER_I_OR1K_d 1
`define MASTER_I_DBG 3
reg [3:0] master_curr = `MASTER_NONE;
assign test_vect[3:0] = master_curr;
// priority selector
always @(dbg_cyc_i or or32_i_cyc_i or or32_d_cyc_i or wb_rst) begin
if (wb_rst)
master_curr = `MASTER_NONE;
else begin
if (dbg_cyc_i) begin
master_curr = 4'b0001 << `MASTER_I_DBG;
end else if (or32_i_cyc_i) begin
master_curr = 4'b0001 << `MASTER_I_OR1K_i;
end else if (or32_d_cyc_i) begin
master_curr = 4'b0001 << `MASTER_I_OR1K_d;
end else begin
master_curr = `MASTER_NONE;
end
end
end
///////////////////////////////////////////////////
// bus multiplexer
///////////////////////////////////////////////////
reg [31:0] internal_adr_ms;
reg internal_cyc_ms;
reg internal_stb_ms;
reg [31:0] internal_dat_sm;
// Address decoder
wire select_rwx_int_ram;
wire select_gpio;
wire bank0;
wire bank00;
wire bank01;
assign bank0 = (internal_adr_ms[31:24] == 8'h00) && internal_cyc_ms
&& internal_stb_ms;
assign bank00 = (internal_adr_ms[23:16] == 8'h00) && bank0;
assign bank01 = (internal_adr_ms[23:16] == 8'h01) && bank0;
assign select_rwx_int_ram = bank00;
assign select_gpio = bank01 && (internal_adr_ms[15:2] == 14'd0);
always @(*)
begin
if (master_curr[`MASTER_I_OR1K_i]) begin
internal_adr_ms = or32_i_adr_i;
internal_cyc_ms = or32_i_cyc_i;
internal_stb_ms = or32_i_stb_i;
end else if (master_curr[`MASTER_I_OR1K_d]) begin
internal_adr_ms = or32_d_adr_i;
internal_cyc_ms = or32_d_cyc_i;
internal_stb_ms = or32_d_stb_i;
end else if (master_curr[`MASTER_I_DBG]) begin
internal_adr_ms = dbg_adr_i;
internal_cyc_ms = dbg_cyc_i;
internal_stb_ms = dbg_stb_i;
end else begin
internal_adr_ms = 32'h00000000;
internal_cyc_ms = 1'b0;
internal_stb_ms = 1'b0;
end
if (select_rwx_int_ram) begin
internal_dat_sm = irwx_ram_dat_i;
end else if (select_gpio) begin
internal_dat_sm = gpio_0_dat_i;
end else begin
internal_dat_sm = 32'h00000000;
end
end
assign irwx_ram_adr_o = internal_adr_ms; //select_rwx_int_ram ?
internal_adr_ms : 32'h00000000;
assign irwx_ram_cyc_o = internal_cyc_ms & select_rwx_int_ram;
assign irwx_ram_stb_o = internal_stb_ms & select_rwx_int_ram;
assign gpio_0_adr_o = internal_adr_ms; //select_gpio ?
internal_adr_ms : 32'h00000000;
assign gpio_0_cyc_o = internal_cyc_ms & select_gpio;
assign gpio_0_stb_o = internal_stb_ms & select_gpio;
assign or32_i_dat_o = internal_dat_sm;
//master_curr[`MASTER_I_OR1K_i] ? internal_dat_sm : 32'h00000000;
assign or32_d_dat_o = internal_dat_sm;
//master_curr[`MASTER_I_OR1K_d] ? internal_dat_sm : 32'h00000000;
assign dbg_dat_o = internal_dat_sm; //master_curr[`MASTER_I_DBG] ?
internal_dat_sm : 32'h00000000;
endmodule //BusMatrix
---
This email has been checked for viruses by Avast antivirus software.
http://www.avast.com
Další informace o konferenci Hw-list