wishbone代码编写
时间: 2023-07-09 17:48:26 浏览: 45
Wishbone是一种常用的开源总线协议,用于连接不同的IP核或系统模块。以下是一个简单的Wishbone Master模块的Verilog代码示例,用于从SRAM中读取数据:
```
module wishbone_master(
input clk_i,
input rst_ni,
input [31:0] addr_i,
output [31:0] data_o,
output [3:0] sel_o,
output we_o,
output cyc_o,
output stb_o,
input ack_i
);
// 状态机状态定义
localparam IDLE = 2'b00;
localparam SEND_ADDR = 2'b01;
localparam SEND_DATA = 2'b10;
// 状态机寄存器
reg [1:0] state_r;
reg [31:0] data_r;
reg [3:0] sel_r;
reg we_r;
reg cyc_r;
reg stb_r;
// 状态机转移条件
assign cyc_o = (state_r == IDLE) ? 1'b0 : cyc_r;
assign stb_o = (state_r == IDLE) ? 1'b0 : stb_r;
assign sel_o = (state_r == IDLE) ? 4'b1111 : sel_r;
assign we_o = (state_r == SEND_ADDR) ? 1'b0 : we_r;
assign data_o = (state_r == SEND_DATA) ? data_r : 32'hzzzzzzzz;
// 状态机
always @(posedge clk_i or negedge rst_ni) begin
if (~rst_ni) begin
state_r <= IDLE;
data_r <= 32'hzzzzzzzz;
sel_r <= 4'b1111;
we_r <= 1'b0;
cyc_r <= 1'b0;
stb_r <= 1'b0;
end
else begin
case (state_r)
IDLE: begin
if (ack_i) begin
state_r <= SEND_ADDR;
data_r <= 32'hzzzzzzzz;
sel_r <= 4'b1111;
we_r <= 1'b0;
cyc_r <= 1'b1;
stb_r <= 1'b1;
end
else begin
state_r <= IDLE;
data_r <= 32'hzzzzzzzz;
sel_r <= 4'b1111;
we_r <= 1'b0;
cyc_r <= 1'b0;
stb_r <= 1'b0;
end
end
SEND_ADDR: begin
if (ack_i) begin
state_r <= SEND_DATA;
data_r <= 32'hzzzzzzzz;
sel_r <= 4'b1111;
we_r <= 1'b0;
cyc_r <= 1'b1;
stb_r <= 1'b1;
end
else begin
state_r <= SEND_ADDR;
data_r <= 32'hzzzzzzzz;
sel_r <= 4'b1111;
we_r <= 1'b0;
cyc_r <= 1'b0;
stb_r <= 1'b1;
end
end
SEND_DATA: begin
if (ack_i) begin
state_r <= IDLE;
data_r <= data_r;
sel_r <= sel_r;
we_r <= we_r;
cyc_r <= 1'b0;
stb_r <= 1'b0;
end
else begin
state_r <= SEND_DATA;
data_r <= data_r;
sel_r <= sel_r;
we_r <= we_r;
cyc_r <= 1'b1;
stb_r <= 1'b1;
end
end
endcase
end
end
endmodule
```
该模块将Wishbone总线协议中的信号转换为了对SRAM的访问。其中,state_r是状态机的寄存器,data_r、sel_r、we_r、cyc_r和stb_r是状态机中的数据寄存器,用于保存数据、数据选择信号、写使能信号、总线访问周期和总线访问启动信号。状态机中分为三个状态:IDLE、SEND_ADDR和SEND_DATA,用于控制总线的访问。在模块中,首先将状态机初始状态设置为IDLE,当ack_i信号为高电平时,状态机转移到SEND_ADDR状态,开始向SRAM发送地址,接着转移到SEND_DATA状态,从SRAM中读取数据,并将状态机重新设置为IDLE状态,等待下一次访问。