首页 > 其他分享 >SpinalHDL之模拟信号和输入输出

SpinalHDL之模拟信号和输入输出

时间:2024-07-14 12:30:00浏览次数:16  
标签:std val SpinalHDL 输入输出 模拟信号 downto io logic apb

本文作为SpinalHDL学习笔记第十五篇,记录使用SpinalHDL模拟信号相关API。

SpinalHDL学习笔记总纲链接如下:

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

可以使用 Analog/inout 功能定义三态信号。添加这些功能的原因有:

• 能够将三态信号添加到顶层(它避免了必须用一些手写的 VHDL/Verilog 包装它们)。

• 允许定义包含 inout 引脚的黑盒。

• 能够通过层次结构将黑盒的 inout 引脚连接到顶级 inout 引脚。

由于这些功能只是为了方便而添加的,因此请不要尝试使用三态逻辑的其他花哨的东西。如果你想对内存映射 GPIO 外设等组件进行建模,请使用 Spinal 标准库中的TriState/TriStateArray 线束,它抽象了三态驱动程序的本质。

目录:

1.模拟信号

2.输入/出

3.输入/出包装器

4.手动驱动模拟线束

1.模拟信号

Analog 是一个关键字,它允许将信号定义为模拟信号,在数字世界中可能意味着 0, 1, 或 Z (断开、高阻状态)。

例如:

case class SdramInterface(g : SdramLayout) extends Bundle {
val DQ = Analog(Bits(g.dataWidth bits)) // Bidirectional data bus
val DQM = Bits(g.bytePerWord bits)
val ADDR = Bits(g.chipAddressWidth bits)
val BA = Bits(g.bankWidth bits)
val CKE, CSn, CASn, RASn, WEn = Bool()
}

 

2.输入/出

inout 是允许你将 Analog 信号设置为双向(“in”和“out”)信号的关键字。

例如:

case class SdramInterface(g : SdramLayout) extends Bundle with IMasterSlave {
val DQ = Analog(Bits(g.dataWidth bits)) // Bidirectional data bus
val DQM = Bits(g.bytePerWord bits)
val ADDR = Bits(g.chipAddressWidth bits)
val BA = Bits(g.bankWidth bits)
val CKE, CSn, CASn, RASn, WEn = Bool()
override def asMaster() : Unit = {
out(ADDR, BA, CASn, CKE, CSn, DQM, RASn, WEn)
inout(DQ) // Set the Analog DQ as an inout signal of the component
}
}

3.输入/出包装器

InOutWrapper 是 一 个 工 具, 允 许 将 组 件 的 所 有 master TriState/TriStateArray/ReadableOpenDrain 线 束 转 换 为 inout(Analog(.. .)) 信 号。

它允许你保持硬件描述不受任何 Analog/inout 事物的影响,然后转换顶层以备综合。

例如:

case class Apb3Gpio(gpioWidth : Int) extends Component {
val io = new Bundle{
val gpio = master(TriStateArray(gpioWidth bits))
val apb = slave(Apb3(Apb3Gpio.getApb3Config()))
}
...
}
SpinalVhdl(InOutWrapper(Apb3Gpio(32)))

这将生成:

entity Apb3Gpio is
port(
io_gpio : inout std_logic_vector(31 downto 0); -- This io_gpio was originally␣
,→a TriStateArray Bundle
io_apb_PADDR : in unsigned(3 downto 0);
io_apb_PSEL : in std_logic_vector(0 downto 0);
io_apb_PENABLE : in std_logic;
io_apb_PREADY : out std_logic;
io_apb_PWRITE : in std_logic;
io_apb_PWDATA : in std_logic_vector(31 downto 0);
io_apb_PRDATA : out std_logic_vector(31 downto 0);
io_apb_PSLVERROR : out std_logic;
clk : in std_logic;
reset : in std_logic
);
end Apb3Gpio;

而不是:

entity Apb3Gpio is
port(
io_gpio_read : in std_logic_vector(31 downto 0);
io_gpio_write : out std_logic_vector(31 downto 0);
io_gpio_writeEnable : out std_logic_vector(31 downto 0);
io_apb_PADDR : in unsigned(3 downto 0);
io_apb_PSEL : in std_logic_vector(0 downto 0);
io_apb_PENABLE : in std_logic;
io_apb_PREADY : out std_logic;
io_apb_PWRITE : in std_logic;
io_apb_PWDATA : in std_logic_vector(31 downto 0);
io_apb_PRDATA : out std_logic_vector(31 downto 0);
io_apb_PSLVERROR : out std_logic;
clk : in std_logic;
reset : in std_logic
);
end Apb3Gpio;

4.手动驱动模拟线束

如果 Analog 线束没有被驱动,它将默认为高阻态。因此,要手动实现三态驱动程序(以防因某种原因无法使用 InOutWrapper 类型),必须有条件地驱动信号。

手动将 TriState 信号连接到 Analog 线束:

case class Example extends Component {
val io = new Bundle {
val tri = slave(TriState(Bits(16 bits)))
val analog = inout(Analog(Bits(16 bits)))
}
io.tri.read := io.analog
when(io.tri.writeEnable) { io.analog := io.tri.write }
}

标签:std,val,SpinalHDL,输入输出,模拟信号,downto,io,logic,apb
From: https://blog.csdn.net/m0_59092412/article/details/140397929

相关文章

  • IO输入输出流例子:Java对象输出json文本:
    读取文件:原始字节输入流(低级):publicclassCharCacheIOReader{publicstaticvoidmain(String[]args){try(//原始字节输入流(低级)Readerfr=newFileReader("src\\OutputStream.txt");//创建一个字......
  • SpinalHDL之实用工具(下篇)
    本文作为SpinalHDL学习笔记第十四篇,记录使用SpinalHDL的一些实用性语法工具。SpinalHDL学习笔记总纲链接如下:SpinalHDL学习笔记_spinalhdlblackbox-CSDN博客目录:6.存根(Stub)7.Assertions8.Report9.ScopeProperty6.存根(Stub)可以将组件层次结构清空作为一个存根(st......
  • SpinalHDL之实用工具(上篇)
    本文作为SpinalHDL学习笔记第十三篇,记录使用SpinalHDL的一些实用性语法工具。SpinalHDL学习笔记总纲链接如下:SpinalHDL学习笔记_spinalhdlblackbox-CSDN博客SpinalHDL的核心定义了许多功能性语法:•类型/字面量•寄存器/时钟域•组件/逻辑区•随机访问/只读存储......
  • SpinalHDL之错误修复(下篇)
    此箫非彼箫,不竹不丝不石。肉音别自唔咿。流苏瑟瑟纱垂,辨不出宫商角徵。一点樱桃欲绽,纤纤十指频移。课吞添吐两情痴,不觉悟灵犀味美推荐小说《回到明朝当王爷》,也有动漫,但小说改国漫通病,小说中杀伐果断人设极好的男主,到了动漫里就变成犹犹豫豫优柔寡断的废材,参见《元龙》。......
  • JAVA中输入输出要注意的地方
    1.输出System.out.println(msg);//输出一个字符串,带换行System.out.print(msg);//输出一个字符串,不带换行System.out.printf(format,msg);//格式化输出println输出的内容自带\n,print不带\nprintf的格式化输出方式和C语言的printf是......
  • C语言—-数据的输入输出
    数据的输入C程序中实现输入的函数很多,下面逐个来进行介绍用printf函数输出数据printf函数的一般格式printf(“格式控制”,输出列表);例如#include<stdio.h>intmain(){ inta=1; printf("a=%d\n",a); printf("HelloWord"); return0;}......
  • 这一篇让你更了解GPIO_Init()函数,了解CNF和MODE是如何配置输入输出模式,GPIOX_CR端口配置
    1GPIO初始化配置函数 GPIO_Init(GPIOC,&GPIOInitStruct); 1.1  正常的初始化函数代码1.2解读GPIO_Init(GPIOC,&GPIOInitStruct); 所以GPIOC的地址为  0x40000000+0x00010000+0x00001000=0x40011000STM32F103C8T6通用与复用功能I/O(GPIO与AFIO)、......
  • C++ 基础的输入输出介绍
    C++基础的输入输出介绍在C++编程的世界中,输入输出是连接程序与用户界面的桥梁,是实现人机交互不可或缺的部分。对于初学者而言,掌握C++中基本的输入输出方式——使用cin进行输入和使用cout进行输出,是踏入C++编程大门的第一步。本文将详细介绍如何在C++程序中利用cin和cout来......
  • Python速通(输入输出)
    1.(牛牛最喜欢的语言)牛牛认为Python是世界上最好的语言,因为Python是一种简单、方便、易学习的语言,牛牛最喜欢Python了!现在请你输出字符串"Pythonisthebestlanguage!"表达牛牛对Python的喜爱。print("Pythonisthebestlanguage!")2.(冲击offer的牛牛)即将毕业的牛牛在牛......
  • 三菱 PLC FX2N 输入输出如何接线
    在讲解FX2N系列PLC基本模块前,先要熟悉基本模块的接线端子。FX系列的接线端子(以FX2N-32MT为例)一般由上下两排交错分布,如图2-2所示,这样排列方便接线,接线时一般先接下面一排(对于输入端,先接X0、X2、X4、X6…按线端子,后接X1、X3、X5、X7…接线端子)。下图中,......