片上系统设计思想与源代码分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.8 WISHBONE从设备接口示例

3.8.1 一个8比特从设备

前文曾经指出,WISHBONE总线规范是“轻量级(Lightweight)”规范,它实现起来非常简单紧凑,接口需要的互联逻辑非常少。这里给出一个WISHBONE从设备的一个例子,如图3-19所示。该从设备由一个与门和8个D触发器构成。在写周期,当STB_I和WE_I同时有效,数据DAT_I[7:0]在时钟CLK_I的上升沿被写到触发器中。

图3-19 一个简单的WISHBONE从设备

该从设备的RTL代码如下:

module slave8bit(input CLK_I,//这里使用了Verilog 2001语法
    input RST_I,
    input [7:0] DAT_I,
    input STB_I,input WE_I,
    output reg[7:0] DAT_O,output ACK_O);
always @(posedge CLK_I or posedge RST_I ) begin
    if(RST_I) begin
      DAT_O<=8'h00;
    end
    else if(STB_I&WE_I)begin
        DAT_O<=DAT_I;
    end
end
assign ACK_O=STB_I;
endmodule

该从设备的WISHBONE文档如表3-4所示。

表3-4 从设备的WISHBONE文档

3.8.2 一个32比特RTL级随机数生成器从设备

下面举一个实用一点的例子,一个随机数生成器。该随机数生成器的源代码可以从http://www.opencores.org的Systemc/Verilog Random Number Generator项目下得到。该模块端口定义如下:

module rng(clk,reset,loadseed_i,seed_i,number_o);

number_o为随机数输出,当loadseed_I有效时,种子seed_I被送入number_o成为随机数的第一个值。随机数每个时钟周一期变化一次,可在任何时钟周期读取。

下面要将实例包装成WISHBONE兼容的从模块,其Verilog RTL代码如下:

//Rng_wbc.v
module Rng_wbc(input CLK_I,
    input RST_I,
    input [31:0] DAT_I,
    input STB_I,input WE_I,
    input [3:0] SEL_I,
    output [31:0] DAT_O,output ACK_O);
    assign ACK_O=STB_I;
    wire loadseed=WE_I&STB_I&(|SEL_I);
    wire [31:0] seed;
    assign seed[7:0]  =SEL_I[0]?DAT_I[7:0]  :8'h00;
    assign seed[15:8] =SEL_I[1]?DAT_I[15:8] :8'h00;
    assign seed[23:16]=SEL_I[2]?DAT_I[23:16]:8'h00;
    assign seed[31:24]=SEL_I[3]?DAT_I[31:24]:8'h00;
    wire [31:0]  rand_number;
    assign DAT_O[7:0]  =SEL_I[0]?rand_number[7:0]  :8'h00;
    assign DAT_O[15:8] =SEL_I[1]?rand_number[15:8] :8'h00;
    assign DAT_O[23:16]=SEL_I[2]?rand_number[23:16]:8'h00;
    assign DAT_O[31:24]=SEL_I[3]?rand_number[31:24]:8'h00;
//Instance of random number generator
  rng unit_rng(.clk (CLK_I) , .reset(RST_I),.loadseed_i(loadseed), .seed_i(seed),
.number_o(rand_number));
endmodule

该从设备的WISHBONE文档如表3-5所示。

表3-5 从设备的WISHBONE文档