原创 【原创】SOPC用户自定义指令设计之软件篇

2008-12-23 21:50 6978 9 10 分类: FPGA/CPLD

Nios II嵌入式系统软件设计(五)


SOPCBuilder中添加自定义指令并将其集成到Nios II处理器后,在Nios II IDE中编译工程,在生成的system.h文件中会出现自定义指令的宏定义,宏定义的具体内容根据不同的指令类型以及指令的输出输出变量类型而有所不同,我使用的自定义指令添加后经过编译在system.h文件中生成如下代码:


#define ALT_CI_CRC_N 0x00000000<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


#define ALT_CI_CRC_N_MASK ((1<<3)-1)


#define ALT_CI_CRC(n,A) __builtin_custom_ini(ALT_CI_CRC_N+(n&ALT_CI_CRC_N_MASK),(A))


ALT_CI_CRC_N即为硬件篇中说明的每个指令的序号,从0~255,总共可以有256个指令。因为这条指令是扩展用户自定义指令,N07总共有8个功能,((1<<3-1)刚好是111,作为N值的掩码,ALT_CI_CRC(n,A)是供软件调用的自定义指令,ALT_CI_是自定义指令的标识,CRC是在指令集成进NIOS II处理器时用户设置的指令名字,该指令功能有函数__builtin_custom_ini()函数实现,Nios II 总共包含52种内建函数,在本文后面会详细解释,在这里该函数的第一个参数是指令序号,由于该指令为扩展指令,还需加上N的值以确定函数具体实现哪一功能,用ALT_CI_CRC_N_MASKN进行与操作(进行掩码),使其值只能在0~7之间,以避免用户不小心将N值设置为大于7而执行其他指令。第二个参数为输入变量A,即输入端口中的dataa


这样,只要在源文件中include system.h”文件即可以方便的调用指令ALT_CI_CRC(n,A)


关于自定义指令内建函数,其格式为:


__builtin_custom_<return type>n<parameter types>


return typeparameter types有三种形式,i代表intf代表floatp代表Void *,根据返回类型和输入参数类型的不同,内建函数总共有52种形式。


不返回结果


void __builtin_custom_n (int n);


void __builtin_custom_ni (int n, int dataa);


void __builtin_custom_nf (int n, float dataa);


void __builtin_custom_np (int n, void *dataa);


void __builtin_custom_nii (int n, int dataa, int datab);


void __builtin_custom_nif (int n, int dataa, float datab);


void __builtin_custom_nip (int n, int dataa, void *datab);


void __builtin_custom_nfi (int n, float dataa, int datab);


void __builtin_custom_nff (int n, float dataa, float datab);


void __builtin_custom_nfp (int n, float dataa, void *datab);


void __builtin_custom_npi (int n, void *dataa, int datab);


void __builtin_custom_npf (int n, void *dataa, float datab);


void __builtin_custom_npp (int n, void *dataa, void *datab);


返回int


int __builtin_custom_in (int n);


int __builtin_custom_ini (int n, int dataa);


int __builtin_custom_inf (int n, float dataa);


int __builtin_custom_inp (int n, void *dataa);


int __builtin_custom_inii (int n, int dataa, int datab);


int __builtin_custom_inif (int n, int dataa, float datab);


int __builtin_custom_inip (int n, int dataa, void *datab);


int __builtin_custom_infi (int n, float dataa, int datab);


int __builtin_custom_inff (int n, float dataa, float datab);


int __builtin_custom_infp (int n, float dataa, void *datab);


int __builtin_custom_inpi (int n, void *dataa, int datab);


int __builtin_custom_inpf (int n, void *dataa, float datab);


int __builtin_custom_inpp (int n, void *dataa, void *datab);


返回float


float __builtin_custom_fn (int n);


float __builtin_custom_fni (int n, int dataa);


float __builtin_custom_fnf (int n, float dataa);


float __builtin_custom_fnp (int n, void *dataa);


float __builtin_custom_fnii (int n, int dataa, int datab);


float __builtin_custom_fnif (int n, int dataa, float datab);


float __builtin_custom_fnip (int n, int dataa, void *datab);


float __builtin_custom_fnfi (int n, float dataa, int datab);


float __builtin_custom_fnff (int n, float dataa, float datab);


float __builtin_custom_fnfp (int n, float dataa, void *datab);


float __builtin_custom_fnpi (int n, void *dataa, int datab);


float __builtin_custom_fnpf (int n, void *dataa, float datab);


float __builtin_custom_fnpp (int n, void *dataa, void *datab);


返回指针


void *__builtin_custom_pn (int n);


void *__builtin_custom_pni (int n, int dataa);


void *__builtin_custom_pnf (int n, float dataa);


void *__builtin_custom_pnp (int n, void *dataa);


void *__builtin_custom_pnii (int n, int dataa, int datab);


void *__builtin_custom_pnif (int n, int dataa, float datab);


void *__builtin_custom_pnip (int n, int dataa, void *datab);


void *__builtin_custom_pnfi (int n, float dataa, int datab);


void *__builtin_custom_pnff (int n, float dataa, float datab);


void *__builtin_custom_pnfp (int n, float dataa, void *datab);


void *__builtin_custom_pnpi (int n, void *dataa, int datab);


void *__builtin_custom_pnpf (int n, void *dataa, float datab);


void *__builtin_custom_pnpp (int n, void *dataa, void *datab);


 

文章评论1条评论)

登录后参与讨论

用户412948 2011-10-12 19:55

麻烦问下,在此文中提到#define ALT_CI_CRC(n,A) __builtin_custom_ini(ALT_CI_CRC_N+(n&ALT_CI_CRC_N_MASK),(A)),里面的函数参数为n,A,我也按照同样的方法做了,为什么我得到是#define ALT_CI_CRC(n,A,B) __builtin_custom_ini(ALT_CI_CRC_N+(n&ALT_CI_CRC_N_MASK),(A),(B)),这里的B是哪里的来的?
相关推荐阅读
用户1332143 2009-08-16 21:47
时序电路亚稳态分析
这篇文章是我对电子设计中,亚稳态问题的一种分析和总结。文章通过对数字电路中器件的工作机制的介绍,引出亚稳态问题的发生机制。并通过对亚稳态问题发生机制的探讨,用以得到一种能够清楚地,有的放矢地解决亚稳态...
用户1332143 2009-08-16 10:52
【推荐】ADF4350配置软件下载
p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">  随着现代半导体工艺的不断发展, 几十纳米级的CMOS工艺给数字电路带来了很大的恩惠, 但对模拟...
用户1332143 2009-08-14 12:47
【原创】基于NiosII及FT245BM的USB接口设计
以前做的一个项目,FPGA接收AD采集数据后,通过串口发送回PC机,由于串口传输速率较低,对于实时性要求较高的场合不太适用,因此站长选用FT245BM芯片来实现USB接口传输,本文主要讲解FT245B...
用户1332143 2009-08-13 14:56
【原创】MAXII:UFM中晶振的使用
MAXII系列CPLD中带有UFM模块,本文主要讲解UFM中晶振的使用,具体内容请点击下面链接MAXII:UFM中晶振的使用...
用户1332143 2009-03-01 21:53
【原创】如何使用FPGA进行信号调制
       最近要做一个通信收发系统项目,以前对收发器的射频前段关注的比较多,而对基带部分的信号处理一直没有仔细研究。因此,正好借这个项目,熟悉整个基带部分的信号处理流程。       基带部分主要...
用户1332143 2009-02-27 21:56
寒假回来——FPGA市场评论
寒假在家里电脑不能上网,好久没来更新自己的博客了,首先感谢大家对我博客的支持。回来后马上开始了一个863项目,一直没有时间来写博客,今天总算有时间,上来看看。回来这段时间关注了下FPGA的相关新闻,发...
EE直播间
更多
我要评论
1
9
关闭 站长推荐上一条 /3 下一条