SpinalHDL中如何优雅地实现寄存器总线读写

对于fpga系统设计里,寄存器控制通道的设计是系统控制中必不可少的部分。今日且看spinalhdl中如何优雅地实现寄存器总线读写。
bus slave factory
在spinalhdl里,其libraries里提供了关于总线相关的库。包含amba3、amba4、avalon等总线类型,并提供了bus slave factory工具:
通过bus slave factory,我们可以方便地实现寄存器读写,其提供了一系列寄存器读写方法。这里列举几个常用的方法(完整的方法列表可参照spinalhdl-doc):
read(that,address,bitoffset)    
注册寄存器读操作到指定地址,比特偏移为bitoffset 。     
write(that,address,bitoffset)
注册寄存器写操作到指定地址,比特偏移为bitoffset。             
readandwrite(that,address,bitoffset)
注册寄存器读写操作到指定地址,比特偏移为bitoffset 。            
readmultiword(that,address)
注册大位宽寄存器(超过总线数据位宽)读操作到指定地址,其中address地址存放对应低比特,高比特地址向上累加。
writemultiword(that,address)
注册大位宽寄存器(超过总线数据位宽)写操作到指定地址,其中address地址存放对应低比特,高比特地址向上累加。
除此之外,bus slave factory还提供了printdatamodel函数用于打印寄存器列表。而且在生成rtl时,其会自动检测寄存器地址是否存在冲突。
axi4-lite总线实现
这里以axi4-lite总线举例,通过axi4-lite总线读写三组寄存器:
en:单比特信号,可读可写。
plus:单比特信号,可读写,写1自动清零。
cnt:64比特信号,可读。
这里给出完整的代码结构:
这里代码5~10行代码声明模块端口,第12行代码规范axi4-lite端口名称。代码第15~18行通过slave factory实现axi4-lite寄存器读写。代码第19行打印输出寄存器列表。
由于plus写1清零,因此代码14行用于实现清零操作。
通过下面的语法生成rtl代码:
在生成rtl代码的同时,会打印寄存器列表:
仿真结果
spinalhdl里提供了axi4-lite总线的基础仿真库,这里直接调用其仿真库,完整的仿真代码如下:
通过gtkwave观察波形:
可以看到,功能符合我们的设计,写寄存器0x4信号plus拉高1个时钟周期后自动清零。     这里简单几行代码实现了axi4-lite总线控制寄存器读写,对于我们在真正的项目实现里,能够极大简化我们的工作量和bug产生。尽管现在各个大厂或许有专门的总线控制寄存器读写代码生成工具,但spinalhdl这种形式从本质上解决了verilog描述的重复性工作。
写在最后
虽然spinalhdl这种slave factory工具能够让我们在工程中快捷的实现想要的功能,但对于初学者来说,理解掌握axi4-lite这些标准的总线协议时序还是非常有必要的(verilog or spinalhdl实现都行喽)~


掌趣科技员工持股获通过 小米尚进任公司董事
光电传感器电路原理图解
PingCode Goals正式发布,为研发团队OKR管理而生
企业插单频繁?APS计划排产帮您解决难题
用于医疗设备电子设计的HDI PCB
SpinalHDL中如何优雅地实现寄存器总线读写
半导体所为揭示量子自旋液体的自旋子激发提供充分证据
电子元器件市场的一些现状
CES 2019即将启幕,NVIDIA三大亮点提前看
LoRa vs NB-IOT:哪个物联网标准更具优势?
满足物联网高速通信需求的SPI接口WiFi模块介绍
基于TensorFlow框架搭建卷积神经网络的电池片缺陷识别研究
磷酸铁锂电池和锂电池的区别
变频器在拉丝机中的应用方案
固态电池或是新能源的终极战场
基于QorIQ 处理器的Packetarium平台,实现了强
AMOLED首成为OLED主流产品
小米Smartknow自动感应牙膏机,采用红外线传感器感应
天价+买不到?华为荣耀Magic这么大噱头真相何在?
什么是测量信号放大电路,有什么基本要求?