至于该PLL的参数
这里不做修改,留在顶层模块再处理。对于自定义的PLL输出根据需要最好加上BUFG,
然后将这些时钟添加到模块输出项,经顶层模块输出。 4.3、BUFPLL_MCB模块
对于BUFPLL_MCB的详细解释,读者可参见ug382手册,
将其注释掉,并添加assign sysclk_2x=clk_2x_0; assign sysclk_2x_180=clk_2x_180;将
mcb_drp_clk添加为输出项。
该文件的修改就完成了,注意信号有无定义。该部分主要工作有两个:1、增加了两个时钟输出spi_clk和c51_clk;2、将DDR的时钟和仲裁时钟mcb_drp_clk不经过BUFPLL_MCB直接输出。
5、 双击,打开核的顶层文件。
该部分有两个部分,分为四个模块。memcX_infrastructure_inst部分和memcX_wrapper_inst部分,分别是PLL的封装和MCB核的封装,每个MCB对应一个memcX_infrastructure_inst模块和memcX_wrapper_inst 模块(X=1、3)。在上面的步骤中我们已经将memc3_infrastructure_inst注释掉,这里再添加两个BUFPLL_MCB模块,可以直接从memc1_infrastrcture_inst.v拷贝,如下。
将memc1_infrastrcture_inst模块的
c1_async_rst分别接到
memc1_wrapper_inst和memc3_wrapper_inst的async_rst端口(原来的memc3_wrapper_inst接的是c3_async_rst)。 添加一些信号定义:
至此就通过一个PLL输出向两个MCB核提供了时钟输入,如下。
接下来对memc1_infrastructure_inst的参数部分进行修改以适应用户时钟的需要。
这里要求的输入时钟是25MHZ,DDR2时钟为200MHZ,用户时钟clk0为200MHZ,mcb_drp_clk为50MHZ,spiclk为25MHZ,c51_clk为50MHZ,修改参数如下:
localparam C1_CLKOUT0_DIVIDE = 1; 对应PLL的输出0,注意输出为400MHZ localparam C1_CLKOUT1_DIVIDE = 1; 对应PLL的输出1,注意输出为400MHZ localparam C1_CLKOUT2_DIVIDE = 2; 对应PLL的输出2,输出为200MHZ localparam C1_CLKOUT3_DIVIDE = 8; 对应PLL的输出3,输出为50MHZ localparam C1_CLKOUT4_DIVIDE = 16;对应PLL的输出4,输出为25MHZ localparam C1_CLKOUT5_DIVIDE = 8; 对应PLL的输出3,输出为50MHZ localparam C1_CLKFBOUT_MULT = 16; PLL的乘系数
localparam C1_DIVCLK_DIVIDE = 1; PLL的除系数
PLL输入输出与参数之间的算法读者可以参阅ug382文档,也可以通过单独调用一个PLL核,产生所需要的输出0~5,然后拷贝该核.v文件的参数。还有一个参数C1_MEMCLK_PERIOD,这个参数在这个版本的适应比较混乱,因为该版本的MCB默认的输入时钟和DDR的时钟是相同的,这里是200MHZ,因此在以下两个地方同时使用了该参数。 (1)、
(2)、
实际上(1)中的参数是PLL输入时钟的周期,(2)中的参数是DDR的时钟周期,这个参数用于仿真,不影响实际运行结果。注意如果用ModelSim仿真,需使用6.5以上版本,否则secureip这个库没办法编译。
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库spartan6_MCB使用详解(2)在线全文阅读。
相关推荐: