Ваш верилог модуль из которого можно прочитать процессором что либо должен иметь слейв интерфейс (читайте спецификацию).
Грубо говоря это набор сигналов и правил для этих сигналов.
простой слейв будет выгляеть примерно вот так
Код
module MyModule (
input clk;
input reset;
input chipselect;
input read;
input [3:0] adress;
output reg [31:0] readdata;
input write;
input [31:0] writedata;
);
reg [31:0] buffer;
always @(posedge clk or posedge reset )
begin
if (reset)
begin
readdata<=0;
buffer<=5;
end
else
begin
if (chipselect & write)
begin
buffer<=writedata; // writing
end
if (chipselect & read)
begin
if (adress==2)
readdata<=buffer;
else
readdata<=0;
end
end
end
endmodule
обратите внимание на адрес - 5 бит
в соотв разрядности будет выделено адресное пространство
когда Вы сделаете указатель на это адресное пространство в Си коде
то при чтении или записи по этому указателю будет инициироваться транзакция чтения или записи мастером данных процессора
ну и вот если вы запишете в это адресное пространство число то оно попадёт в регистр буффер
чтобы считать записанное значение надо будет потом обратиться к адресу базовый + 2
ps.
если есть ошибки то прошу прощения - не компилировал
вот нашёл ещё мелкий слейв для учебных целей
Код
module MyModule(
clk,
chipselect,
reset,
address,
read,
readdata,
write,
writedata,
irq
);
input clk;
input chipselect;
input reset;
input [3:0]address;
input read;
output [31:0]readdata;
reg [31:0]readdata;
input write;
input [31:0]writedata;
output irq;
reg irq;
// internal regs
reg [31:0]reg0;
reg [31:0]reg1;
reg [31:0]reg2;
reg [31:0]reg3;
always @(posedge clk or posedge reset)
begin
if(reset)
begin
irq<=1'b0;
readdata<=32'b0;
reg0=32'd0;
reg1=32'd1;
reg2=32'd2;
reg3=32'd3;
end
else
begin
if (chipselect & read) // ANALON READING TO CPU
case (address)
4'd0: readdata<=reg0;
4'd1: readdata<=reg1;
4'd2: readdata<=reg2;
4'd3: readdata<=reg3;
endcase
if (chipselect & write) //AVALON WRITING FROM CPU
case(address)
4'd0: reg0<=writedata;
4'd1: reg1<=writedata+reg0;
4'd2: reg2<=writedata-reg1;
4'd3: reg3<=writedata*reg2;
endcase
if (reg0==32'd12) // IRQ PROCESSING
irq<=1;
else
irq<=0;
end
end
endmodule