VHDL记录

文章目录

  • 使用function名称作为“常量”
  • numeric_std包集中使用乘法的注意项
  • variable的使用
  • 对于entity设置属性的方法
  • 在entity声明中嵌入function的定义
  • VHDL仿真
    • 读写文件
      • File declaration/File handing
      • File reading
      • File writing
      • 小例子
    • 使用函数
  • 模块中打印出调试信息

使用function名称作为“常量”

测试代码如下,function仅有名称,没有输入,在function内部使用全局constant进行参数处理,后续代码中可以直接使用function名称作为常量
在这里插入图片描述

numeric_std包集中使用乘法的注意项

近日看到一个VHDL Coding Style中提示说,使用numeric_std包集时,不要直接将unsigned/signed数据与natural/integer类型的数据相乘。

今天看了一下numeric_std的源码发现,如果直接直接将无符号数/有符号数与整数相乘的话,乘积很有可能会溢出。主要原因是由于,包集在实现整数与符号数相乘的时候,是先将整数转成了无符号数/有符号数,之后再进行的乘法运算,而整数转换后的位宽是与输入的符号数的位宽相一致的,这就可能导致在整数进行类型转换的过程中,出现数据溢出的情况。

这其实算不上bug,因为源码中对此进行了明确说明,主要是在使用的时候需要注意规避这一点,不要让符号数与整数直接相乘,可以手动进行位宽转换后再做运算。相应的源码如下图所示,
在这里插入图片描述

在这里插入图片描述

variable的使用

在网上流传的介绍VHDL Coding Style的文章中,一般是不建议在可综合的代码中使用变量的,这大概是由于variable具有局部作用域、赋值立即生效、仿真工具支持的不够等几个原因。但最近看到几段VHDL代码,大量使用variable,且使用方式非常规范。在一个prcoess中进行组合逻辑的设计,在另一个prcoess中使用寄存器进行时序逻辑的设计。在使用变量的process中,一般是如下的处理流程,

  • Latch the current value
  • 各类组合逻辑
  • Combinatorial outputs before the reset
  • Reset
  • Register the variable for next clock cycle
  • Registered Outputs
comb : process (localMac, r, rst, rxMaster, txSlave) isvariable v : RegType;variable i : natural;
begin-- Latch the current valuev := r;-- Reset the flagsv.rxSlave := AXI_STREAM_SLAVE_INIT_C;if txSlave.tReady = '1' thenv.txMaster.tValid := '0';v.txMaster.tLast  := '0';v.txMaster.tUser  := (others => '0');v.txMaster.tKeep  := (others => '1');end if;-- State Machinecase r.state is-- end case;-- Combinatorial outputs before the resetrxSlave <= v.rxSlave;-- Resetif (rst = '1') thenv := REG_INIT_C;end if;-- Register the variable for next clock cyclerin <= v;-- Registered Outputs txMaster <= r.txMaster;end process comb;seq : process (clk) is
beginif rising_edge(clk) thenr <= rin after TPD_G;end if;
end process seq;

free_range_vhdl.pdf
11.4 Signals vs. Variables

在这里插入图片描述

对于entity设置属性的方法

在这里插入图片描述
类似的,对于verilog的module设置attribute的方法如下,
在这里插入图片描述

在entity声明中嵌入function的定义

在这里插入图片描述

VHDL仿真

有时写vhdl时,使用了record、array等数据类型,此时使用verilog进行仿真时略有不便,用vhdl仿真倒是方便不少。

读写文件

File declaration/File handing

在这里插入图片描述

File reading

在这里插入图片描述

File writing

在这里插入图片描述

小例子

在这里插入图片描述

在这里插入图片描述

使用函数

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity test is
end test;architecture Behavioral of test is-- convert a hex string to a std_logic_vectorfunction hex_string_to_std_logic_vector(inp: string; width : integer)return std_logic_vector isconstant strlen       : integer := inp'LENGTH;variable result       : std_logic_vector(width-1 downto 0);variable bitval       : std_logic_vector((strlen*4)-1 downto 0);variable posn         : integer;variable ch           : character;variable vec          : string(1 to strlen);beginvec := inp;-- default value is zeroresult := (others => '0');posn := (strlen*4)-1;for i in 1 to strlen loopch := vec(i);case ch iswhen '0' => bitval(posn downto posn-3) := "0000";when '1' => bitval(posn downto posn-3) := "0001";when '2' => bitval(posn downto posn-3) := "0010";when '3' => bitval(posn downto posn-3) := "0011";when '4' => bitval(posn downto posn-3) := "0100";when '5' => bitval(posn downto posn-3) := "0101";when '6' => bitval(posn downto posn-3) := "0110";when '7' => bitval(posn downto posn-3) := "0111";when '8' => bitval(posn downto posn-3) := "1000";when '9' => bitval(posn downto posn-3) := "1001";when 'A' | 'a' => bitval(posn downto posn-3) := "1010";when 'B' | 'b' => bitval(posn downto posn-3) := "1011";when 'C' | 'c' => bitval(posn downto posn-3) := "1100";when 'D' | 'd' => bitval(posn downto posn-3) := "1101";when 'E' | 'e' => bitval(posn downto posn-3) := "1110";when 'F' | 'f' => bitval(posn downto posn-3) := "1111";when others => bitval(posn downto posn-3) := "XXXX";-- synthesis translate_offASSERT falseREPORT "Invalid hex value" SEVERITY ERROR;-- synthesis translate_onend case;posn := posn - 4;end loop;if (width <= strlen*4) then-- bitval larger than desired widthresult :=  bitval(width-1 downto 0);else-- bitval smaller than desired width-- MSB is padded with zeros since default value for result is all 0sresult((strlen*4)-1 downto 0) := bitval;end if;return result;end;-- convert a binary string into a std_logic_vector (e.g., 0b10.1 = 101)function bin_string_to_std_logic_vector (inp : string)return std_logic_vectorisvariable pos : integer;variable vec : string(1 to inp'length);variable result : std_logic_vector(inp'length-1 downto 0);beginvec := inp;pos := inp'length-1;-- Set default valueresult := (others => '0');for i in 1 to vec'length loop-- synthesis translate_offif (pos < 0) and (vec(i) = '0' or vec(i) = '1' or vec(i) = 'X' or vec(i) = 'U')  thenassert falsereport "Input string is larger than output std_logic_vector. Truncating output.";return result;end if;-- synthesis translate_onif vec(i) = '0' thenresult(pos) := '0';pos := pos - 1;end if;if vec(i) = '1' thenresult(pos) := '1';pos := pos - 1;end if;-- synthesis translate_offif (vec(i) = 'X' or vec(i) = 'U') thenresult(pos) := 'U';pos := pos - 1;end if;-- synthesis translate_onend loop;return result;end;signal data_1  : std_logic_vector(5  downto 0);signal data_2  : std_logic_vector(7  downto 0);begindata_1 <= bin_string_to_std_logic_vector("101001");data_2 <= hex_string_to_std_logic_vector("45",8);end Behavioral;

模块中打印出调试信息

VHDL的仿真不如verilog方便,因此一般我都是用verilog对整个模块做仿真。但有的时候,想在某个可综合的VHDL模块内部嵌入仿真调试信息,这样在仿真时可以更直观的观测到运行结果。这在verilog中可以直接使用display和monitor函数,在VHDL中则需要借用report函数或者自己编写函数实现。

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;
library work;
--    use work.stdio_h.all;entity counter is
generic(SIM_VERBOSE : natural := 1
); 
port ( clk : in  std_logic;cnt : out std_logic_vector(15 downto 0)
);
end counter;architecture Behavioral of counter issignal cnt_i : unsigned(15 downto 0) := (others=>'0');begincnt <= std_logic_vector(cnt_i);process(clk)beginif rising_edge(clk) thencnt_i <= cnt_i + 1;--            if(SIM_VERBOSE=1) then
--                if(cnt_i = 20) then
--                    printf("The time is %d ns\n",now);
--                    printf("The cnt_i value is %u\n",std_logic_vector(cnt_i)); 
--                    printf("-------------------------\n");
--                end if;
--            end if;end if;end process;-- synthesis translate_offgen_sim_info : if SIM_VERBOSE=1 generatebeginprocess(cnt_i)use work.stdio_h.all;beginif(cnt_i = 20) thenprintf("The time is %d ns\n",now);printf("The cnt_i value is %u\n",std_logic_vector(cnt_i)); printf("-------------------------------------------------------\n");printf("The cnt_i value is %s,the cnt_i part value is %u \n",std_logic_vector(cnt_i),std_logic_vector(cnt_i(3 downto 0)));printf("-------------------------------------------------------\n");end if;end process;end generate;-- synthesis translate_onend Behavioral;

Modelsim运行结果如下所示,
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTC实验

一、RTC简介 RTC(Real Time Clock)即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电BCD码&#xff0c;四位二进制表示一位…

Java Persistence APl(JPA)——JPA是啥? SpringBoot整合JPA JPA的增删改查 条件模糊查询 多对一查询

目录 引出Jpa是啥&#xff1f;Jpa的使用创建实体类写dao接口类写服务类 crud增删改查增加修改根据id删除全查询分页查询 条件查询模糊查询单条件查询多条件查询模糊查询排序查询 多对一查询定义实体类auto主键策略下新增进行全查询测试 全部代码application.yml配置类pom配置文…

Java反射机制是什么?

Java反射机制是 Java 语言的一个重要特性。 在学习 Java 反射机制前&#xff0c;大家应该先了解两个概念&#xff0c;编译期和运行期。 编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些…

iPhone(iPad)安装deb文件

最简单的方法就是把deb相关的文件拖入手机对应的目录&#xff0c;一般是DynamicLibraries文件夹 参考&#xff1a;探讨手机越狱和安装deb文件的几种方式研究 1、在 Mac 上安装 dpkg 命令 打包 deb 教程之在 Mac 上安装 dpkg 命令_xcode打包root权限deb_qq_34810996的博客-CS…

驱动DAY4 字符设备驱动分步注册和ioctl函数点亮LED灯

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #d…

一百五十八、Kettle——Kettle各版本及其相关安装包分享(网盘链接,不需积分、不需验证码) 持续更新、持续分享

一、目的 最近因为kettle9.3的shim问题看了好多博客&#xff0c;都没有网盘分享。后来有一位博主分享了kettle9.2的shim安装包&#xff0c;已经很感谢他&#xff0c;但是是博客分享&#xff0c;下载还需要搞验证码下载码之类的。 kettle9.2的shim安装包下载好后&#xff0c;一…

图数据库_Neo4j基于docker服务版安装_Neo4j Desktop桌面版安装---Neo4j图数据库工作笔记0004

然后我们来看看如何用docker来安装Neo4j community server 首先去执行docker pull neo4j:3.5.22-community 去拉取镜像 然后执行命令就可以安装了 可以用docker ps查看一下 看看暴露了哪些端口 然后再看一下访问一下这个时候,要用IP地址了注意 然后再来看一下安装Desktop 去下…

Sigmastar SSC8826Q 2K行车记录仪解决方案

一、方案描述 行车记录仪是智能辅助汽车驾驶&#xff0c;和管理行车生活的车联网智能终端设备&#xff0c;利用智能芯片处理器、GPS定位、网络通信、自动控制等技术&#xff0c;将与行车生活有关的各项数据有机地结合在一起。 行车记录仪如今已经成了必不可少的车载用品之一&…

双向-->带头-->循环链表

目录 一、双向带头循环链表概述 1.什么是双向带头循环链表 2.双向带头循环链表的优势 3.双向带头循环链表简图 二、双向带头循环链表的增删查改图解及代码实现 1.双向带头循环链表的头插 2.双向带头循环链表的尾插 3.双向带头循环链表的头删 4.双向带头循环链表的尾删…

ATF(TF-A) 威胁模型汇总

安全之安全(security)博客目录导读 目录计划如下&#xff0c;相关内容补充中&#xff0c;待完成后进行超链接&#xff0c;敬请期待&#xff0c;欢迎您的关注 1、通用威胁模型 2、SPMC威胁模型 3、EL3 SPMC威胁模型 4、fvp_r 平台威胁模型 5、RSS-AP接口威胁模型 威胁建模是安全…

浅学实战:探索PySpark实践,解锁大数据魔法!

文章目录 Spark和PySpark概述1.1 Spark简介1.2 PySpark简介 二 基础准备2.1 PySpark库的安装2.2 构建SparkContext对象2.3 SparkContext和SparkSession2.4 构建SparkSession对象2.5 PySpark的编程模型 三 数据输入3.1 RDD对象3.2 Python数据容器转RDD对象3.3 读取文件转RDD对象…

IDEA的常用设置,让你更快速的编程

一、前言 在使用JetBrains的IntelliJ IDEA进行软件开发时&#xff0c;了解和正确配置一些常用设置是非常重要的。IDEA的强大功能和定制性使得开发过程更加高效和舒适。 在本文中&#xff0c;我们将介绍一些常用的IDEA设置&#xff0c;帮助您更好地利用IDEA进行开发。这些设置包…

Java面向对象——封装以及this关键字

封 装 封装是面向对象编程&#xff08;OOP&#xff09;的三大特性之一&#xff0c;它将数据和操作数据的方法组合在一个单元内部&#xff0c;并对外部隐藏其具体实现细节。在Java中&#xff0c;封装是通过类的访问控制修饰符&#xff08;如 private、protected、public&#x…

Linux MQTT智能家居项目(智能家居界面布局)

文章目录 前言一、创建工程项目二、界面布局准备工作三、正式界面布局总结 前言 一、创建工程项目 1.选择工程名称和项目保存路径 2.选择QWidget 3.添加保存图片的资源文件&#xff1a; 在工程目录下添加Icon文件夹保存图片&#xff1a; 将文件放入目录中&#xff1a; …

网络层协议

网络层协议 IP协议基本概念协议头格式网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由IP协议头格式后续 在复杂的网络环境中确定一个合适的路径 IP协议 承接上文&#xff0c;TCP协议并不会直接将数据传递给对方&#xff0c;而是交付给下一层协议&#xff0c;…

音视频FAQ(三):音画不同步

摘要 本文介绍了音画不同步问题的五个因素&#xff1a;编码和封装阶段、网络传输阶段、播放器中的处理阶段、源内容产生的问题以及转码和编辑。针对这些因素&#xff0c;提出了相应的解决方案&#xff0c;如使用标准化工具、选择强大的传输协议、自适应缓冲等。此外&#xff0…

uniapp微信小程序区分正式版,开发版,体验版

小程序代码区分是正式版&#xff0c;开发版&#xff0c;还是体验版 通常正式和开发环境需要调用不同域名接口&#xff0c;发布时需要手动更换 或者有些东西不想在正式版显示&#xff0c;只在开发版体验版中显示&#xff0c;也需要去手动隐藏 官方没有明确给出判断环境的方法&a…

SciencePub学术 | CCF推荐重点计算机SCIE征稿中

SciencePub学术 刊源推荐: CCF推荐重点计算机SCIE征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; CCF推荐重点SCIE简介 【期刊简介】IF&#xff1a;4.0&#xff0c;JCR2区&#xff0c;中科院3区&#xff1b; 【版面类型】正刊&#…

Swift 基础

工程目录 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 点击下载代码&#xff1a;swift-01

记录一下基于jeecg-boot3.0的待办消息移植记录

因为之前没有记录&#xff0c;所以还要看代码进行寻找&#xff0c;比较费劲&#xff0c;所以今天记录一下&#xff1a; 1、后端 SysAnnouncementController 下面函数增加待办的几个显示内容给前端用 具体代码如下&#xff1a; /*** 功能&#xff1a;补充用户数据&#xff0c…