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

时序图:

仿真:

相关推荐
礼拜天没时间.3 小时前
深入理解HTTPS:从概念到实战优化
网络协议·http·https
童先生3 小时前
我想把minio弄成https访问能行吗?
网络协议·http·https
眰恦ゞLYF5 小时前
TCP与HTTP协议以及爬虫
爬虫·网络协议·tcp协议·http协议
励志五个月成为嵌入式糕手9 小时前
0825 http梳理作业
网络·网络协议·http
DebugKitty11 小时前
网络编程1-基本概念、函数接口
运维·服务器·网络·网络协议·socket·tcp
2501_9212904412 小时前
嵌入式第三十六天(网络编程(TCP))
网络·网络协议·tcp/ip
青草地溪水旁14 小时前
HTTP数据之旅:一个网络请求的完整冒险
网络·网络协议·http
小白iP代理15 小时前
国内代理 IP 的类型:住宅 IP、机房 IP、移动 4G/5G IP 区别
网络·tcp/ip·5g
2501_9277730716 小时前
Linux系统操作编程——http
网络·网络协议·http
钢铁男儿17 小时前
Python 网络编程进阶:使用 SocketServer 模块构建 TCP 服务器与客户端
网络·python·tcp/ip