轻松入门FPGA
文章平均质量分 87
千宇宙航
资深fpga专家,有多年的fpga和芯片开发设计经历,希望通过真正的案例让打击轻松入门FPGA
展开
-
孩子都能学会的FPGA:第三十三课——用FPGA实现一个通用的SPI主机接收模块
文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!每个工程作者都搭建了全自动化的仿真环境,只需要双击。信号,完成数据的解析。还是观察下面的图形,在。位的随机数据,主机完成数据的接收。,后续会有进阶的高级教程。程序的设计,接口信号如下所示。主机的发送模块基本一样,就是。主机的接收模块是主机发送。信号,同时解析从机发送的。的上升沿使能,时序正确。的下降沿使能,时序正确。的下降沿使能,时序正确。的上降沿使能,时序正确。原创 2023-12-17 13:03:31 · 1061 阅读 · 0 评论 -
轻松搭建FPGA开发环境:第三课——Vivado 库编译与设置说明
打开 ModelSim SE-64 10.5,可以在 Library 下面出现了刚才添加的所有库文件信息,Vivado库配置成功,后续有关Vivado IP核的仿真可以直接调用相关的仿真文件即可。既要装这个软件,又要装那个软件,还要编译仿真库,网上的教程一大堆,不知道到底应该听谁的。完成编译后,可以看到当前 D:\modeltech64_10.5\Vivado_Library 文件夹下出现了很编译译好的库文件。本节主要讲解如何编译Vivado的仿真库文件,以及如何在modelsim中如何配置。原创 2023-12-16 20:50:50 · 3049 阅读 · 0 评论 -
孩子都能学会的FPGA:第三十二课——用FPGA实现一个通用的SPI主机发送模块
上述的SPI通用主机发送模块仅仅需要根据实际情况修改参数就可以适用于绝大多数SPI接口的主机通信,通用性非常好。文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。信号使能,上节课是直接使能的,本节课可以通过参数进行控制。的下升沿采集数据,很明显采集不到正常的数据,从而数据传输错误。主机的发送,现在我们要做一个通用的SPI主机的发送,就是支持。,在该信号使能的情况下数据才可以发送,主要用来控制。会在开始的位置多了一次使能,造成数据多移位一次,时钟的上升沿变化还是时钟的下降沿变化。原创 2023-12-15 21:35:22 · 1719 阅读 · 0 评论 -
孩子都能学会的FPGA:第三十一课——用FPGA实现SPI主机发送数据
种不同的操作模式,不同的从机设备可能在出厂时就被设置好了某种模式,并且无法更改。的计数最大值是数据位宽和分频数的乘积(总共消耗的系统时钟数),同时根据计数值值完成。实现,网上有很多的教程,很多是用状态机实现的,本节我们用一种简单的方式来实现。红线表示时钟的前沿,蓝线表示时钟的后沿。,所以我们可以采用主时钟的分频来实现,主要在规定的范围内即可。时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平。是一种高速的、全双工的、同步的通信总线,并且至多仅需使用。的周期包括半个时钟空闲和半个时钟置位的周期。原创 2023-12-14 22:14:17 · 1716 阅读 · 0 评论 -
轻松搭建FPGA开发环境:第二课——UE 安装与配置说明
打开了“配置”选项卡,在定位中选择“编译器显示”下面的“语法高亮”,然后在右侧将“文档的完整目录名称”选择到UE所在目录下的wordfiles文件夹,内部放好了verilog和vhdl语言的高亮文件。打开了“配置”选项卡,在定位中选择“自动完成”下面的“其他”,然后在右侧如下图进行勾选,同时可以设置输入几个字符后进行提示,建议选择。”,出现如下界面,可以根据自己的喜好完成主题,布局,功能区或菜单/工具栏,几个设置等进行设置。在开始菜单中输入搜索“环境变量”,选择“设置”,点击搜索到的“编辑系统环境变量”。原创 2023-12-13 12:25:24 · 1314 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十八课——用FPGA实现最近最少使用(LRU)算法
可以把看完的书还过去再去借新书,有些书虽然没有看完,或者根据就没有看,而且最近也不打算看了,也可以还过去,这样就可以借更多想看的书了。新建仿真文件,产生0-7间的随机数做为新数据的标号进行输入,双击sim目录下的top_tb.bat文件,完成自动化仿真。算法的思路基本就是这样的,当然这个算法如何使用不是本文的重点,本文是来讲这个算法如果通过。模块输入的是数据的使能信号和数据的标号值,输出的是最少使用数据的标号值,这个值可以从。5. 全零的一行对应的表项是近期最少使用者,是要被新的表项替代的对象。原创 2023-12-10 14:45:34 · 1471 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十七课——用FPGA实现CIC插值滤波器
而插值滤波器是先梳状滤波,再积分滤波,结构图如下所示,如果数据输入频率是的。的16倍插值,基本恢复了正弦波的所有细节,除了相位有较大的偏移(这个偏移量是固定的),所以功能开发是正确的。文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。不过插值滤波器的结构和抽取滤波器的结构稍有不同,阶的积分滤波和梳状滤波,按照上节的位数扩展计数公式,扩展后最大位是。先进行梳状滤波的设计,就是输入的数据先进入。最后实现3阶的积分滤波器,此时处理的频率是。阶的梳状滤波,此时数据的输入频率是。原创 2023-12-09 17:20:25 · 1168 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十六课——用FPGA实现CIC抽取滤波器
CIC抽取滤波器一般用在高速采集信号的降采样上,假如AD的采集速度是Fs,但是系统的处理速度只有Fs/N,和直接抽取或者N个值加权平均相比,CIC抽取是计算复杂度低,系统性能,可以有效的过滤掉噪声和干扰信号。以上是百度上对CIC滤波器的说明,后面还有各种的公式的推导,有兴趣的读者可以好好学习一下,这不是本文的重点,本文主要讲解如何用FPGA设计CIC滤波器。从定义中我们可以得出,CIC滤波器是FIR滤波器的一种,可以只使用积分和梳状滤波器来实现,也就是说根本没有了FIR的乘法操作,实现非常的简单。原创 2023-12-09 13:01:04 · 2277 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十五课——用FPGA实现频率计
这个从直观上是很明确的,你不可能用低频率采样高频信号,就如拿砖头取打天上的飞机,根本打不到的。为什么我们不敢保证一定能得到外部输入信号的准确频率值,因为输入信号和FPGA的系统时钟是异步信号,FPGA采集的点有可以巧合错过一个跳变沿,所以我们设计的频率计会有1-2个时钟周期的误差.这个误差可以通过长时间的采集求平均值来减小。这节课只是简单的介绍频率计的FPGA实现,如果要提高频率计的精度,有多种方法可以改进,比如用两个计数器,一个上升沿计数,一个下降沿计数,相加求平均;的整数倍,所以测量可能就会有偏差的。原创 2023-12-08 13:07:37 · 1685 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO
上节课格雷码的编码,格雷码适用于连续变化的信号,比如递增和递减,这样一次只有一位信号反转变化,在跨时钟域同步时减低了同步的难度。级打拍的方式进行同步,然后对同步后的读地址信号进行格雷码解码,最后将写地址信号和同步解码后的读地址信号相减,根据差值。中,读数据和写数据可以是不同的时钟域,读写地址信号都是连续变化的,有时候写时钟域要知道读时钟域的地址,以判断。的框图,思路很简单,写地址信号格雷码编码后由写时钟域同步到读时钟域,然后格雷码解码,和读地址信号产生空。有时候读时钟域要知道写时钟域的地址,以判断。原创 2023-12-07 22:12:01 · 1707 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十三课——用FPGA实现格雷码的编码和解码
前面几课有说过不同时钟域的同步,有一课也讲过基于握手机制的跨时钟域同步机制,今天就谈谈采用格雷码编码和解码,将数据格雷码编码后再跨时钟传输,可以很好的进行同步,至于原因,那就是格雷码的数据无论如何加减变化,相邻的两个数最多只有一位数据在变化,就是跨时钟的时候把变化降到了最低,对于一位数据的同步,我们又可以采用打拍的方式进行同步!格雷码转二进制数的公式如下所示,二进制的高位和格雷码的高位一样,二进制的其它位是格雷码从最高位到当前所有位的亦或值。如需整个工程请留言(有了公式,也有了示意图,那格雷码的编解码的。原创 2023-12-07 14:08:02 · 1303 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十二课——用FPGA实现计数时钟的奇数次分频
计数时钟的奇数次分频是一个非常经典的面试题,看似只涉及非常简单的计数器,其实也考察了对时钟触发条件的理解,我们平常一般用的是时钟的上升沿,很少用时钟的下降沿,因为如果同时使用时钟的上升沿和下降沿会让时序分析变得非常复杂。但是用系统时钟的上升沿和用系统时钟的下降沿分别触发,得到的分频信号会有半个时钟的相位差,这个相位差太关键了,为了直观,绘制了如下的时序图,理解了设计的思路,FPGA的设计就非常的简单了,只需要两个计数器就可以实现任意计数时钟的奇数次分频。的仿真波形如下所示,和我们上面的分析是一致的,原创 2023-12-06 10:02:37 · 1174 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十一课——用线性反馈移位寄存器实现伪随机序列
移位寄存器结构简单,运行速度快,实用的密钥流产生器大多基于移位寄存器,移位寄存器理论也成了现代流密码体制的基础。读者也可以自己设计,多加入一些随机的因素,让数据更加的随机,同时也可以试试不同的本原多项式,或者取不同长度的移位寄存器,看看生成随机数的效果。如果想让数据的随机性更强一些,可以不定时的改变移位寄存器的初始值,如下所示,定义了一个寄存器cnt用于减法计数,每计数到。这个当然是可以的,用FPGA产生真正的随机数可能会相对麻烦一些,但是产生伪随机数还是非常简单的。整个代码如下所示,非常的简单。原创 2023-12-05 11:43:58 · 1675 阅读 · 0 评论 -
孩子都能学会的FPGA:第二十课——用FPGA实现定点数的开方运算
我们对于一些比较小的数的开方,我们可以根据乘法口诀大体推算出来,比如64=8*8,那64的平方根就是8,但是对于比较大的数,比如12345678这样的数,我们很难张口就算出了。由于2位数进行1次计算,所以8位无符号整数的开发运算其实只需要4次计算就可以得出结果,如下定义的开方运算次数。来求数据的平方根,中间还有一些公式的推导,看的比较眼花缭乱,有兴趣的读者可以好好的看一下。余数的运算如下所示,从高到底依次取余数的两位和前面计算结果与01的连接进行比较,来确定余数是减去当前的的平方值还是保持不变。原创 2023-12-04 13:52:32 · 2146 阅读 · 0 评论 -
孩子都能学会的FPGA:第十九课——FPGA实现流水线操作
前面几节课讲解的乘法和除法运算都需要一定的系统时钟来处理,以十七课的无符号位的乘法器为例,从数据输入乘法器到结果输出需要9个时钟周期,如果系统时钟是100MHz,那这个乘法器的处理速度也就是11MHz。天的时间就可以完成!把流水线用到FPGA开发上,比如上面说到的乘法器,增加乘法器的流水线操作,可以加快乘法器的处理速度,但是以前用一个乘法器,现在要用多个乘法器,很明显会成倍的消耗FPGA的逻辑资源!流水线,又称装配线,工业上的一种生产方式,指每一个生产单位只专注处理某一个片段的工作,以提高工作效率及产量。原创 2023-12-03 14:18:30 · 1915 阅读 · 0 评论 -
孩子都能学会的FPGA:第十二课——利用内存产生正弦波
本工程是实现正弦波的输出,我们可以根据实际的需要产生一组数据来表示一个周期正弦波的值。比如我们可以用128个8bit的数据来表示一个周期的正弦波数据,也可以用。的数据来表示一个周期正弦波的数据,当然也可以用1024个16bit的数据来表示一个周期的正弦波的数据,这个根据实际的需求,比如精度。如果想产生其它的波形,比如三角波,余弦波思路都是一样的,只需要把下面生成数据的地方相应修改即可。内部的数据不是从硬件上固化的,是初始化的时候才将数据固定住,掉电里面的信息还是会消失的。,都不具备掉电数据存储的功能。原创 2023-11-26 16:02:27 · 1756 阅读 · 1 评论 -
孩子都能学会的FPGA:第十三课——利用ROM缓存实现DDS发送器
你可以会说改变系统时钟呀,也可以,这是一个方法,但是非常不实用,因为系统时钟一般是固定的,如果我需要一个变频正弦波的功能,总不能时刻跳转系统时钟把?在modelsim中直接看波形,可以看到wave_out输出的是余弦波,开始的频率是1MHz,后面随着频率控制字的增大,wave_out输出的频率也越来越高。看看后面的仿真,当频率控制字增大到一定程度,一个周期从ROM中取得点就少了,波形失真严重!频率控制字控制波形的频率,相位控制字控制波形的相位。的余弦波,然后频率控制字增加,观察一下输出波形的变化。原创 2023-11-27 16:35:29 · 1303 阅读 · 0 评论 -
孩子都能学会的FPGA:第十五课——不同频率正弦波的叠加
既然前面通过DDS可以产生不同频率的正弦波(余弦波),那就可以让两个不同频率的正弦波叠加,后续再设计滤波器吧高频的正弦波滤除。文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。这节课先实现两个不同频率正弦波的叠加,功能很简单,知识点主要就是加减运算的位数扩展。下面是实现两个不同频率正弦波的叠加,这儿用到了位数的扩展。仿真波形如下所示,由于采样率的问题,波形叠加后会有很多的毛刺。里面读出来一个数据,这样正弦波的频率就是。,主要是滤波算法处理需要一定的时间,文件,完成自动化的仿真。原创 2023-11-29 13:48:00 · 1670 阅读 · 1 评论 -
孩子都能学会的FPGA:第十八课——用FPGA实现定点数的除法
除法是FPGA设计中的一个噩梦,主要原因就是除法器使用的时钟周期较多,拖慢了系统处理的速度。所以在实际的开发中,能不用除法就不用除法,对于除数是固定数的除法,可以转变成乘法进行计算。系统时钟100MHz,低电平复位,被除数是16位,除数是8位,都是无符号的整数,用FPGA实现除法运算,得出商和余数。-7180/(72)商是99,余数是52,和仿真结果是一样的,功能设计正常。和乘法器一样,有符号位的除法器计算的思路也是一样,先把有符号数转变成无符号数进行计算,结果再加上符号位即可。位宽也进行了对应修改。原创 2023-12-02 15:13:04 · 2189 阅读 · 0 评论 -
孩子都能学会的FPGA:第十七课——用FPGA实现定点数的乘法
是可以的,因为8个加数都是已知的,如果1个时钟周期完成1次加法运算,那先用4个加法器在1个时钟周期完成8个数的两两相加,得到4个结果,再用2个加法器在1个时钟周期完成4个数的两两相加,得到2个结果,最后再用1个加法器完成2个数的相加,就可以得出最终的结果,需要3个时钟周期。那乘法器的计算时间还可以进一步缩短吗?其实这儿有一个问题,那就是乘法的计算至少需要8个时钟周期,如果位数增多,需要的时钟周期更多,那能不能减少乘法器的时钟周期呢?,和仿真的结果都是一样的,说明功能也是正确的,而且立马就可以出来仿真结果!原创 2023-11-30 15:49:31 · 1883 阅读 · 0 评论 -
孩子都能学会的FPGA:第十六课——用FPGA实现IIR滤波器滤波
由于本节课程的重点不是讲数字滤波器的,所以要熟悉数字滤波器请去网上收索相关的内容,本节就是使用IIR滤波器来去除高频的干扰,让经过滤波器后的波形平滑。这儿只说明一点,IIR滤波器不光用到输入的数据,还需要输出的反馈数据,而FIR滤波器只需要输入的数据即可,所以从设计难度上来说,IIR设计难度更大一些。可以使用指令y=fi(SOS,1,44,40),将SOS的数据转化成1个符号位,3个整数位,40个小数位的定点数,然后再使用y.hex指令将10进制的定点数转换成16进制的定点数。首位是符号位,是一定要取的。原创 2023-11-29 20:53:54 · 2505 阅读 · 2 评论 -
孩子都能学会的FPGA:第十一课——基于握手机制的跨时钟域同步
信号的打拍一般适用于单比特信号的跨时钟域处理,对于多比特的信号的跨时钟域处理一般不建议用打拍的方式。上面的协议中是把多比特的数据锁存起来,通过单比特的req信号和单比特的ack信号控制数据的读写。其中req信号是从时钟域A到时钟域B,ack信号从时钟域B到时钟域A,用前面讲解的打拍同步即可。前面讲解过一些时钟域的信号通过打拍的方式实现数据的同步,通过用地铁换乘的例子让大家理解了为什么信号的打拍可以实现不同时钟域信号的同步。定义了所有需要的信号,要说明的一点是本时钟域的打拍一般用后缀。原创 2023-11-25 17:19:23 · 1506 阅读 · 0 评论 -
孩子都能学会的FPGA:第九课——多字节数据的发送和接收
当又数据要发送的时候先进入发送帧头(HEAD)状态,帧头发送完毕后(tx_over拉高)进入发送数据长度(LEN)的状态,数据长度发送完毕后(tx_over拉高)进入数据发送(SEND)状态,然后进入数据发送等待状态(WAIT),如果一次数据发送完毕(tx_over拉高)判断已经发送数据的个数(send_cnt),如果有效数据没有发送完毕跳转到数据发送状态,如果有效数据发送完毕进入发送帧尾的状态(TAIL),帧尾发送完毕后(tx_over拉高)进入IDLE状态等待下一帧数据的发送。原创 2023-11-23 15:43:47 · 2318 阅读 · 0 评论 -
孩子都能学会的FPGA:第八课——状态机
状态机是一种用于处理具有前后顺序的事件的计算机模型,包含现态、条件、动作和次态四个要素,它可以将一个复杂的控制流程分解成多个互相独立的状态,从而简化设计过程并提高了系统的可靠性和性能。但是对于实际的工程应用中,往往需要设计硬件来实现一些具有顺序的工作,必须一些算法的实现,在比如一些寄存器的配置,就需要用到状态机的思想。有了状态转移图,那FPGA代码的设计就很简单了,由于本状态机很简单,我们采用改进的一段状态机进行设计,下面讲解一下。类似,只是最右侧的输出逻辑不仅与当前的状态有关,还有输入有关。原创 2023-11-22 17:00:16 · 1223 阅读 · 0 评论 -
孩子都能学会的FPGA:第七课——UART增加奇偶校验位和参数化传递
思路很简单,把目前实现的uart的单byte数据的发送和接收模块当时底层最基础的模块,把常数据拆分成多个单byte的数据按照顺序一个个的发出去,就是按照时间顺序处理的流程最好用状态机来实现,下节课我们来将一下FPGA设计中的另外一个很基础的模块——状态机。实际的开发应用中,有的不需要奇偶校验位,有的需要奇偶检验位,有的需要奇校验,有的需要偶校验,对我们FPGA设计来说,难道一个需求设计一个FPGA工程?最后看看仿真波形,修改后功能是正确的,奇偶校验和停止位都正确,接收的数据和发送的数据一致。原创 2023-11-21 17:21:49 · 614 阅读 · 0 评论 -
孩子都能学会的FPGA:第六课——用计数器实现UART协议的接收模块
我们知道,uart的数据线在空闲状态下是高电平,而起始位是低电平,所以FPGA应该时刻监控uart数据线上的状态,如果前一个时刻还是高电平,下一个时刻就是低电平了(暂时不考虑线上有干扰),说明有新的数据要发送过来了,做好接收数据的准备。还是需要两个计数器就可以实现,一个计数器用于一次uart传输位数的计数,一个计数器用于uart一位数据宽度的控制,就是波特率的设置。所以信号的寄存器打拍就和地铁换乘一样,打拍越多,留给信号的处理时间裕量就越大,同步也就越好,但是花的时间也就越多。一般不是同一个时钟域。原创 2023-11-21 13:36:20 · 369 阅读 · 0 评论 -
孩子都能学会的FPGA:第五课——用计数器实现UART协议的发送模块
用fpga实现uart的发送原创 2023-11-20 16:07:20 · 376 阅读 · 1 评论 -
孩子都能学会的FPGA:第四课——组合逻辑和时序逻辑
说实话,还真的的不能合并,因为学习过数字电路的人都知道,数字电路的根据触发器有没有时钟可以分为组合电路和时序电路,那对应到FPGA开发上就是组合逻辑和时序逻辑,说白了FPGA的开发就是组合逻辑和时序逻辑的开发,大家去看看所有的FPGA工程,都是组合逻辑和时序逻辑的有机组合。常用手机拍照来比喻用非阻塞赋值实现时序逻辑,比如自拍,只有按了拍照按钮,你的样貌才会被保存成图片,当前图片可以保存到下一次按动拍照按钮为止,图片就会更新为新的一副图片,在这期间,无论你的表情和动作如何变化,图片上的内容都不会变化。原创 2023-11-18 14:47:16 · 409 阅读 · 1 评论 -
孩子都能学会的FPGA:第三课——阻塞赋值和非阻塞赋值
阻塞赋值和非阻塞赋值原创 2023-11-17 17:08:37 · 277 阅读 · 0 评论 -
孩子都能学会的FPGA:第一课——初识FPGA硬件编程
轻松了解FPGA硬件编程原创 2023-11-14 09:13:35 · 321 阅读 · 1 评论 -
孩子都能学会的FPGA:第十课——UART通信增加CRC校验
CRC8的模块设计完毕后,考虑一下UART通信协议帧的结构,和第九课相比,多了一个字节的CRC,这儿的CRC是对数据1-数据4的CRC。本节主要是讲述在通信协议中如何使用CRC校验,至于CRC校验的公式,CRC是如何运算的,网上的文章很多,在这儿就不具体的讲解了。本实例的UART的协议,使用了帧头,数据长度,CRC校验,帧尾,UART的奇偶校验位等多种方式来保证数据传输的正确性!判断接收的CRC和接收模块计算的CRC是否一样,如果一样,说明接收的数据正确,如果不一样,说明接收的数据有错误。原创 2023-11-24 21:45:56 · 1920 阅读 · 8 评论 -
孩子都能学会的FPGA:第二课——第一个FPGA工程(用计数器实现流水灯)
对于第一个FPGA工程,要求很简单,系统时钟是100MHz,低电平复位,假设有4个led灯(都是高电平点亮,低电平熄灭),按照1秒的频率进行流水闪烁(第1秒1号灯亮,2-4号灯灭;我们也可以把上面两个always合成一个always,功能也是一样的,但是不建议这样写,因为多个信号交织在一起,加大了设计的难度,同时也增加了后续的维护成本。如下所示,计数器模块在上面,流水灯模块在下面,那是不是一般的顺序执行,先执行计数器,再执行流水灯?基本的工作都完成了,那流水灯实现就很简单了,流水灯的模块设计如下。原创 2023-11-16 13:21:50 · 378 阅读 · 0 评论 -
一文让你轻松了解FPGA
PLL提供的时钟是FPGA运行的节拍器,我们常说的电脑CPU主频是2.5GHz,3.2GHz,说的就是CPU内部时钟的频率。LUT的本质就是RAM(随机存取存储器),五输入的LUT其实就是32(2的5次方)深度的RAM,输入对应的是RAM的地址,输出对应的是RAM内事先存储好的数值。FPGA是把使用到的LUT先编译出一张真值表,真值表中包括所有输入的排列组合及其对应的输出,比如下面这个LUT的真值表(截图不全),当输入是00000的时候,输出就是0,输入10011的时候,输出就是1。原创 2023-11-10 09:13:36 · 387 阅读 · 0 评论