跨时钟域的典型:异步FIFO的设计

跨时钟域的典型范例——异步FIFO

“时钟域(clock domain)”可以说是数字集成电路中一个非常重要的内容了,那么,何谓“跨时钟域”?

很好理解,在时序逻辑电路中,所有触发器、寄存器的运行都是由时钟激励而运行下去的。而一个大型的数字系统中不可能只有一种时钟:

例如Cortex-M3软核常常运行在50~100MHz、而UART串行口波特率要在921600以上的话,输入时钟频率最好高于200MHz、FPGA上的DDR3一般要求200MHz的时钟输入,不同PLL/MMCM输出的同频率时钟它们的相位也有可能不同……

这么多不同时钟激励的系统要组合在一起并能进行数据交互,那么势必会遇到“跨时钟域”的问题,解决这个问题的一大方法之一就是利用异步FIFO进行数据交互

什么是FIFO

FIFO(First In First Out),顾名思义,即先输入先输出的一种模块,FIFO一般分为同步FIFO和异步FIFO两种,同步FIFO即输入和输出在同一个时钟域中,异步FIFO即输入输出不处于同一个时钟域。

FIFO的存储模块可以看成一个二维寄存器(当然也可以通过生成ram代替),因此有些概念需要掌握,即:

阅读更多

FPGA学习:状态机化简&Testbench

FPGA学习 :状态机及其化简&Testbench

这里练习状态机利用《Verilog HDL高级数字设计》中的一个示例设计,该设计将从低位到高位串行输入的BCD码转换为从低位到高位串行输出的余三码,利用状态机判断每位的状态然后根据输入的数据判断输出数据。具体题目如下: 题目要求 说句实话,这个题目有点为了用状态机而用状态机的意思了,要将串行输入BCD以余三码串行输出的方式我能想到的其实很简单,完全不需要状态机,用四个DFF做缓冲串转并,然后把转完的数加上0011即可,最后再用四个DFF并转串输出。 但是人家既然要求了要用状态机,那就做呗,顺便研究下状态机化简😅

阅读更多

FPGA学习番外篇:在MacOS上编译和仿真verilog

FPGA学习番外篇:在MacOS上编译和仿真verilog

一年没更新了,过去的一年里一直忙着比赛和课业,一直没有更新博客里的内容,从今天开始再填完埋下的坑吧!

至于为什么会有这个奇怪的番外篇,是因为最近更新了装备,整了台X86的MacBook Pro,为了方便我写verilog和仿真看波形,整合了网上的很多教程最终写出来的。

这其中还包括利用yosys对写好的verilog进行综合的环节,但我想了下,在macOS下烧写fpga十分困难或者对我来说几乎不可能,因此我就虽然写了这部分教程,但我基本没用过综合,非要综合的话利用docker或者虚拟机安装vivado不香嘛😅

  • OS:macOS Big Sur 11.15.1
  • Device:MacBook Pro 13 (2020)
  • Software:VScode
阅读更多

Verilog HDL 简介与基本语法 2

FPGA学习 阶段一:Verilog HDL 简介与基本语法 2

1. 模块及其结构

Verilog的基本设计单元是“模块”block,一部分描述接口,另一部分描述逻辑功能,比如:

1
2
3
4
5
6
7
8
module block(a,b,c,d);
input a,b; //描述接口
output c,d;

assign c = a | b; //描述逻辑功能
assign d = a & b;

endmodule
以上是一个简单的模块,首先描述了四个接口a,b,c,d module
阅读更多

Verilog HDL 简介与基本语法(1)

FPGA学习 阶段一:Verilog HDL 简介与基本语法(1)

FPGA硬件开发路线学习规划:

由于想学习FPGA的相关内容,同时给数字电路打点基础,于是借助着B站上西安电子科技大学的视频开始学习Verilog HDL这门硬件描述语言,在学完语言后,将按照**《FPGA设计技巧与案例开发详解》**这本书上的相关内容在一块核心为Altera Cyclone IV的开发板上完成基本例程,之后在网上寻找相关项目学习、开发

1. Verilog的基本概念

  • Verilog是一门类C语言,语法非常接近C,将电路设计转变为程序设计
  • Verilog的代码对应的是现实中的一个硬件,这个过程叫“综合”,类似于C语言的编译
  • Verilog的代码是并行执行的
阅读更多