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