红芯电子对FPGA逻辑设计的解读
红芯电子陆续推出了4块FPGA开发板,在不断的改进和加强功能的同时,也在根据顾客的反馈做一些修正。很多人反应例程不容易看得懂,并且对其中的一些技巧无法理解。于是我们决定写一个文章,来指导大家如何学习面向FPGA的逻辑设计,从专业的角度来分析如何去实现电路。我们也会加入我们的例程的详细分析,同时也会分析一些顾客发过来让我帮忙Debug的Code,指出其中的错误,让大家可以引以为鉴。我们会陆续推出,如有任何的问题,大家可以和我一起讨论和交流。
该如何学习面向FPGA的逻辑设计?
学习面向FPGA的逻辑设计是一个因人而异的过程,因为基础,目标的不一样,学习的方法和过程都会有很大的差异,但是我们仍然可以总结出其中的规律。从而总结出一个大致相同的过程:
1、 学习语法。
a) 语法是相对简单的,找一本语法的书,认真的学习一下Design和Verify的语法,任何一个基础再差的人,学习一个星期也绰绰有余。
b) 怎么样才能叫语法学好了呢?如果你看见红芯电子的例程,不会有语法上的问题,就可以了,不需要钻牛角尖,设计当中,主要的语法如always块,assign,case明白就可以了,当然,验证要求的语法要多一些。这些可以通过后面设计当中慢慢强化。
2、 学习简单的电路描述。
a) 在学习语法的同时,你肯定会尝试着去写一些简单的电路,这个时候肯定是模仿居多,比如说控制LED灯的闪烁,数码管的控制等简单电路。
b) 这个阶段,我建议大家写一些基本的Code并明白他会综合成怎么样一个电路。比如说case语句生成怎样一个电路,和 if else 生成的电路会有怎么样的区别。
3、 学习简单的TestBench。
a) Testbench是测试的激励文件,毕竟你写的Code肯定需要Debug,最好的办法就是仿真,用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,DS1302Z等
b) 我相信,这个时候,作为初学者,其实还是模仿居多,我并不反对。但是一定要注意,一个一个来,每学习一个,需要仔细的去分析相应器件的Datasheet,然后参考别人设计的实现方式,特别是细节。然后自己尝试着写,看能否实现功能,最后要自己换一个同类型的接口,在不参考其他人的情况下,能否实现。不能实现就需要继续分析原因,能实现就可以学习下一个类型的接口。
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) 从系统的层面分析问题的能力,很难通过学习来得到,必须要经过一个又一个得项目来实现。
转载于:https://www.cnblogs.com/Redcore/archive/2010/10/26/1861955.html
红芯电子对FPGA逻辑设计的解读相关推荐
- FPGA逻辑设计回顾(13)RAM以及ROM的IP核定制以及关键参数
文章目录 前言 RAM IP的定制 Xilinx的IP定制位置 Block RAM的定制过程 第一页 第二页 第三页 第四页 第五页 Block RAM的延迟讨论 ROM IP核的定制 总结 前言 本 ...
- FPGA逻辑设计回顾(12)RAM以及ROM的RTL设计及其验证
前言 本文首发:FPGA逻辑设计回顾(12)RAM以及ROM的RTL设计及其验证 RAM以及ROM在FPGA中的实现大体有两种方式,一种是使用IP核定制,一种是RTL设计. 也许有人会反驳,那原语呢? ...
- FPGA逻辑设计回顾(11)FPGA以及PC中的RAM与ROM
文章目录 前言 RAM以及ROM在计算机中的应用 什么是存储器? 什么是硬盘驱动器? 其他类型的存储器 什么是RAM? RAM的类型 SRAM DRAM 什么是ROM? ROM的类型 掩膜ROM PR ...
- FPGA逻辑设计回顾(8)单比特信号的CDC处理方式之Toggle同步器
文章目录 前言 脉冲反馈展宽同步器技术补充说明 RTL代码 行为仿真 低电平脉冲的展宽处理 切换同步器的原理与实现 RTL实现 前言 本文首发自:FPGA逻辑设计回顾(8)单比特信号的CDC处理方式之 ...
- FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异
文章目录 前言 DDR的前世SDRAM DDR的今生以及演变版本:DDR/DDR2/DDR3 DDR/DDR2/DDR3/DDR4之间简单对比 速度对比 电压对比 延迟对比 预取差异 电阻端接对比 物 ...
- FPGA逻辑设计回顾(1)新手易犯的逻辑综合错误之always块
前言 注:本文首发自FPGA逻辑设计回顾(1)新手易犯的逻辑综合错误之always块 本文中用到了如下的小标题: "心中有路"与综合推断 "心中无路"与无从推断 ...
- FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱?
前言 注:本文首发自FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱? 在总结本文最后的多比特上升沿检测之前,我们先把备用知识讲清楚,摊开来,以免造成模糊不清的默许! 逻辑运算符与位元运 ...
- FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义
前言 本文首发自:FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义 上篇文章:FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异有提到,制造商会以一系列由破折号 ...
- AD7760数据采集系统设计 [FPGA逻辑设计]
1 AD7760简介 AD7760是一款高性能.24位Σ-Δ型模数转换器(ADC),融合了宽输入带宽.高速特性与Σ-Δ转换技术的优势,2.5 MSPS时信噪比可达100 dB,因此非常适合高速数据采集 ...
最新文章
- python使用matplotlib可视化使用subplots子图、subplots绘制子图并为可视化的子图添加主标题(subplots main title)
- PowerDesigner显示注释字段问题
- JAVA中将带负数的String字符串转换为int型数组方法
- class路径快捷 xml配置_SpringBoot 配置文件详解(告别XML)-class文件
- android上如何写配置文件
- eclipse导出Maven依赖的Jar
- 代码设计的基础原则_设计原则:良好设计的基础
- 网络——发送email(一个简单荔枝)
- sql server分布式_如何安装,配置和使用SQL Server分布式重播
- 这个漏洞能换几杯星巴克?在线等,挺急的
- pythonjam安装库_python及pycharm的安装
- Form的method方法get和post的区别
- 记录一次json转换的经历
- 什么是Internet cookie?
- Web安全测试之跨站请求伪造(CSRF)
- 计算机用户 图片存储位置,电脑版微信图片存在哪里?存储地址是什么?
- python中计算结果保留两位小数
- 手机图形计算器matlab,Mathlab图形计算器
- Rasa 聊天机器人Rasa_NLU_Chi
- Vue3 组件示例工程(二) —— AQI组件
热门文章
- python-pandas基本数据操作
- 最小二乘法(最小平方法)(generalized least squares)
- 制作java程序安装包
- LGV 引理——二维DAG上 n 点对不相交路径方案数
- Qt编写物联网管理平台20-控制器管理
- “双11”倒计时,电商行家如何玩转EDM?
- linux下载文件命令wget
- 解决java.io.FileNotFoundException: class path resource [beans.xml] cannot be opened because it does no
- linux正则和三剑客(grep,sek,awk)
- JDBC连接数据库添加数据