ZYNQ_project:IP_ram_pll_test

例化MMCM ip核,产生100Mhz,100Mhz并相位偏移180,50Mhz,25Mhz的时钟信号。

例化单口ram,并编写读写控制器,实现32个数据的写入与读出。

模块框图:

代码:

module ip_top(
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,

    output      wire    [7:0]   douta       ,
    output      wire            clk_100Mhz  ,
    output      wire            clk_100Mhz_180Phase  ,
    output      wire            clk_50Mhz   ,
    output      wire            clk_25Mhz  
);

    // 例化间连�??
    wire            locked    ;
    // wire            clk_50Mhz ;
//ila_0 ila_0_inst(
//    .clk                ( clk_100Mhz ) ,
    
//    .probe0             ( clk_100Mhz ) ,
//    .probe1             ( clk_100Mhz_180Phase ) ,
//    .probe2             ( clk_50Mhz ) ,
//    .probe3             ( clk_25Mhz ) 
//);
    wire            ENA     ;         
    wire            WEA     ;         
    wire    [4:0]   ADDRA   ;       
    wire    [7:0]   DATA_INA; 
    wire            rst_n   ;
    assign  rst_n   = sys_rst_n && locked ;
clk_wiz_0 clk_wiz_0_inst(
    .clk_in1            ( sys_clk       ) , 
    .resetn             ( sys_rst_n     ) ,
    .locked             ( locked        ) ,  
    .clk_out1           ( clk_100Mhz    ) ,
    .clk_out2           ( clk_100Mhz_180Phase ) ,
    .clk_out3           ( clk_50Mhz     ) ,
    .clk_out4           ( clk_25Mhz     ) 
);

ram_wrA ram_wrA_inst(
    .sys_clk            ( clk_50Mhz     ) ,
    .sys_rst_n          ( rst_n         ) ,

    .ENA                ( ENA           ) ,
    .WEA                ( WEA           ) ,
    .ADDRA              ( ADDRA         ) ,
    .DATA_INA           ( DATA_INA      )  
);

blk_mem_gen_0 blk_mem_gen_0_inst(
    .clka               ( clk_50Mhz     ) , 
    .ena                ( ENA           ) , 
    .wea                ( WEA           ) , 
    .addra              ( ADDRA         ) , 
    .dina               ( DATA_INA      ) , 
    .douta              ( douta         ) 
);

endmodule

 

module ram_wrA (
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,

    output      reg             ENA         ,
    output      reg             WEA         ,
    output      wire    [4:0]   ADDRA       ,
    output      wire    [7:0]   DATA_INA    
);
    parameter DATA_NUM = 32 ;
    reg     [4:0]       cnt_wr ; // 读写计数器。
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_wr <= 5'd0 ;
        else if(ENA && (cnt_wr == DATA_NUM - 1))
            cnt_wr <= 5'd0 ;
        else if(ENA)
            cnt_wr <= cnt_wr + 1'b1 ;
        else 
            cnt_wr <= 5'd0 ;
    end

    // output      reg             ENA         ,
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            ENA <= 1'b0 ;
        else
            ENA <= 1'b1 ;
    end
    // output      reg             WEA         ,
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            WEA <= 1'b1 ;
        else if(cnt_wr == DATA_NUM - 1)
            WEA <= ~WEA ;
    end
    // output      wire    [4:0]   ADDRA       ,
    // output      wire    [4:0]   DATA_INA    
    assign  ADDRA    = cnt_wr ;
    assign  DATA_INA = {3'b000,cnt_wr} ;
    
endmodule

 

`timescale 1ns/1ns
module test();
    reg             sys_clk     ;
    reg             sys_rst_n   ;

    wire    [7:0]   douta       ;
    wire            clk_100Mhz  ;
    wire            clk_100Mhz_180Phase  ;
    wire            clk_50Mhz   ;
    wire            clk_25Mhz   ;
ip_top ip_top_inst(
    .sys_clk                ( sys_clk             ) ,
    .sys_rst_n              ( sys_rst_n           ) ,

    .douta                  ( douta               ) ,
    .clk_100Mhz             ( clk_100Mhz          ) ,
    .clk_100Mhz_180Phase    ( clk_100Mhz_180Phase ) ,
    .clk_50Mhz              ( clk_50Mhz           ) ,
    .clk_25Mhz              ( clk_25Mhz           )  
);

    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #(CYCLE * 3000)   ;
        $stop             ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule

// `timescale 1ns/1ns
// module test();
//     reg             sys_clk     ;
//     reg             sys_rst_n   ;

//     wire            clk_100Mhz  ;
//     wire            clk_100Mhz_180Phase  ;
//     wire            clk_50Mhz   ;
//     wire            clk_25Mhz   ;

// ip_top ip_top_inst(
//     .sys_clk                ( sys_clk             ) ,
//     .sys_rst_n              ( sys_rst_n           ) ,

//     .clk_100Mhz             ( clk_100Mhz          ) ,
//     .clk_100Mhz_180Phase    ( clk_100Mhz_180Phase ) ,
//     .clk_50Mhz              ( clk_50Mhz           ) ,
//     .clk_25Mhz              ( clk_25Mhz           )  
// );

//     parameter CYCLE = 20 ;

//     initial begin
//         sys_clk    = 1'b1 ;
//         sys_rst_n <= 1'b0 ;
//         #( CYCLE * 10 )   ;
//         sys_rst_n <= 1'b1 ;
//         #(CYCLE * 3000)   ;
//         $stop             ;
//     end

//     always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


// endmodule

时序图:

仿真:

  • 19
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值