RISC-V MCU中文社区

【分享】 蜂鸟E203移植到FPGA开发板前的IP核例化工作

发表于 开源蜂鸟E203 2023-04-14 17:32:25
0
2401
0

  1. 队伍编号:CICC1449

  2. 摘要


        • 蜂鸟E203软核工作的主频为16MHz高频时钟和3.2768KHz低频时钟,并且不同开发板提供的晶振频率不同,因此需要例化mmcm IP核和reset IP核将外部晶振时钟转换为两个不同频率的输出时钟供软核使用。

      创建工程

      首先,创建新的工程项目,将FPGA/mcu200t/src中的system.v顶层文件和rtl/e203中的所有文件夹加入到项目中。


      随后,根据目前手头上的开发板的芯片型号选择对应的芯片。引脚约束文件可以暂时先不加入。


      完成创建工程后,将system.v文件设为顶层


      例化IP

      由于蜂鸟内部CLK有两个,分别是16MHz高频时钟和3.2768KHz低频时钟,在FPGA板上只有外部晶振提供时钟,因此需要例化clocking wizard IP核提供时钟,并且例化reset IP。

      点击IP Catalog,搜索clocking wizard。

      Clocking options设置如下图所示,其中primary input clock输入时钟的频率根据手头上的开发板的主频选择,我们小组暂时使用的是50MHz晶振时钟的FPGA。


      Output clocks页面设置如图,其中clock_out1是输出高频时钟16MHz,reset信号要选择activelow,因为system.v中原本设定的reset信号就是activelow的。而低频时钟不能通过mmcm直接生成,需要另外写分频器,后续会讲。


    1. 随后加入reset IP核,设定如下



    2. 添加好IP核后,在system.v顶层文件中例化相应IP核。
    3.  wire clk_16M;
    4.  mmcm mmcm_unit
    5.    (
    6.     // Clock out ports
    7.     .clk_out1(clk_16M), // output clk
    8.     // Status and control signals
    9.     .resetn(ck_rst), // input resetn
    10.     .locked(mmcm_locked), // output locked
    11.    // Clock in ports
    12.     .clk_in1(CLK50MHZ)); // input clk_in1

    13. proc_sys_reset_0 reset_unit (
    14.   .slowest_sync_clk(clk_16M), // input wire slowest_sync_clk
    15.   .ext_reset_in(ck_rst), // input wire ext_reset_in
    16.   .aux_reset_in(1'b1), // input wire aux_reset_in
    17.   .mb_debug_sys_rst(1'b0), // input wire mb_debug_sys_rst
    18.   .dcm_locked(mmcm_locked), // input wire dcm_locked
    19.   .mb_reset(), // output wire mb_reset
    20.   .bus_struct_reset(), // output wire [0 : 0] bus_struct_reset
    21.   .peripheral_reset(reset_periph), // output wire [0 : 0] peripheral_reset
    22.   .interconnect_aresetn(), // output wire [0 : 0] interconnect_aresetn
    23.   .peripheral_aresetn() // output wire [0 : 0] peripheral_aresetn
    24. );
    25. 注意,请先将原本system.v的两个原本的例化注释掉,防止重复例化。


    26. 使用分频器生成低频时钟


    27. 我们小组暂时使用的FPGA开发板主频为50MHz50M/3.2768K1526,如下代码分频可得到3.2768KHz时钟。


    28. module clk_div(

    29.    input CLK50MHZ,

    30.    input rst_n,

    31.    output reg clk_div

    32. );

    33.  parameter NUM_DIV = 11'd1526;

    34.     reg [10:0] cnt;

    35.     

    36. always @(posedge CLK50MHZ or negedge rst_n)

    37.     if(!rst_n) begin

    38.         cnt <= 11'd0;

    39.         clk_div <= 1'b0;

    40.     end

    41.     else if(cnt < NUM_DIV / 2 - 1) begin

    42.         cnt <= cnt + 1'b1;

    43.         clk_div <= clk_div;

    44.     end

    45.     else begin

    46.         cnt <= 11'd0;

    47.         clk_div <= ~clk_div;

    48.     end

    49. endmodule

    50. 并在system.v中例化该模块

      clk_div clk_div_inst(

    51. .CLK50MHZ(CLK50MHZ),

    52. .rst_n(ck_rst),

    53. .clk_div(CLK32768HZ)

    54. );


      到此,已经做好了IP核例化的相关工作,成功例化后的system.v中的子模块会如下图显示。







    喜欢0
    用户评论
    nicolynN

    nicolynN 实名认证

    懒的都不写签名

    积分
    问答
    粉丝
    关注
    • RV-STAR 开发板
    • RISC-V处理器设计系列课程
    • 培养RISC-V大学土壤 共建RISC-V教育生态
    RV-STAR 开发板