最近在写一本Xilinx的FPGA方面的书,现将HLS部分内容在这里分享给大家,希望大家喜欢,也欢迎批评指正。以下原创内容欢迎网友转载,但请注明出处: https://www.cnblogs.com/helesheng在可编程逻辑器件被用于电子系统设计的前期,由于所含的逻辑资源较少,绝大部分情况下,它们被用于实现数据的传输和接口电路。工程师们习惯于使用寄存器传输级(RTL)的描述方式来开发可编程逻辑器件,以提高对逻辑资源的利用率。但正如我们在前面的章节中看到的,使用VerilogHDL这样的硬件描述语言进行RTL级的开发是一件非常费时、费力的事。另一方面,随着摩尔定理的不断发展,集成在可编程逻
一、DDS工作原理以正弦信号为例,DDS大概就是将M个点的一个周期的正弦序列存入ROM中,序列数据的地址就是正弦信号的相位;通过修改频率控制字(Fword)来改变每隔多少个地址取ROM里的数据进行输出。频率控制字越大,从ROM取出的数据点就越少,点数越少,输出一个周期信号的时间就越短,从而改变了输出信号的频率;通过修改相位控制字(Pword)来改变读取ROM里的数据的初地址(就是给ROM地址增加偏移量),从而改变输出信号的初相。DDS的基本结构图如下图所示:输出信号的频率的公式为:其中\(F_{CLK}\)为模块的时钟频率,\(F_{Word}\)为频率控制字,N为相位累加器的位宽(和频率控制
1、创建工程后点击IPCatalog2、在搜索栏搜索ROM,并选择BlockMemoryGenerator3、在弹出来的界面中选择单口ROM4、然后修改位宽和深度(这里根据我的需求设置为8位宽,4096深度);并把使能端口取消;勾上CoreOutputRegister,使数据延迟一个时钟周期输出;由于有primitivesOutputRegister的原因总的会延迟两拍输出。。5、然后打开小梅哥的Mif精灵,选择Xilinx、位宽为8为,深度为4096、最大值为256然后点击OK后在软件所在的文件夹生成coe文件。6、将coe文件放在找得到的地方,并来到OtherOptions,勾上LoadI
这次设计一个通用的多字节SPI接口模块,特点如下:可以设置为1-128字节的SPI通信模块可以修改CPOL、CPHA来进行不同的通信模式可以设置输出的时钟 状态转移图和思路与多字节串口发送模块一样,这里就不给出了,具体可看该随笔。一、模块代码1、需要的模块通用8位SPI接口模块`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company://Engineer:Lclone////CreateDate:2023/01/2300:56:52//
本次案例是按着小梅哥的思路来写的,部分截图和文字来自其教学视频。这次设计的是一个能把按键信号输入转换为一个按键信号下降沿和上升沿检测输出。1、状态机的设定 空闲态:等待按键信号的下降沿,若出现则进入下一个状态。按下滤波状态:进行20ms的计时,若在20ms的计时内出现的上升沿则表示按键还在抖动,回到空闲态:否则进入下一个状态,并生成按键按下信号。等待释放状态:如果在该状态下出现上升沿信号进入释放滤波状态。释放滤波状态:进行20ms的计时,若在20ms的计时内出现的下降沿则表示按键还在抖动,回到等待释放状态:否则进入空闲态,并生成按键释放信号。 2、模块代码`timescale1ns/1ps//
小梅哥的这个ZYNQ开发板上的DDR3位于PS侧,PL侧想要使用DDR3作为缓存的话,得通过HP接口来与PS侧的DDR3控制进行通信。本次实验在小梅哥OV5640工程的基础上,通过修改VDMA的S2MM端的模块而来的。将VMDA的帧缓存区设为1,关闭帧同步的功能后,其实和DMA差不多。一、需要自定义的ip核这里列出的为自己写的IP核。小梅哥的工程里还用到了其它的自定义的IP核,这里就不列出了。1、串口接收图像数据模块该模块调用了之前写的串口8位接收模块,详情可点击查看。此外,本模块还调用16位宽、深度为1024的带数据计数的普通FIFO核该模块主要的思想就是将接收到的两个8位的数据拼接位1个1
VL59 根据RTL图编写Verilog程序这题比较简单,照着写就好了。`timescale1ns/1nsmoduleRTL(inputclk,inputrst_n,inputdata_in,outputregdata_out);regdata_in_reg;always@(posedgeclk)beginif(~rst_n)begindata_in_reg1'b0;data_out1'b0;endelsebegindata_in_regdata_in;data_outdata_in_reg;endendendmoduleVL60 使用握手信号实现跨时钟域数据传输题目只给了一个模块的接口,实际
VL50 简易秒表`timescale1ns/1nsmodulecount_module(inputclk,inputrst_n,outputreg[5:0]second,outputreg[5:0]minute);always@(posedgeclkornegedgerst_n)beginif(~rst_n)second'd0;elseif(minute==60)secondsecond;elsesecond60)?second+1:1;endalways@(posedgeclkornegedgerst_n)beginif(~rst_n)minute'd0;elseif(second==60
VL45 异步FIFO很经典的手撕题,这道题要求产生的格雷码要在本时钟域中打一拍,其实不打也没关系。 主要要记住1、bin2gray的方法:右移一位与移位前异或;2、格雷码比较方法:空:读指针格雷码和写指针同步过来的格雷码相同;满:写指针格雷码高两位与读指针同步过来的格雷码正好相反,低位相同。`timescale1ns/1ns/***************************************RAM*****************************************/moduledual_port_RAM#(parameterDEPTH=16,parameterW
这次设计一个RGB灯的控制器,该控制器具有如下特点:每个灯的颜色可调,亮灭可控可以设置参数来修改RGB的数目 WS2812B的数据时序如下图所示: (图片来源自网络、侵权删) 为了方便设计我把T1H和T0L的时间值设为0.8us,为了稳定将RES设置为60us。 设计的思路是,设置一个400ns的计时器,然后再设置一个计400ns次数的计时器(每计三次清零),然后1码就是前两个400us为高电平,第三个400us为低电平;0码也是同理。一、设计的代码1、单像素控制模块`timescale1ns/1ps/////////////////////////////////////////////