snifer

[原创]基于Vivado的C程序设计原理

0
阅读(5760)

最近利用Vivado进行了几个C程序的设计,取得一点小小心得,与大家分享。

众所周知,C程序一个重要内容就是main(),main()函数下面的程序都会被合成分析,在Vivado中被合成的程序称为顶级程序或者设计文件,任意在其中函数称为测试台,测试台用于确定被合成的顶级程序。

Xilinx中,通过在测试台中对你在头文件包含的文件进行分别合成。测试台中一般包含了你在硬件中不能合成的程序,比如I/O对存储器的访问。

通过头文件就能定义测试台和设计文件,从而实现上传和共享。因此在Vivado设计中通常采用层设计。

下面我通过一个程序调用2个子程序说明:

hier_func为主程序,sumsub_func为加和减,shift_func为平移程序。以下的文件定义于头文件(hier_func.h),标记为:

• din_t
• dint_t
• dout_t
具体程序为:

#include hier_func.h
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)
{
*outSum = *in1 + *in2;
*outSub = *in1 - *in2;
}
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
*outA = *in1 >> 1;
*outB = *in2 >> 2;
}
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D)
{
dint_t apb, amb;
#include hier_func.h
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)
{
*outSum = *in1 + *in2;
*outSub = *in1 - *in2;
}
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
*outA = *in1 >> 1;
*outB = *in2 >> 2;
}
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D)
{
dint_t apb, amb;
sumsub_func(&A,&B,&apb,&amb);
shift_
顶级程序能够包含多级子程序,也可以只有一种顶级程序用于合成,为了合成多级程序,可以分组为单级顶级结构。

通过合成hier_func来说明这个问题:

1、将上例中的程序加入Vivado文件;

2、指定顶级程序为hier_func

那么在程序的头文件设计中就按如下的结构:

#ifndef _HIER_FUNC_H_
#define _HIER_FUNC_H_
#include <stdio.h>
#define NUM_TRANS 40
typedef int din_t;
typedef int dint_t;
typedef int dout_t;
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D);
#endif
这个头文件包含了一些定义(如NUM_TRANS)在设计文件中并没有要求,这些定义可以用于包含相同头文件的测试台。

总体来说,C语言和Vivado可以完美结合,能产生不一般的化学反应。