这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA上的嵌入式系统设计

共4条 1/1 1 跳转至

FPGA上的嵌入式系统设计

菜鸟
2006-06-02 14:32:20     打赏
电子技术的发展,使90nm甚至65nm的FPGA成为现实,如此规模的可编程逻辑器件,又使SOPC(system on program chip)成为现实。另一方面随着EDA技术快速推进,HDL在设计中普及和应用,极大的缩短了IC的设计和开发周期,电子系统设计正在进行着一场革命,个人在PC加FPGA开发板中就可以DIY出IC来,这些变化必将极大的促进软件特别是嵌入式软件的开发模式。我们既编写高级语言程序(比如C语言),在需要的时候也编写VerilogHDL模块来实现一个外部设备,这种软硬件融合的开发方式,在FPGA开发上是很方便的,现在各大FPGA厂商都提供了软核CPU,其中Altera的Nios II是其中比较成功的一种。NIOS II的出现顺应了这种潮流的变化,尽快的掌握这种灵活的软硬件设计开发模式,能为我们带来核心竞争力,为了让大家有一个良好的学习和开发环境,我们在本论坛将开展一列相关的介绍,下面先入为主的给大家一个关于NIOS II相关的文挡,先了解一下这个领域的亮点: NIOS II Step By Step(1)---NIOS II自定义指令 可编程软核处理器最大的特点是灵活,灵活到我们可以方便的增加指令,这在其他SOC系统中做不到的,增加用户指令可以把我们系统中用软件处理时耗费时间多的关键算法用硬逻辑电路来实现,大大提高系统的效率,更突出的一点是:我们通过下面的逐步操作会认识到,这是一个听起来高深,其实比较容易实现的功能(我们站在EDA工具这个巨人肩上,风光无限啊:),通过这一文档的介绍可以增强我们掌握NIOS II所有的技术手段的信心,这也是我把NIOS II 用户指令放在最前面的用意。 用户指令就是我们让NIOS II软核完成的一个功能,这个功能由电路模块来实现,这个电路模块是用HDL语言描述的。它被连接到NIOS II软核的算术逻辑部件上,下面就是示意图: [IMG]http://www.freefpga.com/up/other/c_i_1.JPG[/IMG] 用户指令分多种,有组合逻辑指令、多周期指令、扩展指令等等,学明白一个,也就举一反三了, Altera提供了用户模块HDL的模板,通过裁减就可以适应多种指令类型了。下面就是这个模版的Verilog形式,很简单吧,我想看到这里很多人会说:oh,that's easy。模块里面的内容不要我说了,也说不尽,是你智慧表演的舞台了,八仙过海,各显神通的机会来了:) //Verilog Custom Instruction Template module __module_name( clk, // CPU's master-input clk reset, // CPU's master asynchronous reset clk_en, // Clock-qualifier start, // True when this instr. issues done, // True when instr. completes dataa, // operand A datab, // operand B n, // N-field selector a, // operand A selector b, // operand b selector c, // result destination selector readra, // register file index readrb, // register file index writerc,// register file index result // result ); input clk; input reset; input clk_en; input start; input readra; input readrb; input writerc; input [7:0] n; input [4:0] a; input [4:0] b; input [4:0] c; input [31:0]dataa; input [31:0]datab; output[31:0]result; output done; // Port Declaration // Wire Declaration // Integer Declaration // Concurrent Assignment // Always Construct endmodule 下面两张图和表可以帮助我们更深入的理解和总结: [IMG]http://www.freefpga.com/up/other/c_i_2.JPG[/IMG] [IMG]http://www.freefpga.com/up/other/c_i_3.JPG[/IMG] 万事开头难,那我们就挑个软的捏,来做一条组合逻辑指令吧,下面就是模块示意图: ,[IMG]http://www.freefpga.com/up/other/c_i_4.JPG[/IMG] 这个模块只有两个输入,A,B,都是32BIT的,输出也是32BIT的。你可以让他们是C=A+B,也可以C=A+1。我们给出一个HDL范例: //Verilog Custom Instruction Template module test_custom_instruction( dataa, // operand A datab, // operand B result // result ); input [31:0]dataa; input [31:0]datab; output[31:0]result; assign result=dataa+1; endmodule 上面的模块实现A+1,很简单。 其他指令类型也就是增加了PORT口,里面处理更复杂一点。下面是多周期指令的块图: [IMG]http://www.freefpga.com/up/other/c_i_5.JPG[/IMG] 有了以上概念,和HDL模块的准备,我们可以进入实际操作了,打开QUARTUS II,建一个工程,再进入SOPC BUILDER,建好相关的SOPC 环境,下图是FreeDev2.1 EP1C12+100M开发板的一个配置 [IMG]http://www.freefpga.com/up/other/c_i_6.JPG[/IMG] 双击CPU项就进入CPU配置,设置用户指令我们要选最后一个表单(Custom Instructions TAB)。见下图 [IMG]http://www.freefpga.com/up/other/c_i_7.JPG[/IMG] 在该表单中我们点击IMPORT,来加入我们的HDL模块,见下图: [IMG]http://www.freefpga.com/up/other/c_i_8.JPG[/IMG] 在IMPORT操作窗口上,点击ADD增加用户指令模块,点击read port list from files显示模块PORT。 最后点击Add to System完成用户指令的添加。 在SOPC BUILDER 中生成系统,并在QUARTUS II中重新编译整个工程,并program编程开发板器件,这样硬件部分就完成了。下面我们就可以在NIOS II IDE中来编程使用我们的指令了。 由于我们在SOPC BUILDER 中增加了用户指令,SOPC BUILDER 生成的PTF文件中包含了相关信息,我们在NIOS II IDE 中增加新软件工程项目编译时,系统根据SOPC BUILDER生成的PTF文件生成了硬件系统描述的system.h。在该头文件中系统已经为用户指令生成了相关的宏,我们以上定制的用户指令在system.h中相关部分如下: /* * custom instruction macros * */ #define ALT_CI_TEST_CUSTOM_INSTRUCTION_N 0x00000000 #define ALT_CI_TEST_CUSTOM_INSTRUCTION(A,B) __builtin_custom_inii(ALT_CI_TEST_CUSTOM_INSTRUCTION_N,(A),(B)) 注意__builtin_custom_inii是Altera 移植GCC后的built_in Function。 最后,我们创建一个Hello World工程,稍微改动一下: #include #include int main() { int a,b,c; a=1; c=ALT_CI_TEST_CUSTOM_INSTRUCTION(a,b); printf("c=%d\n",c); return 0; } 主要把system.h头文件包含进来。 好了,马上可以进行调试了。 [align=right][color=#000066][此贴子已经被作者于2006-6-2 6:45:34编辑过][/color][/align]



关键词: 嵌入式     系统     设计     我们     模块     一个     指令     用户         

菜鸟
2006-07-10 19:32:00     打赏
2楼
请问,在用户指令中,参数或返回值是指针的情况是什么样子? 在HDL模块编写时有神么不同吗?

菜鸟
2006-07-23 19:29:00     打赏
3楼
同问 [em01]

菜鸟
2006-12-05 04:31:00     打赏
4楼
楼上把问题想复杂了,ALT_CI_TEST_CUSTOM_INSTRUCTION(a,b)只是一个C代码中汇编宏,完全当成一个汇编来看待。 返回可能是一个int,或者void,(可以看一下ALT_CI_TEST_CUSTOM_INSTRUCTION定义) 如果要给指针赋值,编译器会自己转换掉。例如: int* p; p=ALT_CI_TEST_CUSTOM_INSTRUCTION(a,b); 可能会有警告。可以加一个强制转换。 楼上,可以做下试验,看看编译器的反应。 [align=right][color=#000066][此贴子已经被作者于2006-12-4 20:33:40编辑过][/color][/align]

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]