差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
5._时钟分频 [2017/03/05 01:47]
zhijun [Verilog代码]
5._时钟分频 [2022/07/20 10:26] (当前版本)
zhijun [2. Verilog代码]
行 1: 行 1:
-=====时钟分频=====+## 时钟分频
  
 在之前的实验中我们已经熟悉了小脚丫的各种外设,掌握了verilog的组合逻辑设计,接下来我们将学习时序逻辑的设计。 在之前的实验中我们已经熟悉了小脚丫的各种外设,掌握了verilog的组合逻辑设计,接下来我们将学习时序逻辑的设计。
 \\ \\
-====硬件说明==== + 
--------+### 1. 硬件说明 
 时钟信号的处理是FPGA的特色之一,因此分频器也是FPGA设计中使用频率非常高的基本设计之一。一般在FPGA中都有集成的锁相环可以实现各种时钟的分频和倍频设计,但是通过语言设计进行时钟分频是最基本的训练,在对时钟要求不高的设计时也能节省锁相环资源。在本实验中我们将实现任意整数的分频器,分频的时钟保持50%占空比。 时钟信号的处理是FPGA的特色之一,因此分频器也是FPGA设计中使用频率非常高的基本设计之一。一般在FPGA中都有集成的锁相环可以实现各种时钟的分频和倍频设计,但是通过语言设计进行时钟分频是最基本的训练,在对时钟要求不高的设计时也能节省锁相环资源。在本实验中我们将实现任意整数的分频器,分频的时钟保持50%占空比。
 \\ \\
行 17: 行 18:
 \\  \\ 
  
-====Verilog代码==== +### 2. Verilog代码
-------+
  
 <code verilog> <code verilog>
行 67: 行 67:
  if(!rst_n)  if(!rst_n)
  clk_p<​=0;​  clk_p<​=0;​
- else if (cnt_p<​(N>>​1)) ​         //​N>>​1表示移一位,相当于除以2去掉余数+ else if (cnt_p<​(N>>​1)) ​         //​N>>​1表示移一位,相当于除以2去掉余数
  clk_p<​=0;​  clk_p<​=0;​
  else ​  else ​
行 104: 行 104:
 \\  ​ \\  ​
  
-测试文件,进行功能仿真时需要编写testbench测试文件。verilog里的testbench文件和源文件一样也是.v文件,仿真能让我们更直观的观察信号波形,可以先阅读[[lattice_diamond的使用|Diamond的使用]]了解如何使用Diamond中集成的仿真工具。+测试文件,进行功能仿真时需要编写testbench测试文件。verilog里的testbench文件和源文件一样也是.v文件,仿真能让我们更直观的观察信号波形,可以先阅读[[lattice_fpga|Diamond的使用]]了解如何使用Diamond中集成的仿真工具。
  
 <code verilog> <code verilog>
行 144: 行 144:
  
           //​module调用例化格式           //​module调用例化格式
-          divide ​ #​(.WIDTH(4),​.N(10))  u1 (                         //#​后面的()中为参数传递,如果不传递参数就是所调用模块中的参数默认值+          divide ​ #​(.WIDTH(4),​.N(11))  u1 (                         //#​后面的()中为参数传递,如果不传递参数就是所调用模块中的参数默认值
                                                                    //​divide表示所要例化的module名称,u1是我们定义的例化名称,必须以字母开头                                                                    //​divide表示所要例化的module名称,u1是我们定义的例化名称,必须以字母开头
  .clk (clk), ​    //​输入输出信号连接。 .clk表示module本身定义的信号名称;(clk)表示我们在这里定义的激励信号  .clk (clk), ​    //​输入输出信号连接。 .clk表示module本身定义的信号名称;(clk)表示我们在这里定义的激励信号
行 154: 行 154:
 </​code>​ </​code>​
  
-====引脚分配==== +### 3. 引脚分配 
--------+
 小脚丫上的系统时钟连接到FPGA的C1脚,时钟为12MHz。你可以通过仿真波形观察分频时钟(注意仿真的时间是有限的,所以分频时钟频率需要较高)。如果我们想通过眼睛观察LED的闪烁,那么需要设置参数N和WIDTH得到一个频率较低的时钟(例如N=12000000,WIDTH=24,分频时钟周期为1秒)。 小脚丫上的系统时钟连接到FPGA的C1脚,时钟为12MHz。你可以通过仿真波形观察分频时钟(注意仿真的时间是有限的,所以分频时钟频率需要较高)。如果我们想通过眼睛观察LED的闪烁,那么需要设置参数N和WIDTH得到一个频率较低的时钟(例如N=12000000,WIDTH=24,分频时钟周期为1秒)。
 \\ \\
行 167: 行 167:
 \\ \\
  
-====小结==== +### 4. 小结 
------- +在本实验学习了如何进行任意整数的分频设计,我们产生各种时钟,通过修改程序还能实验调整输出时钟的频率、相位以及占空比,非常灵活。同时学习了如何编写testbench文件,了解verilog中如何例化module,在后面的学习中将会经常用到。在下个实验我们将进一步了解时序逻辑,如何利用时钟来进一步设计,请看最常见的[[6. LED流水灯|流水灯]]。
-在本实验学习了如何进行任意整数的分频设计,我们产生各种时钟,通过修改程序还能实验调整输出时钟的频率、相位以及占空比,非常灵活。在下个实验我们将进一步了解时序逻辑,如何利用时钟来进一步设计,请看最常见的[[6.LED流水灯|流水灯]]。+