分频器
偶分频器
通过always语句,对系统时钟进型分频,例如4分频:对系统时钟进行计数四次,产生一个高电平的flag信号。
在后级模块中使用时,采用 系统时钟&&flag==1 的判断方法。
这样的好处是在高速系统中,分频后的时钟仍然是挂靠在板子时钟树上的,能够很好的确保时钟的统一性,而直接进行分频可能会在高速系统中产生一定的误差。
奇分频器
通过always语句,做一个上升沿的分频,与一个下降沿的分频,将分频后的结果取与运算。
例如5分频:先做一个上升沿触发的5分频,三个周期低电平,两个周期高电平。
在做一个下降沿触发的5分频,三个周期低电平,两个周期高电平。
最后将两个分频后的结果取与运算,就是常规的5分频。
取与运算后
但在高速系统中,仍采用flag信号的方法进行分频。
PWM
首先PWM波形具有频率 、占空比等参数,占空比决定了PWM波形的等价波数值,而频率这一参数对于宏观数值的影响不大,例如50MHz的50%波与50Hz的50%波,有效值是等价的。
对于无源蜂鸣器来说,占空比这一参数影响发出声音的大小,频率影响发出的音调。
对于呼吸灯来说,占空比是从小到大、从大到小的,具有一个变化的过程,在FPGA里,通常使用一个计数器表示占空比,且往往这个计数器的计数周期是频率计数器的计数间隔,因此频率影响占空比变化的圆润。
相同强度的变化。频率越高越圆润。
无源蜂鸣器
音调和频率关系
层次化设计
需要设计的模块由多个小模块组成时,需要先构造这些小模块并仿真,而在一个工程文件中,只对小模块编译会产生报错,原因是没有检测到与工程名称一样的顶层模块,下面是解决方法:
一:重新编写一个顶层模块,将子功能模块实例化在顶层模块中,对顶层模块进行编译,进而对子功能模块进行编译。
二:软件设置,将子模块强制设置为顶层模块。
操作时右键子模块
二进制码转8421BCD码
先补零,零的个数 = 二进制对应的十进制位数乘四(对应的十进制数若用BCD码表示,则需要十进制位数乘4个位宽)
之后向左移位,一次移一位,总移位次数 = 二进制数位宽
每次移位后进行判断,每一位BCD码是否>4,若>4,则在该位上加3,即+0011。
PLL IP核
可以对输入到FPGA的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟。
FD:鉴频;
PD:鉴相;
LF:环路滤波器;
VCO:压控振荡器;根据电压不同输出不同频率
PLL的倍频
PLL的分频
IP核配置
配置时,这里不要勾选
完成配置的最后一步
左侧示意图中输出信号locked信号为标志信号,高点平有效,有效时代表输出时钟可用。
调用IP后需要对IP重新设置时
IP核文件被删除时如何重新添加到工程
add file后,选择IP核文件夹中的.qip文件
从其他工程中复制IP核
第一种方法
从其他工程的文件夹中直接复制“ip_core”文件夹,之后在新工程中添加.qip文件。
第二种方法
插件管理器中选择第三项
点击next后,上侧为要复制的IP核位置,下侧为IP核复制后的存放位置。
ROM IP核
FPGA中没有非易失性存储器,即ROM这种长期存储的存储器。
RAM、ROM两种IP核实际都是利用FPGA中RAM资源,不过在ROM IP核中,会提前生成数据文件,在每次上电后都会提前加载这个数据文件,使得FPGA的RAM变得像是非易失性存储器,即ROM IP核的实现。
生成的文件类型有:.hex、.mif两种。
在quartus软件中,点击FILE→new就可以生成以上两种文件。
手动修改数据文件内容
这里勾选的为重复赋值,在对话框中输入“1,2,3,4”就会重复填入1234.
下面未勾选的是递增赋值,首先赋值初始值,再选择递增还是递减和大小。
数据文件命名格式:rom_位宽x数据个数
单端口ROM IP核配置
文件保存在数据文件夹中,与数据文件夹放在一起,命名与数据文件一样格式。
下一步
下一步
之后添加mif文件,首先点击browse。
双端口ROM IP核配置
默认数据量要进行修改,修改为256个8bit字节的数据。
第二个方框为输出位宽,这里默认为8位宽。
与单端口相同步骤添加mif文件
注意
这里的含义为:使用modelsim等其他文件进行仿真时,需要添加的仿真库。
RAM IP 核
单端口RAM IP 核配置
第一步,与ROM IP配置一样
第二步
第三步,配置写入数据时所读数据是新数据还是旧数据。
第四步,配置是否有初始文件,有则添加.hex/.mif文件。
之后的步骤与之前的IP核配置一样。
双端口RAM IP核配置
双端口简单RAM IP 核配置
勾选第一项
下一步
下一步
下一步
之后的步骤与之前一样
RAM IP 真正双端口配置
第一步,选择真正双端口RAM IP。
下一步
下一步
后面步骤均默认初始化。
FIFO IP 核
FIFO是一种数据缓冲器,用来实现数据先入先出的读写方式。
FIFO存储器主要是作为缓存,应用在同步时钟系统和异步时钟系统中,在很多的设计中都会使用;如:
多比特数据做跨时钟域处理、前后带宽不同步等都用到了FIFO。
用法:多比特跨时钟域处理,通过A时钟的频率进入FIFO,再通过B时钟的频率读出数据。
用法:带宽不同步
FIFO模块的介绍
同步FIFO,称为SCFIFO;异步FIFO,称为DCFIFO。差别在于读写是否共用时钟。
模块中,full表示写入数据已满;empty表示已经读完数据;usedw[7:0]表述FIFO已经存储的数据个数;eccstatus为校验位。
FIFO IP 的配置
首先
其次,选择读写同步还是异步
配置输出端口
各输出信号的意义
下一步
下一步
后面步骤与之前的IP核配置一样。
异步FIFO
下一步
之后为输出管脚的选择
之后是FIFO的模式选择
保护电路,勾选表示使用,不勾选表示不实用。
后面的配置与以往的IP核配置一样。
FIFO 应用的注意项
异步FIFO,应用于多比特跨时钟域处理操作的过程中,可以看出首先写入的数据为8位宽的00、01、02、03
之后在读取的过程中为16位宽的数据
这里需要注意拼接次序:先写入的数据处于多比特数据的低位端。
传入读取fifo信号(fifo_en)后,读出的数据(dout_data)是滞后使能信号一拍的。
困惑
rom ip核中针对rom_ctrl模块的仿真中,为何key1_en信号只滞后于key1半个时钟周期?