当前位置: 首页 > news >正文

SpinalHDL之VHDL 和 Verilog 生成

本文作为SpinalHDL学习笔记第十六篇,记录使用SpinalHDL代码生成Verilog/VHDL代码的方法。

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

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

目录:

1.从 SpinalHDL 组件生成 VHDL 和 Verilog

2.生成的 VHDL 和 Verilog

3.VHDL 和 Verilog 属性

1.从 SpinalHDL 组件生成 VHDL 和 Verilog

要 从 SpinalHDL 组 件 生 成 VHDL, 只 需 在 Scala main 函 数 中 调 用 SpinalVhdl(new

YourComponent) 即可。

生成 Verilog 完全相同,但用 SpinalVerilog 代替 SpinalVHDL。

import spinal.core._
// A simple component definition.
class MyTopLevel extends Component {
// Define some input/output signals. Bundle like a VHDL record or a Verilog␣
,→struct.
val io = new Bundle {
val a = in Bool()
val b = in Bool()
val c = out Bool()
}
// Define some asynchronous logic.
io.c := io.a & io.b
}
// This is the main function that generates the VHDL and the Verilog corresponding␣
,→to MyTopLevel.
object MyMain {
def main(args: Array[String]) {
SpinalVhdl(new MyTopLevel)
SpinalVerilog(new MyTopLevel)
}
}

 

Note:SpinalVhdl 和 SpinalVerilog 可能需要创建组件类的多个实例,因此第一个参数不是Component 引用,而是返回新组件的函数。

2.生成的 VHDL 和 Verilog

如何将 SpinalHDL RTL 描述转换为 VHDL 和 Verilog 非常重要:

• Scala 中变量的名称将保留在 VHDL 和 Verilog 中。

• Scala 中的 Component 组件层次结构会保留在 VHDL 和 Verilog 中。

• Scala 中的 when 语句会生成为 VHDL 和 Verilog 中的 if 语句。

• Scala 中的 switch 语句在所有标准情况下都生成为 VHDL 和 Verilog 中的 case 语句。

组织:

当使用 VHDL 生成器时,所有模块都会生成到一个文件中,其中包含三个部分:

1. 包含所有 Enum 定义的包

2. 包含架构中所有元素使用函数的包

3. 您的设计所需的所有组件

当使用 Verilog 生成时,所有模块都会生成到一个文件中,其中包含两个部分:

1. 使用的所有枚举定义

2. 您的设计需要的所有模块

组合逻辑

Scala:

class TopLevel extends Component {
val io = new Bundle {
val cond = in Bool()
val value = in UInt(4 bits)
val withoutProcess = out UInt(4 bits)
val withProcess = out UInt(4 bits)
}
io.withoutProcess := io.value
io.withProcess := 0
when(io.cond) {
switch(io.value) {
is(U"0000") {
io.withProcess := 8
}
is(U"0001") {
io.withProcess := 9
}
default {
io.withProcess := io.value+1
}
}
}
}

VHDL:

entity TopLevel is
port(
io_cond : in std_logic;
io_value : in unsigned(3 downto 0);
io_withoutProcess : out unsigned(3 downto 0);
io_withProcess : out unsigned(3 downto 0)
);
end TopLevel;
architecture arch of TopLevel is
begin
io_withoutProcess <= io_value;
process(io_cond,io_value)
begin
io_withProcess <= pkg_unsigned("0000");
if io_cond = '1' then
case io_value is
when pkg_unsigned("0000") =>
io_withProcess <= pkg_unsigned("1000");
when pkg_unsigned("0001") =>
io_withProcess <= pkg_unsigned("1001");
when others =>
io_withProcess <= (io_value + pkg_unsigned("0001"));
end case;
end if;
end process;
end arch;

时序逻辑

Scala:

class TopLevel extends Component {
val io = new Bundle {
val cond = in Bool()
val value = in UInt (4 bits)
val resultA = out UInt(4 bits)
val resultB = out UInt(4 bits)
}
val regWithReset = Reg(UInt(4 bits)) init(0)
val regWithoutReset = Reg(UInt(4 bits))
regWithReset := io.value
regWithoutReset := 0
when(io.cond) {
regWithoutReset := io.value
}
io.resultA := regWithReset
io.resultB := regWithoutReset
}

VHDL:

entity TopLevel is
port(
io_cond : in std_logic;
io_value : in unsigned(3 downto 0);
io_resultA : out unsigned(3 downto 0);
io_resultB : out unsigned(3 downto 0);
clk : in std_logic;
reset : in std_logic
);
end TopLevel;
architecture arch of TopLevel is
signal regWithReset : unsigned(3 downto 0);
signal regWithoutReset : unsigned(3 downto 0);
begin
io_resultA <= regWithReset;
io_resultB <= regWithoutReset;
process(clk,reset)
begin
if reset = '1' then
regWithReset <= pkg_unsigned("0000");
elsif rising_edge(clk) then
regWithReset <= io_value;
end if;
end process;
process(clk)
begin
if rising_edge(clk) then
regWithoutReset <= pkg_unsigned("0000");
if io_cond = '1' then
regWithoutReset <= io_value;
end if;
end if;
end process;
end arch;

3.VHDL 和 Verilog 属性

在某些情况下,为设计中的某些信号提供属性以修改它们的综合方式很有用。

为此,可以对设计中的任何信号或存储器调用以下函数:

语法

描述

addAttribute(name)

添加一个名为 name 的布尔属性,并将给定值设置为 true

addAttribute(name,
value)

添加一个字符串属性,并将给定的 name 设置为 value

val pcPlus4 = pc + 4
pcPlus4.addAttribute("keep")

 用 VHDL 生成声明:

attribute keep : boolean;
signal pcPlus4 : unsigned(31 downto 0);
attribute keep of pcPlus4: signal is true;

用 Verilog 生成声明:

(* keep *) wire [31:0] pcPlus4;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【2024_CUMCM】时间序列1
  • 【TOOLS】Chrome扩展开发
  • struts2如何防止XSS脚本攻击(XSS防跨站脚本攻击过滤器)
  • CentOS7配置阿里云yum源
  • WPF学习(2) -- 样式基础
  • spark运行报错:Container killed by YARN for exceeding memory limits
  • Vue 3 组件通信全解:从基础到高级技巧
  • Redis② —— Redis线程模型
  • <数据集>绝缘子缺陷检测数据集<目标检测>
  • 昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换
  • MVC 返回集合方法,以及分页
  • FPGA入门-自用
  • 语音识别HResults统计工具以及字根据关键词进行合并
  • PostgreSQL关闭数据库服务的三种模式
  • Re:从零开始的C++世界——类和对象(上)
  • 网络传输文件的问题
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • gulp 教程
  • Java应用性能调优
  • php面试题 汇集2
  • scala基础语法(二)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Sublime text 3 3103 注册码
  • 从零开始在ubuntu上搭建node开发环境
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 力扣(LeetCode)965
  • 如何胜任知名企业的商业数据分析师?
  • 如何在GitHub上创建个人博客
  • 入手阿里云新服务器的部署NODE
  • 三分钟教你同步 Visual Studio Code 设置
  • 深入浅出webpack学习(1)--核心概念
  • 使用putty远程连接linux
  • 为视图添加丝滑的水波纹
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 赢得Docker挑战最佳实践
  • elasticsearch-head插件安装
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #pragma pack(1)
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (27)4.8 习题课
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)opengl函数加载和错误处理
  • (一)WLAN定义和基本架构转
  • (转) ns2/nam与nam实现相关的文件
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)fock函数详解
  • (转载)利用webkit抓取动态网页和链接
  • .Net CF下精确的计时器
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)