当前位置:文档之家› 红芯电子对FPGA逻辑设计的解读

红芯电子对FPGA逻辑设计的解读

红芯电子陆续推出了4块FPGA开发板,在不断的改进和加强功能的同时,也在根据顾客的反馈做一些修正。很多人反应例程不容易看得懂,并且对其中的一些技巧无法理解。于是我们决定写一个文章,来指导大家如何学习面向FPGA

的逻辑设计,从专业的角度来分析如何去实现电路。我们也会加入我们的例程的详细分析,同时也会分析一些顾客发过来让我帮忙Debug的Code,指出其中的错误,让大家可以引以为鉴。我们会陆续推出,如有任何的问题,大家可以和我一起讨论和交流。

该如何学习面向FPGA的逻辑设计?

学习面向FPGA的逻辑设计是一个因人而异的过程,因为基础,目标的不一样,学习的方法和过程都会有很大的差异,但是我们仍然可以总结出其中的规律。从而总结出一个大致相同的过程:

1、学习语法。

a) 语法是相对简单的,找一本语法的书,认真的学习一下Design和V erify的语法,任何一个基础再差的人,学习一个星期也绰绰有余。

b) 怎么样才能叫语法学好了呢?如果你看见红芯电子的例程,不会有语法上的问题,就可以了,不需要钻牛角尖,设计当中,主要的语法如always 块,assign,case明白就可以了,当然,验证要求的语法要多一些。这些可以通过后面设计当中慢慢强化。

2、学习简单的电路描述。

a) 在学习语法的同时,你肯定会尝试着去写一些简单的电路,这个时候肯定是模仿居多,比如说控制LED灯的闪烁,数码管的控制等简单电路。

b) 这个阶段,我建议大家写一些基本的Code并明白他会综合成怎么样一个电路。比如说case语句生成怎样一个电路,和if else 生成的电路会有怎么样的区别。

3、学习简单的TestBench。

a) Testbench是测试的激励文件,毕竟你写的Code肯定需要Debu g,最好的办法就是仿真,用Modelsim,Active-HDL,NCverilog等工具。

b) 这个阶段你只要能写一些简单Testbench就可以了,让你能看见波形,通过波形来debug。具体可以参考红芯电子例程里面的XXX_tb.v的文件。

4、学习各种接口设计。

a) 在语法,简单电路,Testbench都没有问题之后,就可以开始学习一些常见接口的设计了,比如UART,SPI,I2C,1-wire等,对应的器件和接口有串口,SPI Flash,串行AD/DA,EEPROM,DS18B20,IR,PS2,DS 1302Z等

b) 我相信,这个时候,作为初学者,其实还是模仿居多,我并不反对。但是一定要注意,一个一个来,每学习一个,需要仔细的去分析相应器件的Da tasheet,然后参考别人设计的实现方式,特别是细节。然后自己尝试着写,看能否实现功能,最后要自己换一个同类型的接口,在不参考其他人的情况下,能否实现。不能实现就需要继续分析原因,能实现就可以学习下一个类型的接口。

c) 常见的接口很多,特殊的接口更多,是没有办法一个一个学完的,作为初学者,需要做到就是学习一个掌握一类,如果你能仅参考Datasheet(在工程中,很多时候我们确实只有Datasheet)完成相应的接口设计的时候,你就已经成长了。

d) 在红芯电子提供的例程中,所有以*_CTL.v的module就是接口层,可以参考一下。

5、学习模块划分技巧。

a) 在各种基本的借口设计都已经完成以后,这个时候你就可以尝试着写一些更为复杂的电路来实现一些功能呢?比如说做一个“数码管+RTC”来实现时钟的功能,能否配合按键使之可以配置时钟,能否加上闹钟的功能,能否加上计时器的功能?能否将数码管换成LCD?如果这些都实现了,你会发现这就是一个电子表。

b) 这个时候你就要学习模块划分了,毕竟一个再简单的系统,也是分许许多多的模块的,为了有更清晰的思路,为了更好的维护,我们需要将整个设计划分开,分成更加小的模块,然后一个一个实现并测试,总后再来一个综合测试。

c) 这个部分以后我们还会有专门章节来详细阐述。

6、学习构建自动化测试环境。

a) 在做一些小东西的时候,特别是分层设计以后,你肯定会觉得简单的testbench不够用了,每一个module都要单独写Testbench,为了测试不同情况下就需要写很多的Testbench,这个时候肯定是很麻烦的,这个时候就需要构建一个自动化的测试环境。

b) 在Linux下用Makefile可以很简单的构建,但是就目前大家的开发环境全部是在Windows下,也可以构建,用Modelsim的do文件也可以构建。

c) 因为篇幅的关系,这个部分以后我们还会有专门章节来详细阐述。

7、学习常见Device Control 设计和验证。

a) 这个时候,一些小系统可以轻松完成的时候,就会发现,小的东西可以轻易的做出来,但是复杂的东西就比较困难。这时你就需要学习一些较大的控制电路的设计,比如SDRAM control,LCD control(裸屏)。

b) 这些Controller都有一个共同的特点,就是要求高速。要知道,高速电路是比较考验技术的。特别是IO速度超过100M以后,就会需要综合考虑器件选型和电路优化了。

c) 这类controller里面,基本上都是用寄存器来控制,就是与外部用总线相连。外部总线配置controller里面的寄存器,从而修改controller里面的配置,并且接收外部总线的数据来实现功能,要学习并习惯这种控制方式。

d) 这个时候我建议不要轻易的模仿别人的电路,原因很简单,简单的电路和基本的技巧都已经没有问题了。剩下的就是模块的划分和模块内部的组合以及电路的优化。这个东西就靠自己的理解,每个人的情况和出发点都不一样,模仿已经没有意义了,而且,独立跨过这道坎,在非专业的设计里面,你已经是一个小高手了。

8、学习划分系统模块,分配任务。

a) 在FPGA常见的嵌入式系统里面,一般都是ARM+FPGA的结构,这个时候需要你根据对FPGA与ARM的理解来分配任务,有些任务适合FPGA

来做,有些任务适合ARM来做,这个阶段应该是能够从需求里面分析出ARM FPGA各自擅长和承担的任务。

b) 一般来说FPGA都是做为一个协处理模块,负责高速IO,高精度时序控制,并行多路计算,或者是复杂算法的实现,比如FFT。

c) 从系统的层面分析问题的能力,很难通过学习来得到,必须要经过一个又一个得项目来实现。

相关主题
文本预览
相关文档 最新文档