找回密码
 注册
关于网站域名变更的通知
查看: 380|回复: 3
打印 上一主题 下一主题

linux学习之路_添加自己的master (DMA-like) ipcore到ORSoC并测试

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-9-30 16:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    & q9 ?9 }  w/ D% E; I8 E+ {
    本小节中省略了一些virtualbox下的操作细节,请参考上一篇文章:linux学习之路_添加自己的slave IP core到ORSoC并测试; m; |7 H# P  b1 H0 ?
    2 Y& m' q; K1 p, r; ]7 \0 W2 X( [
    4 U% N% x* r& q7 _
    1,控制流程
    % [/ d4 |2 V/ z3 Q" s1>mycore的linux下的driver写slave1 E5 {" X+ x/ @8 o, Z- e5 z1 M* N8 E! P- R
    2>slave根据driver发来的指令控制master
    + P* W" C& G+ S3>master进行相应操作,并返回给slave
    : l; ^3 k& V# {4>mycore的linux下的driver读slave$ d3 Q. \- S6 w7 B+ Z
    9 b3 f+ u7 ~$ Q, g
    2,功能概述- b! F" q# c/ I: k5 ~; I( q
    2.1 master写功能
    - x9 v. c; w3 h 1》driver向slave的num_1寄存器里写入0x11223344, P8 M& G6 @; k% z( l: I4 P  A. s; E3 s- A
    2》driver向slave的write_address寄存器里写入0x00000097.(这是让master 写的地址,其实就是num_1)0 u. Y6 ?% t. ~% |" Q
    3》driver向slave的num_2寄存器里写入0x03000000.(这是让master开始写), O& o1 ]1 l6 V# w5 W+ D. w
    4》打印4 U* q) I* \. F6 H3 |
    5》driver读slave,验证master写入的值是否正确。+ g( V. [) i3 `8 s; S% G
    1 G5 T" S% C0 e+ F* \

    5 l- `; u; p) @( e4 W2.1.0 模块总连接图
    " j4 ]) ?3 E! p6 \0 e0 z2 S' l6 Q# Z/ \& I

    5 b+ z/ s/ x  x
    1 k% I. B% q0 a# @9 o: b$ }
    % _  n( q0 S. I. e( |2 s1 C0 L; E+ y6 b, ]3 V
    2.1.1 代码修改流程说明:跟单独包含slave的ipcore差不多5 B8 g1 r$ U* R
    1》编写符合wishbone master接口和相应内部逻辑的ip core:mycore
    8 `$ V0 O2 J2 Q6 V3 p1 U 2》d_bus的arbiter增加master接口:master2- ~& G) N$ V' Q7 j4 c2 d0 _
    3》修改master的仲裁优先级$ c0 M1 U3 U& r
    4》例化本ipcore
    4 A6 `3 h2 x0 @4 _8 Z' I$ V 5》编写linux下的driver并测试验证
    / y; R7 l6 E  a- W % Q3 X* ^. d, F0 U! M: {8 J
    2.1.2 code list:mycore.v,mkg_master.v,mkg_slave.v1 J- J7 c& D8 S! ?7 r
    1》mycore.v
    ! y7 ]* ~' m: h- X/ c
    , j8 |! `' K0 Z9 Y9 M( A% e
    & ~8 U7 d( i' h& A& y! G. C
    • /*
    • *
    • * mycore.v
    • *
    • * rill create 2013-04-02
    • *
    • */
    • `include "orpsoc-defines.v"
    • module mycore
    • (
    •         //===slave inteRFace signals
    •         wb_clk,
    •         wb_rst,
    •         wb_dat_i,
    •         wb_adr_i,
    •         wb_sel_i,
    •         wb_cti_i,
    •         wb_bte_i,
    •         wb_we_i,
    •         wb_cyc_i,
    •         wb_stb_i,
    •         wb_dat_o,
    •         wb_ack_o,
    •         wb_err_o,
    •         wb_rty_o,
    •         //===master interface signals
    •         m_adr,
    •         m_din,
    •         m_dout,
    •         m_cyc,
    •         m_stb,
    •         m_sel,
    •         m_we,
    •         m_ack,
    •         m_err,
    •         m_rty,
    •         m_cti,
    •         m_bte
    • );
    • //===slave interface
    • input [31:0]                                      wb_adr_i;
    • input                                                     wb_stb_i;
    • input                                                     wb_cyc_i;
    • input [2:0]                                     wb_cti_i;
    • input [1:0]                                     wb_bte_i;
    • input                                                   wb_clk;
    • input                                                   wb_rst;
    • input [31:0]                                         wb_dat_i;
    • input [3:0]                                         wb_sel_i;
    • input                                                         wb_we_i;
    • output  [31:0]                                          wb_dat_o;
    • output                                                 wb_ack_o;
    • output                                        wb_err_o;
    • output                                                   wb_rty_o;
    • //===master interface
    • input                                m_ack;
    • input                                m_err;
    • input                                m_rty;
    • input        [31:0]                m_din;
    • output        [31:0]                m_adr;
    • output        [31:0]                m_dout;
    • output                                m_cyc;
    • output                                m_stb;
    • output        [3:0]                m_sel;
    • output                                m_we;
    • output        [2:0]                m_cti;
    • output        [1:0]                m_bte;
    • wire [31:0] address;
    • wire [2:0] flag;
    • wire [2:0] test;
    • wire [1:0] done;
    • //===slave external parameters
    • parameter addr_width = 32;
    • parameter mycore_adr = 32'h97;
    • mkg_slave mkg_slave0
    • (
    •         .address (address),
    •         .flag (flag),
    •         .test_status (test),
    •         .test_done (done),
    •         .wb_clk (wb_clk),
    •         .wb_rst (wb_rst),
    •         .wb_dat_i (wb_dat_i),
    •         .wb_adr_i (wb_adr_i),
    •         .wb_sel_i (wb_sel_i),
    •         .wb_cti_i (wb_cti_i),
    •         .wb_bte_i (wb_bte_i),
    •         .wb_we_i (wb_we_i),
    •         .wb_cyc_i (wb_cyc_i),
    •         .wb_stb_i (wb_stb_i),
    •         .wb_dat_o (wb_dat_o),
    •         .wb_ack_o (wb_ack_o),
    •         .wb_err_o (wb_err_o),
    •         .wb_rty_o (wb_rty_o)
    • );
    • mkg_master mkg_master
    • (
    •         .address (address),
    •         .flag (flag),
    •         .test_status (test),
    •         .test_done (done),
    •         .wb_clk (wb_clk),
    •         .wb_rst (wb_rst),
    •         .wb_adr_o (m_adr),
    •         .wb_dat_o (m_dout),
    •         .wb_sel_o (m_sel),
    •         .wb_we_o (m_we),
    •         .wb_cyc_o (m_cyc),
    •         .wb_stb_o (m_stb),
    •         .wb_cti_o (m_cti),
    •         .wb_bte_o (m_bte),
    •         .wb_dat_i (m_din),
    •         .wb_ack_i (m_ack),
    •         .wb_err_i (m_err),
    •         .wb_rty_i (m_rty)
    • );
    • endmodule
    • /************** EOF ****************/  L8 ^3 u# s. v- M
                      
    4 @; K1 Z3 H2 w* [5 d; c
    4 M0 F7 O8 F  H; M: s% w+ \
    % F# T: G" A1 Y" X4 Q: I 2》mkg_master.v
    - k8 f9 A2 L8 p# ^8 L3 \0 v8 O3 K# _$ n4 Q9 f
      l3 t% w. a- a! \! H+ x" R2 ^
    • /*
    • *
    • * mkg_master.v
    • *
    • * rill create 2013-04-02
    • *
    • */
    • module mkg_master
    • (
    •         address,
    •         flag,
    •         test_status,
    •         test_done,
    •         //wishbone interface
    •         wb_clk,
    •         wb_rst,
    •         wb_adr_o,
    •         wb_dat_o,
    •         wb_sel_o,
    •         wb_we_o,
    •         wb_cyc_o,
    •         wb_stb_o,
    •         wb_cti_o,
    •         wb_bte_o,
    •         wb_dat_i,
    •         wb_ack_i,
    •         wb_err_i,
    •         wb_rty_i
    • );
    • input [31:0]                address;
    • input [2:0]                 flag;
    • output reg [2:0] test_status;
    • output reg [1:0] test_done;
    • //wishbone interface
    • input                                wb_clk;
    • input                                wb_rst;
    • input                                wb_ack_i;
    • input                                wb_err_i;
    • input                                wb_rty_i;
    • input        [31:0]                wb_dat_i;
    • output        reg [31:0]                wb_adr_o;
    • output        reg [31:0]                wb_dat_o;
    • output        reg                 wb_cyc_o;
    • output        reg                        wb_stb_o;
    • output        reg [3:0]                wb_sel_o;
    • output        reg                         wb_we_o;
    • output        reg [2:0]                wb_cti_o;
    • output        reg [1:0]                wb_bte_o;
    • //====master status define
    • parameter m_idle = 3'b000;
    • parameter m_wait_ack_read = 3'b001;
    • parameter m_wait_ack_write = 3'b010;
    • reg [2:0] status = m_idle;
    • reg [31:0] ram_data;
    • always @(posedge wb_clk)
    • begin
    •         test_status <= status;
    • end
    • always @(posedge wb_clk)
    • begin
    •         if(wb_rst)
    •                 begin
    •                         wb_cyc_o <= 1'b0;
    •                         wb_stb_o <= 1'b0;
    •                         wb_we_o <= 1'b0;
    •                         wb_adr_o <= 32'h0;
    •                         wb_dat_o <= 32'h0;
    •                         test_done <= 2'b00;
    •                         status <= m_idle;
    •                 end
    •         else
    •                 begin
    •                         case (status)
    •                         m_idle:
    •                                 begin
    •                                         if(3'd1 == flag)//read
    •                                                 begin
    •                                                         wb_cyc_o <= 1'b1;
    •                                                         wb_stb_o <= 1'b1;
    •                                                         wb_adr_o <= address;
    •                                                         wb_we_o <= 1'b0;
    •                                                         status <= m_wait_ack_read;
    •                                                 end
    •                                         else if(3'd2 == flag)//write
    •                                                 begin
    •                                                         wb_adr_o <= address;
    •                                                         wb_dat_o <= 32'h4444_4444;
    •                                                         wb_cyc_o <= 1'b1;
    •                                                         wb_stb_o <= 1'b1;
    •                                                         wb_we_o <= 1'b1;
    •                                                         status <= m_wait_ack_write;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         wb_cyc_o <= 1'b0;
    •                                                         wb_stb_o <= 1'b0;
    •                                                         wb_we_o <= 1'b0;
    •                                                         wb_adr_o <= 32'h0;
    •                                                         wb_dat_o <= 32'h0;
    •                                                         status <= m_idle;
    •                                                 end
    •                                 end
    •                         m_wait_ack_read:
    •                                 begin
    •                                         if(1'b1 != wb_ack_i)
    •                                                 begin
    •                                                         test_done <= 2'b10;
    •                                                         status <= m_wait_ack_read;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         ram_data <= wb_dat_i;
    •                                                         wb_cyc_o <= 1'b0;
    •                                                         wb_stb_o <= 1'b0;
    •                                                         wb_we_o <= 1'b0;
    •                                                         wb_adr_o <= 32'h0;
    •                                                         wb_dat_o <= 32'h0;
    •                                                         test_done <= 2'b01;
    •                                                         status <= m_idle;
    •                                                 end
    •                                 end
    •                         m_wait_ack_write:
    •                                 begin
    •                                         if(1'b1 != wb_ack_i)
    •                                                 begin
    •                                                         test_done <= 2'b10;
    •                                                         status <= m_wait_ack_write;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         wb_cyc_o <= 1'b0;
    •                                                         wb_stb_o <= 1'b0;
    •                                                         wb_we_o <= 1'b0;
    •                                                         wb_adr_o <= 32'h0;
    •                                                         wb_dat_o <= 32'h0;
    •                                                         test_done <= 2'b01;
    •                                                         status <= m_idle;
    •                                                 end
    •                                 end
    •                         default:
    •                                 begin
    •                                         status <= m_idle;
    •                                 end
    •                         endcase
    •                 end
    • end
    • endmodule
    • /************** EOF ****************/9 |& d0 n3 v- K; i. C$ y
                       ' c7 q3 w2 U/ ]8 [+ J" L# _8 D
    " s6 q& ^, N4 U3 F6 R' ^, N

    5 h5 Z1 e9 x. t; ^* j! A' N 3》mkg_slave.v
    6 H% [8 r0 @( q/ U6 m! H7 G8 a$ C; _; ^0 s8 `3 A. W1 g
    8 W3 J$ f% K% y% Y
    • /*
    • *
    • * mkg_slave.v
    • *
    • * rill create 2013-04-02
    • *
    • */
    • `include "orpsoc-defines.v"
    • module mkg_slave
    • (
    •         address,
    •         flag,
    •         test_status,
    •         test_done,
    •         //===slave interface signals
    •         wb_clk,
    •         wb_rst,
    •         wb_dat_i,
    •         wb_adr_i,
    •         wb_sel_i,
    •         wb_cti_i,
    •         wb_bte_i,
    •         wb_we_i,
    •         wb_cyc_i,
    •         wb_stb_i,
    •         wb_dat_o,
    •         wb_ack_o,
    •         wb_err_o,
    •         wb_rty_o
    • );
    • output reg [31:0] address;
    • output reg [2:0] flag;
    • input [2:0] test_status;
    • input [1:0] test_done;
    • //===slave interface
    • input [addr_width-1:0]              wb_adr_i;
    • input                                                     wb_stb_i;
    • input                                                     wb_cyc_i;
    • input [2:0]                                     wb_cti_i;
    • input [1:0]                                     wb_bte_i;
    • input                                                   wb_clk;
    • input                                                   wb_rst;
    • input [31:0]                                         wb_dat_i;
    • input [3:0]                                         wb_sel_i;
    • input                                                         wb_we_i;
    • output reg [31:0]                                  wb_dat_o;
    • output reg                                                wb_ack_o;
    • output                                        wb_err_o;
    • output                                                   wb_rty_o;
    • //===slave external parameters
    • parameter addr_width = 32;
    • parameter mycore_adr = 8'h97;
    • //===slave local regs
    • reg [addr_width-1:0] num_1;//addr index:0x0
    • reg [addr_width-1:0] num_2;//addr index:0x4
    • reg [addr_width-1:0] sum;//addr index:0x8
    • reg [31:0] master_status;//test reg 0xc
    • reg [31:0] write_address;//0x10
    • //====slave status define
    • parameter s_idle = 3'b000;
    • parameter s_read = 3'b001;
    • parameter s_write = 3'b010;
    • reg [2:0] state = s_idle;
    • reg [1:0] done_flag = 2'b0;
    • reg [2:0] m_status;
    • reg [1:0] m_done;
    • //===mycore process start--->
    • assign wb_err_o=0;
    • assign wb_rty_o=0;
    • //===slave process================
    • always @(posedge wb_clk)
    • begin
    •         m_status <=  test_status;
    •         m_done <= test_done;
    • end
    • always @(posedge wb_clk)
    • begin
    •         master_status <= {27'b1001_1010_1011_1100_1101_1110_1111_0000,m_status,m_done};
    • end
    • always @(*)
    • begin
    •         sum = num_1 + num_2;
    • end
    • always @(posedge wb_clk)
    • begin
    •         if(wb_rst)
    •                 begin
    •                         address <= 32'h0;
    •                         flag <= 3'b0;
    •                         done_flag <= 2'b0;
    •                 end
    •         else
    •                 begin
    •                         if(2'b10 == done_flag)
    •                                 begin
    •                                         address <= 32'h0;
    •                                         flag <= 3'b0;
    •                                 end
    •                         else if(2'b01 == done_flag)
    •                                 begin
    •                                         address <= write_address;
    •                                         flag <= 3'b010;
    •                                         done_flag <= 2'b10;
    •                                 end
    •                         else
    •                                 begin
    •                                         if(3 == num_2)
    •                                                 begin
    •                                                         address <= write_address;
    •                                                         flag <= 3'b010;
    •                                                         done_flag <= 2'b01;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         address <= 32'h0;
    •                                                         flag <= 3'b0;
    •                                                         done_flag <= 2'b00;
    •                                                 end
    •                                 end
    •                 end
    • end
    • always @(posedge wb_clk)
    • begin
    •         if(wb_rst)
    •                 begin
    •                         state <= s_idle;
    •                 end
    •         else
    •                 begin
    •                         case(state)
    •                         s_idle:
    •                                 begin
    •                                         wb_dat_o <= 1'b0;
    •                                         wb_ack_o <= 1'b0;
    •                                         if(wb_stb_i && wb_cyc_i && wb_we_i)
    •                                                 begin
    •                                                         state <= s_write;
    •                                                 end
    •                                         else if(wb_stb_i && wb_cyc_i && !wb_we_i)
    •                                                 begin
    •                                                         state <= s_read;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         state <= s_idle;
    •                                                 end
    •                                 end
    •                         s_write:
    •                                 begin
    •                                         if(wb_adr_i == {mycore_adr,24'h000000})
    •                                                 begin
    •                                                         num_1 <= wb_dat_i;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i == {mycore_adr,24'h000004})
    •                                                 begin
    •                                                         num_2 <= wb_dat_i;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i == {mycore_adr,24'h000010})
    •                                                 begin
    •                                                         write_address <= wb_dat_i;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         //wb_ack_o=1'b0;
    •                                                 end
    •                                         state <= s_idle;
    •                                 end
    •                         s_read:
    •                                 begin
    •                                         if(wb_adr_i=={mycore_adr,24'h000000})
    •                                                 begin
    •                                                         wb_dat_o <= num_1;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000004})
    •                                                 begin
    •                                                         wb_dat_o <= num_2;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000008})
    •                                                 begin
    •                                                         wb_dat_o <= sum;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h00000c})
    •                                                 begin
    •                                                         wb_dat_o <= master_status;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000010})
    •                                                 begin
    •                                                         wb_dat_o <= write_address;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         wb_dat_o = 0;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         state <= s_idle;
    •                                 end
    •                         default:
    •                                 begin
    •                                         state <= s_idle;
    •                                 end
    •                         endcase
    •                 end
    • end
    • endmodule
    • /************** EOF ****************/' e' q( E: v! S0 Z; a# B- E
                                 
    % q3 f& ~0 o2 t! K) T& D
    9 f4 R3 V* w" p$ t/ A
    . z: D0 S4 r1 H, j4 ~& n 4》d_bus 优先级代码
      L2 [) U- D( b. C4 B6 i7 M# j) v- r$ O
    * E( B9 ?$ o; J% m& R& S

      c9 ^: m' ~7 e. B% C8 W+ i: j
    + B5 h& }+ ^4 J& ?# E + f3 b( t+ J7 B4 p7 k
    5》linux driver; w4 o0 K8 }% N' j7 s  O
    6 U1 f- h9 h: h- c. E, a! ~
    ip_mkg.c:
    8 ]7 }6 _: q' b% Q, U7 X+ A
    ! ?$ f9 J3 z6 U5 G' C6 M$ {" A6 g$ W
    • /*
    • *
    • * rill mkg driver
    • *
    • */
    • #include <linux/vmalloc.h>
    • #include <linux/slab.h>
    • #include <linux/kernel.h>
    • #include <linux/module.h>
    • #include <linux/fs.h>
    • #include <asm/uaccess.h> /* get_user and put_user */
    • //#include <linux/clk.h>
    • //#include <linux/ioport.h>
    • #include <asm/io.h> /*ioremap*/
    • #include <linux/platform_device.h> /*cleanup_module*/
    • #include <asm-generic/io.h>
    • #include "ip_mkg.h"
    • void        __iomem         *g_mkg_mem_base = NULL;
    • static int device_open(struct inode *inode, struct file *file)
    • {
    •         g_mkg_mem_base = ioremap(MKG_MEM_BASE,MKG_MEM_LEN);
    •         if(NULL == g_mkg_mem_base)
    •         {
    •                 printk(KERN_ERR "mkg open ioremap error!\n");
    •                 return -1;
    •         }
    •         else
    •         {
    •                 printk("mkg ioremap addr:%d!\n",(int)g_mkg_mem_base);
    •         }
    •         return 0;
    • }
    • static int device_release(struct inode *inode, struct file *file)
    • {
    •         return 0;
    • }
    • static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t *offset)
    • {
    •         /*int ret_val = 0;
    •         char * data = NULL;
    •         data = (char*)kmalloc(4, GFP_KERNEL);
    •         if((ret_val = copy_from_user(new_regs, (struct reg_data*)ioctl_param, sizeof(struct reg_data))) != 0)
    •         ioread32(g_mkg_mem_base+length);
    •         printk("============read:%d\n",);*/
    •         return 1;
    • }
    • static ssize_t device_write(struct file *filp, const char *buffer, size_t count, loff_t *offset)
    • {
    •         //iowrite32(2,g_mkg_mem_base);
    •         return 1;
    • }
    • long device_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param)
    • {
    • #if 0
    •    int ret_val = 0;
    •    unsigned int ret = 0;
    •    struct reg_data *new_regs;
    •    printk("ioctl======\n");
    •    switch(ioctl_num)
    •    {
    •       case IOCTL_REG_SET:
    •           {
    •                  new_regs = (struct reg_data*)kmalloc(sizeof(struct reg_data), GFP_KERNEL);
    •                  if((ret_val = copy_from_user(new_regs, (struct reg_data*)ioctl_param, sizeof(struct reg_data))) != 0)
    •                          {
    •                             kfree(new_regs);
    •                             printk(KERN_ERR " error copy line_datafrom user.\n");
    •                                 return -1;
    •                          }
    •                         //iowrite16(new_regs->value,g_mkg_mem_base+new_regs->addr);
    •                  kfree(new_regs);
    •      }
    •          break;
    •         case IOCTL_REG_GET:
    •         {
    •          new_regs = (struct reg_data*)kmalloc(sizeof(struct reg_data), GFP_KERNEL);
    •          if((ret_val = copy_from_user(new_regs, (struct reg_data*)ioctl_param, sizeof(struct reg_data))) != 0)
    •                  {
    •                     kfree(new_regs);
    •                     printk(KERN_ERR " error copy line_datafrom user.\n");
    •                         return -1;
    •                  }
    •                 //ret = ioread16(g_mkg_mem_base+new_regs->addr);
    •                  kfree(new_regs);
    •                 return ret;
    •         }
    •         break;
    •    }
    • #endif
    •   return -1;
    • }
    • struct file_operations our_file_ops = {
    •   .unlocked_ioctl = device_ioctl,
    •   .read = device_read,
    •   .write = device_write,
    •   .open = device_open,
    •   .release = device_release,
    •   .owner = THIS_MODULE,
    • };
    • void test(void)
    • {
    •         int loop = 0;
    •         unsigned int phy_addr1 = 0;
    •         unsigned int phy_addr2 = 0;
    •         int * virtual_addr1 = NULL;
    •         int * virtual_addr2 = NULL;
    •         printk("<----ip_mkg test start---->\n");
    •         //=====ip_mkg reg test========================================================
    •         #if 1
    •         printk("reg test start==\n");
    •         iowrite32(0x11223344,g_mkg_mem_base);
    •         iowrite32(0x00000097,g_mkg_mem_base+0x10);
    •         iowrite32(0x03000000,g_mkg_mem_base+4);
    •         printk("reg test start1==\n");
    •         printk("reg test start2==\n");
    •         printk("reg test start3==\n");
    •         for(loop=0;loop<7;loop++)
    •         printk("====reg addr==0x%x==reg value:0x%x==\n",loop*4,ioread32(g_mkg_mem_base+4*loop));
    •         #endif
    •         //=========================================================================
    •         //============mem write test
    •         #if 0
    •         printk("mem write test start==\n");
    •         iowrite32(0x97000004,g_mkg_mem_base);
    •         iowrite32(0x2,g_mkg_mem_base+0xc);
    •         printk("======reg:c value:0x%x==\n",ioread32(g_mkg_mem_base+0xc));
    •         printk("======reg:14 value:0x%x==\n",ioread32(g_mkg_mem_base+0x14));
    •         printk("======reg:18 value:0x%x==\n",ioread32(g_mkg_mem_base+0x18));
    •         printk("======reg:1c value:0x%x==\n",ioread32(g_mkg_mem_base+0x1c));
    •         printk("======reg:20 value:0x%x==\n",ioread32(g_mkg_mem_base+0x20));
    •         printk("======reg:24 value:0x%x==\n",ioread32(g_mkg_mem_base+0x24));
    •         for(loop = 0;loop<10;loop++)
    •         printk("wait=write=\n");
    •         printk("wait=write=\n");
    •         iowrite32(0x1,g_mkg_mem_base+0xc);
    •         printk("======reg:c value:0x%x==\n",ioread32(g_mkg_mem_base+0xc));
    •         for(loop = 0;loop<10;loop++)
    •         printk("wait=read=\n");
    •         printk("wait=read=\n");
    •         printk("======reg:10 value:0x%x==\n",ioread32(g_mkg_mem_base+0x10));
    •         printk("======reg:c value:0x%x==\n\n",ioread32(g_mkg_mem_base+0xc));
    •         #endif
    •         //============mem read test
    •         #if 0
    •         printk("mem read test start==\n");
    •         virtual_addr1 = (int *)kmalloc(sizeof(int), GFP_KERNEL);
    •         virtual_addr2 = (int *)kmalloc(sizeof(int), GFP_KERNEL);
    •         *virtual_addr1 = 0x55;
    •         *virtual_addr2 = 0x66;
    •         phy_addr1 = virt_to_phys(virtual_addr1);
    •         phy_addr2 = virt_to_phys(virtual_addr2);
    •         printk("virtual addr1:0x%x==phy addr1:0x%x==\n",(int)virtual_addr1,phy_addr1);
    •         printk("virtual addr2:0x%x==phy addr2:0x%x==\n",(int)virtual_addr2,phy_addr2);
    •         iowrite32(phy_addr1,g_mkg_mem_base);
    •         iowrite32(0x1,g_mkg_mem_base+0xc);
    •         printk("wait=read=\n");
    •         printk("======reg:0 value:0x%x==\n",ioread32(g_mkg_mem_base));
    •         printk("======reg:c value:0x%x==\n",ioread32(g_mkg_mem_base+0xc));
    •         printk("====phy addr1==0x%x==ram value:0x%x==\n",phy_addr1,ioread32(g_mkg_mem_base+0x10));
    •         printk("======reg:c value:0x%x==\n\n",ioread32(g_mkg_mem_base+0xc));
    •         iowrite32(phy_addr2,g_mkg_mem_base);
    •         iowrite32(0x1,g_mkg_mem_base+0xc);
    •         printk("wait=2=\n");
    •         printk("======reg:0 value:0x%x==\n",ioread32(g_mkg_mem_base));
    •         printk("======reg:c value:0x%x==\n",ioread32(g_mkg_mem_base+0xc));
    •         printk("====phy addr2==0x%x==ram value:0x%x==\n",phy_addr2,ioread32(g_mkg_mem_base+0x10));
    •         printk("======reg:c value:0x%x==\n\n",ioread32(g_mkg_mem_base+0xc));
    •         kfree(virtual_addr1);
    •         kfree(virtual_addr2);
    •         #endif
    •         printk("<----ip_mkg test end---->\n");
    • }
    • int init_module()
    • {
    •         int ret_val;
    •         int ret;
    •         void __iomem *ret_from_request;
    •         //=== Allocate character device
    •         ret_val = register_chrdev(MAJOR_NUM, DEVICE_NAME, &our_file_ops);
    •         if (ret_val < 0)
    •         {
    •                 printk(KERN_ALERT " device %s failed(%d)\n", DEVICE_NAME, ret_val);
    •                 return ret_val;
    •         }
    •         ret = check_mem_region(MKG_MEM_BASE, MKG_MEM_LEN);
    •         if (ret < 0)
    •         {
    •                 printk(KERN_ERR "mkg check_mem_region bussy error!\n");
    •                 return -1;
    •         }
    •         ret_from_request = request_mem_region(MKG_MEM_BASE, MKG_MEM_LEN, "ip_mkg");
    •         //===ioremap mkg registers
    •         g_mkg_mem_base = ioremap(MKG_MEM_BASE,MKG_MEM_LEN);
    •         if(NULL == g_mkg_mem_base)
    •         {
    •                 printk(KERN_ERR "mkg ioremap error!\n");
    •                 return -1;
    •         }
    •         else
    •         {
    •                 ;//printk("mkg ioremap addr:%d!\n",(unsigned int)g_mkg_mem_base);
    •         }
    •         printk("mkg module init done!\n");
    •         test();
    •         return 0;
    • }
    • void cleanup_module()
    • {
    •         release_mem_region(MKG_MEM_BASE, MKG_MEM_LEN);
    •         unregister_chrdev(MAJOR_NUM, DEVICE_NAME);
    • }
    • MODULE_LICENSE("GPL");
    • MODULE_AUTHOR("Rill zhen:rill_zhen@126.com");
    • 1 \8 G( u. y0 `$ R
                                             3 q' h8 V6 S, v/ b
    8 L' L# l  p  n5 E

    # B0 m1 `1 L2 Y3 U3 L/ o# ?( F1 B+ Z* n+ i3 Y
    ip_mkg.h:( K$ H& D, Z) ]6 E6 Y

    ' T; [9 K4 Q; c  v; D4 c5 |$ ^! F" x$ {/ ^2 [2 Z7 a3 F
    • #ifndef __IP_MKG_H__
    • #define __IP_MKG_H__
    • #define MAJOR_NUM        102
    • #define DEVICE_NAME        "ip_mkg"
    • #define MKG_MEM_BASE 0x97000000
    • #define MKG_MEM_LEN        32
    • #define IOCTL_REG_SET 0
    • #define IOCTL_REG_GET 1
    • struct reg_data
    • {
    •         unsigned short addr;
    •         int value;
    • };
    • #endif
      . @! G/ w" ]2 Q5 }* I9 k
          ; b& B6 U# V* z

    + Z$ t3 H8 x, Z2 {9 z) p 6》makefile7 e1 b: ~  j3 C3 ?) v
    1 I! |4 t/ c( S" P# }

    % v) l/ ~* `+ h5 v( d6 D
    • # To build modules outside of the kernel tree, we run "make"
    • # in the kernel source tree; the Makefile these then includes this
    • # Makefile once again.
    • # This conditional selects whether we are being included from the
    • # kernel Makefile or not.
    • ifeq ($(KERNELRELEASE),)
    •     # Assume the source tree is where the running kernel was built
    •     # You should set KERNELDIR in the environment if it's elsewhere
    •     KERNELDIR ?= /home/openrisc/soc-design/linux
    •     # The current directory is passed to sub-makes as argument
    •     PWD := $(shell pwd)
    • modules:
    •         make -C $(KERNELDIR) M=$(PWD) modules ARCH=openrisc CROSS_COMPILE=or32-linux-
    • modules_install:
    •         make -C $(KERNELDIR) M=$(PWD) modules_install ARCH=openrisc CROSS_COMPILE=or32-linux-
    • clean:
    •         rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
    • .PHONY: modules modules_install clean
    • else
    •     # called from kernel build system: just declare what our modules are
    •     obj-m := ip_mkg.o
    • endif
      # `. v* G+ D" Q* N
          
    , C( \: v, X! Z- a" ~! W
    $ U6 u/ B: X3 b/ _
    ( N7 O0 o* Q; M* q2.1.3 模块连接图:
    + {4 z2 `  m# L5 k) _
    8 S0 x) y9 M/ S8 a/ f8 u) h- j
    3 i; r3 R1 I  ]" u1 [& J$ ]% ?( S) a5 `
    # S% ~- y* |: K" B1 s! F( K
    2.1.4 验证结果:$ ~) a# ?. K) F9 i. u0 N
    . B2 y! Y# D' J( x

    - |2 c$ ~* p# H: Q
    $ V* Z- y7 x; ]$ j% X* m
    . g! q, l6 s: ~8 Z6 e6 a3 \' j9 v# {: v
    2.2 master读功能
    / i' {! ?: I( A9 }% c2 Z, f. f 1》driver向slave的num_1寄存器里写入0x112233443 g5 [9 f5 C; y  G0 e* i
    2》driver向slave的write_address寄存器里写入0x00000097.(这是让master 读的地址,其实就是num_1)9 q+ |- e$ f# W0 K
    3》driver向slave的num_2寄存器里写入0x03000000.(这是让master开始读)9 o1 W$ H0 n# L& [3 A$ x
    4》打印  a# |# k' w# T( R9 [
    5》driver读slave,验证master读入的值是否正确。
    1 W4 G: k0 F/ g7 w. t5 O- e* A# g5 L: d- i4 |* T4 T

    6 ]: s1 e" V0 K, `$ X2.2.1 code list:mycore.v,mkg_master.v,mkg_slave.v
    7 k7 I/ I( o2 R" t  e 1》mycore.v. B) ?5 r) [+ }& o4 m6 T
    0 }, d( ~/ z; [6 U. W9 m( @

    , T& Z) S9 o6 ]' f' T
    • /*
    • *
    • * mycore.v
    • *
    • * rill create 2013-04-02
    • *
    • */
    • `include "orpsoc-defines.v"
    • module mycore
    • (
    •         //===slave interface signals
    •         wb_clk,
    •         wb_rst,
    •         wb_dat_i,
    •         wb_adr_i,
    •         wb_sel_i,
    •         wb_cti_i,
    •         wb_bte_i,
    •         wb_we_i,
    •         wb_cyc_i,
    •         wb_stb_i,
    •         wb_dat_o,
    •         wb_ack_o,
    •         wb_err_o,
    •         wb_rty_o,
    •         //===master interface signals
    •         m_adr,
    •         m_din,
    •         m_dout,
    •         m_cyc,
    •         m_stb,
    •         m_sel,
    •         m_we,
    •         m_ack,
    •         m_err,
    •         m_rty,
    •         m_cti,
    •         m_bte
    • );
    • //===slave interface
    • input [31:0]                                      wb_adr_i;
    • input                                                     wb_stb_i;
    • input                                                     wb_cyc_i;
    • input [2:0]                                     wb_cti_i;
    • input [1:0]                                     wb_bte_i;
    • input                                                   wb_clk;
    • input                                                   wb_rst;
    • input [31:0]                                         wb_dat_i;
    • input [3:0]                                         wb_sel_i;
    • input                                                         wb_we_i;
    • output  [31:0]                                          wb_dat_o;
    • output                                                 wb_ack_o;
    • output                                        wb_err_o;
    • output                                                   wb_rty_o;
    • //===master interface
    • input                                m_ack;
    • input                                m_err;
    • input                                m_rty;
    • input        [31:0]                m_din;
    • output        [31:0]                m_adr;
    • output        [31:0]                m_dout;
    • output                                m_cyc;
    • output                                m_stb;
    • output        [3:0]                m_sel;
    • output                                m_we;
    • output        [2:0]                m_cti;
    • output        [1:0]                m_bte;
    • wire [31:0] address;
    • wire [2:0] flag;
    • wire [2:0] test;
    • wire [1:0] done;
    • wire [31:0] value;
    • //===slave external parameters
    • parameter addr_width = 32;
    • parameter mycore_adr = 32'h97;
    • mkg_slave mkg_slave0
    • (
    •         .address (address),
    •         .flag (flag),
    •         .test_status (test),
    •         .test_done (done),
    •         .ram_data (value),
    •         .wb_clk (wb_clk),
    •         .wb_rst (wb_rst),
    •         .wb_dat_i (wb_dat_i),
    •         .wb_adr_i (wb_adr_i),
    •         .wb_sel_i (wb_sel_i),
    •         .wb_cti_i (wb_cti_i),
    •         .wb_bte_i (wb_bte_i),
    •         .wb_we_i (wb_we_i),
    •         .wb_cyc_i (wb_cyc_i),
    •         .wb_stb_i (wb_stb_i),
    •         .wb_dat_o (wb_dat_o),
    •         .wb_ack_o (wb_ack_o),
    •         .wb_err_o (wb_err_o),
    •         .wb_rty_o (wb_rty_o)
    • );
    • mkg_master mkg_master
    • (
    •         .address (address),
    •         .flag (flag),
    •         .test_status (test),
    •         .test_done (done),
    •         .ram_data (value),
    •         .wb_clk (wb_clk),
    •         .wb_rst (wb_rst),
    •         .wb_adr_o (m_adr),
    •         .wb_dat_o (m_dout),
    •         .wb_sel_o (m_sel),
    •         .wb_we_o (m_we),
    •         .wb_cyc_o (m_cyc),
    •         .wb_stb_o (m_stb),
    •         .wb_cti_o (m_cti),
    •         .wb_bte_o (m_bte),
    •         .wb_dat_i (m_din),
    •         .wb_ack_i (m_ack),
    •         .wb_err_i (m_err),
    •         .wb_rty_i (m_rty)
    • );
    • endmodule
    • /************** EOF ****************/# D+ q$ a  D7 a
                      + B8 C) V+ P! ^/ c" ?" x
    9 f& g5 f$ A* Z4 h1 w

    0 ?5 ^2 U. m8 \' c 2》mkg_master.v6 A  g& A3 P$ O) ~9 o

    $ D( c# k& \$ B- r& r. `. b$ |& N: J6 M2 s* _4 O8 J% A0 H7 X
    • /*
    • *
    • * mkg_master.v
    • *
    • * rill create 2013-04-02
    • *
    • */
    • module mkg_master
    • (
    •         address,
    •         flag,
    •         test_status,
    •         test_done,
    •         ram_data,
    •         //wishbone interface
    •         wb_clk,
    •         wb_rst,
    •         wb_adr_o,
    •         wb_dat_o,
    •         wb_sel_o,
    •         wb_we_o,
    •         wb_cyc_o,
    •         wb_stb_o,
    •         wb_cti_o,
    •         wb_bte_o,
    •         wb_dat_i,
    •         wb_ack_i,
    •         wb_err_i,
    •         wb_rty_i
    • );
    • input [31:0]                address;
    • input [2:0]                 flag;
    • output reg [2:0] test_status;
    • output reg [1:0] test_done;
    • output reg [31:0] ram_data;
    • //wishbone interface
    • input                                wb_clk;
    • input                                wb_rst;
    • input                                wb_ack_i;
    • input                                wb_err_i;
    • input                                wb_rty_i;
    • input        [31:0]                wb_dat_i;
    • output        reg [31:0]                wb_adr_o;
    • output        reg [31:0]                wb_dat_o;
    • output        reg                 wb_cyc_o;
    • output        reg                        wb_stb_o;
    • output        reg [3:0]                wb_sel_o;
    • output        reg                         wb_we_o;
    • output        reg [2:0]                wb_cti_o;
    • output        reg [1:0]                wb_bte_o;
    • //====master status define
    • parameter m_idle = 3'b000;
    • parameter m_wait_ack_read = 3'b001;
    • parameter m_wait_ack_write = 3'b010;
    • reg [2:0] status = m_idle;
    • always @(posedge wb_clk)
    • begin
    •         test_status <= status;
    • end
    • always @(posedge wb_clk)
    • begin
    •         if(wb_rst)
    •                 begin
    •                         wb_cyc_o <= 1'b0;
    •                         wb_stb_o <= 1'b0;
    •                         wb_we_o <= 1'b0;
    •                         wb_adr_o <= 32'h0;
    •                         wb_dat_o <= 32'h0;
    •                         test_done <= 2'b00;
    •                         status <= m_idle;
    •                 end
    •         else
    •                 begin
    •                         case (status)
    •                         m_idle:
    •                                 begin
    •                                         if(3'd1 == flag)//read
    •                                                 begin
    •                                                         wb_cyc_o <= 1'b1;
    •                                                         wb_stb_o <= 1'b1;
    •                                                         wb_adr_o <= address;
    •                                                         wb_we_o <= 1'b0;
    •                                                         status <= m_wait_ack_read;
    •                                                 end
    •                                         else if(3'd2 == flag)//write
    •                                                 begin
    •                                                         wb_adr_o <= address;
    •                                                         wb_dat_o <= 32'h4444_4444;
    •                                                         wb_cyc_o <= 1'b1;
    •                                                         wb_stb_o <= 1'b1;
    •                                                         wb_we_o <= 1'b1;
    •                                                         status <= m_wait_ack_write;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         wb_cyc_o <= 1'b0;
    •                                                         wb_stb_o <= 1'b0;
    •                                                         wb_we_o <= 1'b0;
    •                                                         wb_adr_o <= 32'h0;
    •                                                         wb_dat_o <= 32'h0;
    •                                                         status <= m_idle;
    •                                                 end
    •                                 end
    •                         m_wait_ack_read:
    •                                 begin
    •                                         if(1'b1 != wb_ack_i)
    •                                                 begin
    •                                                         test_done <= 2'b10;
    •                                                         status <= m_wait_ack_read;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         ram_data <= wb_dat_i;
    •                                                         wb_cyc_o <= 1'b0;
    •                                                         wb_stb_o <= 1'b0;
    •                                                         wb_we_o <= 1'b0;
    •                                                         wb_adr_o <= 32'h0;
    •                                                         wb_dat_o <= 32'h0;
    •                                                         test_done <= 2'b01;
    •                                                         status <= m_idle;
    •                                                 end
    •                                 end
    •                         m_wait_ack_write:
    •                                 begin
    •                                         if(1'b1 != wb_ack_i)
    •                                                 begin
    •                                                         test_done <= 2'b10;
    •                                                         status <= m_wait_ack_write;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         wb_cyc_o <= 1'b0;
    •                                                         wb_stb_o <= 1'b0;
    •                                                         wb_we_o <= 1'b0;
    •                                                         wb_adr_o <= 32'h0;
    •                                                         wb_dat_o <= 32'h0;
    •                                                         test_done <= 2'b01;
    •                                                         status <= m_idle;
    •                                                 end
    •                                 end
    •                         default:
    •                                 begin
    •                                         status <= m_idle;
    •                                 end
    •                         endcase
    •                 end
    • end
    • endmodule
    • /************** EOF ****************/2 m* r( \8 P- D9 S9 R! X  `
                        
    , m/ F! |6 P+ U- W) p! Z" W
    , F% a: a! Z! U8 B( x. ~& U0 y, J) Y
    3》mkg_slave.v) @' P2 A% E. {6 T
    0 f' ]. u' c2 o2 U& ~

    ' e* z( V7 e5 f) ~5 F/ J3 v
    • /*
    • *
    • * mkg_slave.v
    • *
    • * rill create 2013-04-02
    • *
    • */
    • `include "orpsoc-defines.v"
    • module mkg_slave
    • (
    •         address,
    •         flag,
    •         test_status,
    •         test_done,
    •         ram_data,
    •         //===slave interface signals
    •         wb_clk,
    •         wb_rst,
    •         wb_dat_i,
    •         wb_adr_i,
    •         wb_sel_i,
    •         wb_cti_i,
    •         wb_bte_i,
    •         wb_we_i,
    •         wb_cyc_i,
    •         wb_stb_i,
    •         wb_dat_o,
    •         wb_ack_o,
    •         wb_err_o,
    •         wb_rty_o
    • );
    • output reg [31:0] address;
    • output reg [2:0] flag;
    • input [2:0] test_status;
    • input [1:0] test_done;
    • input [31:0] ram_data;
    • //===slave interface
    • input [addr_width-1:0]              wb_adr_i;
    • input                                                     wb_stb_i;
    • input                                                     wb_cyc_i;
    • input [2:0]                                     wb_cti_i;
    • input [1:0]                                     wb_bte_i;
    • input                                                   wb_clk;
    • input                                                   wb_rst;
    • input [31:0]                                         wb_dat_i;
    • input [3:0]                                         wb_sel_i;
    • input                                                         wb_we_i;
    • output reg [31:0]                                  wb_dat_o;
    • output reg                                                wb_ack_o;
    • output                                        wb_err_o;
    • output                                                   wb_rty_o;
    • //===slave external parameters
    • parameter addr_width = 32;
    • parameter mycore_adr = 8'h97;
    • //===slave local regs
    • reg [addr_width-1:0] num_1;//addr index:0x0
    • reg [addr_width-1:0] num_2;//addr index:0x4
    • reg [addr_width-1:0] sum;//addr index:0x8
    • reg [31:0] master_status;//test reg 0xc
    • reg [31:0] write_address;//0x10
    • reg [31:0] read_value;//0x14
    • //====slave status define
    • parameter s_idle = 3'b000;
    • parameter s_read = 3'b001;
    • parameter s_write = 3'b010;
    • reg [2:0] state = s_idle;
    • reg [1:0] done_flag = 2'b0;
    • reg [2:0] m_status;
    • reg [1:0] m_done;
    • //===mycore process start--->
    • assign wb_err_o=0;
    • assign wb_rty_o=0;
    • //===slave process================
    • always @(posedge wb_clk)
    • begin
    •         m_status <=  test_status;
    •         m_done <= test_done;
    •         read_value <= ram_data;
    • end
    • always @(posedge wb_clk)
    • begin
    •         master_status <= {27'b1001_1010_1011_1100_1101_1110_1111_0000,m_status,m_done};
    • end
    • always @(*)
    • begin
    •         sum = num_1 + num_2;
    • end
    • always @(posedge wb_clk)
    • begin
    •         if(wb_rst)
    •                 begin
    •                         address <= 32'h0;
    •                         flag <= 3'b0;
    •                         done_flag <= 2'b0;
    •                 end
    •         else
    •                 begin
    •                         if(2'b10 == done_flag)
    •                                 begin
    •                                         address <= 32'h0;
    •                                         flag <= 3'b0;
    •                                 end
    •                         else if(2'b01 == done_flag)
    •                                 begin
    •                                         address <= write_address;
    •                                         flag <= 3'b001;
    •                                         done_flag <= 2'b10;
    •                                 end
    •                         else
    •                                 begin
    •                                         if(3 == num_2)
    •                                                 begin
    •                                                         address <= write_address;
    •                                                         flag <= 3'b001;
    •                                                         done_flag <= 2'b01;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         address <= 32'h0;
    •                                                         flag <= 3'b0;
    •                                                         done_flag <= 2'b00;
    •                                                 end
    •                                 end
    •                 end
    • end
    • always @(posedge wb_clk)
    • begin
    •         if(wb_rst)
    •                 begin
    •                         state <= s_idle;
    •                 end
    •         else
    •                 begin
    •                         case(state)
    •                         s_idle:
    •                                 begin
    •                                         wb_dat_o <= 1'b0;
    •                                         wb_ack_o <= 1'b0;
    •                                         if(wb_stb_i && wb_cyc_i && wb_we_i)
    •                                                 begin
    •                                                         state <= s_write;
    •                                                 end
    •                                         else if(wb_stb_i && wb_cyc_i && !wb_we_i)
    •                                                 begin
    •                                                         state <= s_read;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         state <= s_idle;
    •                                                 end
    •                                 end
    •                         s_write:
    •                                 begin
    •                                         if(wb_adr_i == {mycore_adr,24'h000000})
    •                                                 begin
    •                                                         num_1 <= wb_dat_i;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i == {mycore_adr,24'h000004})
    •                                                 begin
    •                                                         num_2 <= wb_dat_i;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i == {mycore_adr,24'h000010})
    •                                                 begin
    •                                                         write_address <= wb_dat_i;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         //wb_ack_o=1'b0;
    •                                                 end
    •                                         state <= s_idle;
    •                                 end
    •                         s_read:
    •                                 begin
    •                                         if(wb_adr_i=={mycore_adr,24'h000000})
    •                                                 begin
    •                                                         wb_dat_o <= num_1;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000004})
    •                                                 begin
    •                                                         wb_dat_o <= num_2;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000008})
    •                                                 begin
    •                                                         wb_dat_o <= sum;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h00000c})
    •                                                 begin
    •                                                         wb_dat_o <= master_status;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000010})
    •                                                 begin
    •                                                         wb_dat_o <= write_address;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else if(wb_adr_i=={mycore_adr,24'h000014})
    •                                                 begin
    •                                                         wb_dat_o <= read_value;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         else
    •                                                 begin
    •                                                         wb_dat_o = 0;
    •                                                         wb_ack_o <= 1'b1;
    •                                                 end
    •                                         state <= s_idle;
    •                                 end
    •                         default:
    •                                 begin
    •                                         state <= s_idle;
    •                                 end
    •                         endcase
    •                 end
    • end
    • endmodule
    • /************** EOF ****************/' e6 ]' |( z1 l0 j% y
                                7 J# Z- W$ L5 ^7 `, x- ?4 [9 o
    ! e) K( Y! ]) E# i, g
    0 O& |& F9 d9 v* [* p# {, x
    4》d_bus 优先级代码:arbiter_dbus.v(与写相同)
    - j# c* K' N" g9 i3 o  r/ ] / v# k& T: f! y* T
    5》linux driver(与写相同)" n* j1 X, G! H
    & c3 F7 _' S) m5 ~3 r6 ?, l" n
    6》makefile(与写相同)
    ( J8 K1 u7 c* K2 l' k; x4 b
    . r2 l5 ^' e1 g$ G0 u# N2.2.3 模块连接图:
    * D% w9 v2 ?$ Y" H% [
    5 i; M. \4 n2 y3 ~  R5 K6 A4 m
    . O9 ^. A" c; I+ k* f0 ^* r- O$ m- J- o) Z- L. N# l8 U
    $ o" \( Y, U6 v" D) u
    2.2.4 验证结果:- @7 _3 V9 O  D9 p. J) |2 q

    * _3 h4 Z/ v  G8 e) q. Z ! M4 B# Y8 y- H& a5 @

    # W; f% M2 }1 y# J
    5 P) U7 [. D% O$ d' \
    0 c. }' w9 y- L
    & Y' ~9 W* V. p+ _2.3 小结
    . E. `/ T$ J# _! s写driver时要注意大小端的问题。
    * n* h& u7 \# W% `比如想写0x97000000(master要访问的地址),在driver里面要写0x00000097。
    ! J9 _, V4 T" r

    该用户从未签到

    2#
    发表于 2021-9-30 16:34 | 只看该作者
    添加自己的master (DMA-like) ipcore到ORSoC并测试

    该用户从未签到

    3#
    发表于 2021-9-30 16:35 | 只看该作者
    添加自己的master (DMA-like) ipcore到ORSoC并测试

    该用户从未签到

    4#
    发表于 2021-9-30 17:49 | 只看该作者
    添加自己的master (DMA-like) ipcore到ORSoC并测试
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 03:07 , Processed in 0.234375 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表