Menu Close

7段数码管IP CPU 接口封装

在我们学习过7段数码管的fpga设计后, 掌握的数码管的显示原理, fpga的实现,以及系统数据在数码管上的如果显示等。 在完成数码管工程后, 我们完全可以形成一个完整的IP核,提供给以后的fpga 设计,或者是soc设计中的一个IP。而不是每次得到一个项目,都要重新编写相关的代码。 即使是硬件方面可能有所不同, 需要更改数码管IP 是,也变得比较简单。 一个中型,或者是大型的项目, 往往都是通过一些简单的IP 模块搭建起来的。当我们掌握了比较多的IP,对于一个中型,大型项目的设计是很有帮助的。

 

1.项目中的系统分层结构:

图1

在一个工程中, 首先,我们先实现一个功能的IP 核, 在对这个FPGA IP 使用, 测试后, 就可以对这个功能IP 进行封装。 封装的原则是:

  • 适用性强,可以比较容易的被当前的工程,或者其他FPGA 工程中反复使用,
  • 方便例化,在有些工程中,会连续例化很多个相同功能的IP。 举例:有些项目中会有8个 或者是16 个uart 模块。
  • 具有丰富的接口参数, 方便一个相同的IP, 适应于不同的配置模式,而不是为每一种功能,单独生成自己的IP。
  • 附加选项,适用于不同型号的FPGA 芯片。

在很多fpga 的项目中: 我们通常会有一个硬件平台(硬件开发板),在硬件平台是由 FPGA 芯片, cpu 芯片,时钟, 电源芯片等组成。在fpga设计中,

  • 有时需要使用fpga 来控制硬件平台中其他芯片的操作,或者核其他硬件平台通讯。( 以太网通讯, uart 通讯,iic通讯等)
  • fpga 本身会完成相应的算法,(加密,解密,图像压缩, dsp 算法)
  • 和上层的cpu 进行数据交换。

在一些中型,或者大型的项目中,往往是在硬件平台下, fpga, cpu 协同工作, 完成某些具体的功能。所以经常分成以下几类模块

  • FPGA 功能IP
  • FPGA 寄存器
  • CPU 总线接口
  • CPU 软件驱动
  • CPU 软件应用程序

 

FPGA 功能IP: 完成具体功能模块,行为。

FPGA 寄存器:提供IP 模块接口的参数配置, 读取IP模块的相关内容

CPU 总线接口:链接FPGA 寄存器 和 cpu 总线, 提供读信号,写信号,地址, 数据读,数据写等。

CPU 软件驱动:软件驱动用来配置FPGA 寄存器,通过对寄存器的操作, 实现软件对FPGA IP 的读写操作。

CPU 软件应用程序:调用软件驱动, 实现上层应用功能。

 

2.对FPGA IP 的封装:

这里我们以7段数码管为例, 实现IP核到软件应用的设计流程。


 


MS_CNT: 用于设置 1ms 时钟,用户可以根据不同的时钟, 通过MS_CNT 来设置1ms 时钟。

seg_in_x : 用于用户数据输入接口

dp_in :      用于用户输入 7 段数码管的point

SEG:  7段数码管的输出

DP:   数码管 point 输出

SEAT: 数码管位置pin 输出

3.寄存器接口设计:

根据不同的应用,可以设计出不同的寄存器接口。

寄存器地址 寄存器描述 寄存器初值 读写能力
16’h0000 模块版本寄存器 32’h0000_0001 只读
16’h0004 模块控制寄存器 32’h0000_0000 读写
16’h001c 数据1寄存器 32’h0000_0000 读写
16’h0020 数据2寄存器 32’h0000_0000 读写

 


 

模块版本寄存器(00h): 被cpu 读取, 显示当前模块的版本

模块控制寄存器(04h):模块控制寄存器,

bit[30] , 1 => update 7段数码管值, 当cpu 写入后, fpga 端自动清零

bit[5:0]  表示7段数码管小数点的位置。

数据1寄存器 (1ch):7段数码管值

数据2寄存器(20h):7段数码管值

4.CPU 接口设计:


 

RISCV  RIB 总线:


RISCV  RIB 总线 转换为 地址, 读, 写,等信号:


经过一些简单的逻辑转换, 实现总线到读写逻辑的转换。

5.软件驱动:


驱动程序先将7段数码管的数值写入到寄存器中, 最后写控制寄存器,控制寄存器包括小数点的位置,和bit【30】 update 信息。

6.软件应用程序:


 

上层的应用程序handle_m_time_interrupt() 调用底层的驱动程序。

 

到此,实现了底层的verilog IP 开发,到上层软件应用程序的调用过程。

Posted in FPGA, FPGA 教材教案, Verilog, 教材与教案, 文章