Handel-C工程中的main函数都是在一个时钟源的控制下执行的。搞清楚每一部分的代码在哪个时钟周期段内执行对程序设计者来说是一件极其重要的事情。这不仅是因为它可以使设计者写出的代码可以执行速度更快,更重要的是它关系到设计者写出的代码当用到并行结构时是否能够正确的执行,是否能正确的按照设计者的设计初衷去执行。精确的时钟控制对于与外部硬件通信也是十分的重要,因为某些硬件对给出的控制信号的时序变化要求非常严格。
Handel-C中的时钟使用规则如下:
1、赋值语句和延时语句每执行一次花费一个时钟周期。
2、通道通信一般情况只花费一个时钟周期,如果通道通信的某个分支未开始传输数据,那么另一个分支就一直等待直到它做好传输数据的准备。
例如:
par
{
link ! x; // Transmit
link ? y; // Receive
}
上述代码只花销了一个时钟,因为x向通道写和y从通道读是同时开始的.这个并行块实现的功能相当于把x赋值给了y.
par
{
{ // Parallel branch 1
a = b;
c = d;
link ! x;
}
link ? y; // Parallel branch 2
}
代码中的branch2等到第三个时钟周期branch1准备好数据传输时才开始通信。
3、表达式没有时钟花销,比如((y*z)+(w*k))<<2没有时钟花销,越复杂的表达式只是会包含更多的硬件资源。
Handel-C工程的时钟源可以通过FPGA芯片的某个引脚由外部时钟振荡器提供,也可以由FPGA芯片内部自己生成。为main函数指定时钟源的一般形式为:
set clock=Location;
Location的形式可以是:
Location | 描述 |
internal Expression | 时钟由芯片内部产生 |
external[Pin] | 时钟由外部引脚提供 |
external_divide[Pin] | 时钟由外部引脚提供并分频 |
具体使用方式如下:
set clock=external “Y2”;
set clock=external_divide “Y2” 2;
第一条语句的意思是时钟由外部引脚Y2提供,第二条语句的意思是时钟是由外部引脚Y2提供的时钟经2分频以后的值。