SparkRoad测评(5)-时钟系统与IP资源引用
[复制链接]
对于fpga的芯片很多都内置了一些IP资源,本期测试用来验证SparkRoad的时钟系统和如何引用内置的PLL资源。
module ledflash(clk,led,x);
input clk;
output led;
output x;
wire sreset;
wire sstdby;
wire srefclk;
wire sclk;
reg [23:0] counter;
reg led;
assign sreset=1'b0;
assign sstdby=1'b0;
assign x=1'b0;
assign sclk=clk;
pllclk pll(
.refclk(clk),
.reset(sreset),
.stdby(sstdby),
.clk0_out(srefclk),
.extlock()
);
always @(posedge srefclk)
if (counter == 12000000)
begin
counter <= 0;
led <= !led ;
end
else
counter <= counter + 1'b1;
endmodule
上面这段程序是将外接的clk,引入到硬件pll中,将24M的频率通过内置的PLL硬件倍频到100M的过程。
首先第一步、建立主模块,这里有个坑:先不要写代码或者先不要写模块引用代码。
第二步,向过程中进入IP,也就是引用硬件PLL,菜单 Tool-> IP Generator
选择默认 create a new IP Core
给定文件名称
选择PLL内核,当然还有其它的内核。这里我根据需要选择pll
这里的输入时钟为24.00000000M,其它默认
这个我需要的频率是100M,直接next就可以生成IP了
这里就是生成好的ip了,这是注意:这时需要进行‘综合’,而不是编写引用代码,如果这时马上编写引用代码,就会出现很多的‘综合’错误!!!,不管你的代码是如何的正确,这里就是我说的坑。
第三步,综合正确后,就可以引用该模块了。
wire sreset;
wire sstdby;
wire srefclk;
wire sclk;
reg [23:0] counter;
reg led;
assign sreset=1'b0;
assign sstdby=1'b0;
assign x=1'b0;
assign sclk=clk;
pllclk pll(
.refclk(clk),
.reset(sreset),
.stdby(sstdby),
.clk0_out(srefclk),
.extlock()
);
我使用四个中间变量 sreset; sstdby; srefclk; sclk;和模块连接。
这里注意rest和stdby的信号都必须为低电平,以后将clk,也就是与晶振连接的clk引脚。输入给模块的refclk,模块输出为clk0_out引脚,就可以通过srefclk取出信号。
always @(posedge srefclk)
if (counter == 12000000)
begin
counter <= 0;
led <= !led ;
end
else
counter <= counter + 1'b1;
这时,就可以看到原来使用24M的led闪烁的速度变快了。说明引用成功了。
|