0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于VHDL编码风格

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-04 09:33 次阅读

挺久没有更新,今天更新一篇小文章。最近正在整理一个SDRAM控制器教程(VHDL),现在更新的小文章是想为后续的SDRAM教程以及其它比较大的教程做铺垫。本文主要讲关于VHDL编码风格(Verilog也可以用同样的思想),这篇文章的核心思想就是:设计中的所有状态都应该被明确声明在寄存器中。

这句话什么意思先不谈,直接上两段代码,第一段如下:

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.ff.all; -- 一些常用的元件包,这里面是可以自己写的

-- 这篇文章主要就调用了基本的D触发器,里面还有什么可以先忽略

entity Bad_Counter is generic( n: integer := 4 ); port( clk, rst: in std_logic;

output: buffer std_logic_vector(n-1 downto 0) );end Bad_Counter;

architecture impl of Bad_Counter issignal nxt: std_logic_vector(n-1 downto 0);begin process(clk) begin

if rising_edge(clk) then

if rst then

output 《= (others =》 ‘0’);

else

output 《= output + 1;

end if;

end if; end process;end impl;

一个4位计数器,能实现设计的功能,但其中output 《= output + 1存在一点问题,这种写法非常C语言化,这也是很多人习惯的写法。为什么说这种写法不好,因为它混淆了当前状态和下一状态。先不多解释,看下一段代码如下:

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.ff.all; -- 一些常用的元件包,这里面是可以自己写的

-- 这篇文章主要就调用了基本的D触发器,里面还有什么可以先忽略

entity Good_Counter is generic( n: integer := 4 ); port( clk, rst: in std_logic;

output: buffer std_logic_vector(n-1 downto 0) );end Good_Counter;

architecture impl of Good_Counter is signal nxt: std_logic_vector(n-1 downto 0);begin nxt 《= (others=》‘0’) when rst else output+1;

count: vDFF generic map(n) port map(clk, nxt, output);end impl;

这段代码同样的是4位计数器,为什么用这两段代码做比较,非常典型,第一段代码的思想就是C语言的思想来写的,很多人可能没有注意自己在写“数字电路”,也没有特别关注写出来的代码综合出来是什么样子。第二段代码明确表明nxt是下一状态,并且nxt是通过当前状态output得到的,这很重要,与此同时还调用了一个D触发器元件,这个D触发器为什么用,之前在异步FIFO(二)中有谈到:在实现所有的状态变量都应该被明确的声明位D触发器,不要让编译器去推断应该用什么触发器。

讲到这里,可能还是不懂这两份代码有什么具体的差别,我做了一个实验,把两份代码都综合了一遍,使用了两个不同的版本,Quartus20.3和Quartus13.1(不同版本的软件,无论是效率还是开发便捷程度还是有一定差别的)

先看Quartus13.1综合出的两份原理图

940b584a-fb2e-11ec-ba43-dac502259ad0.png

这幅原理图是第一份代码综合出来了,大概看一下没什么问题,代码也是这样写的。

再看第二份代码综合出来的原理图

9425db3e-fb2e-11ec-ba43-dac502259ad0.png

区别来了,很明显,第一份代码因为用output <= output + 1的原因,左右两端使用了相同的信号,混淆当前状态和下一状态,下一状态被隐藏起来。但第二份代码综合出来的很明显,nxt是下一状态,并且nxt是通过当前状态output得到的。当然还要个比较好的地方,第二份代码直接调用D触发器元件(在package里面写了),告诉编译器状态变量要声明为D触发器,而不是让编译器自己判断(尽管它可以)。

再看Quartus20.3综合出来的原理图

94400d92-fb2e-11ec-ba43-dac502259ad0.png

这个原理图是第一份代码Bad_Counter 综合出来的,很显然现在的EDA真行,可以把不那么优秀的代码综合出优秀代码才能综合出的原理图了。当然这是很简单代码的情况下。

945799f8-fb2e-11ec-ba43-dac502259ad0.png

这个原理图是第二份代码Good_Counter综合出来的,除了下一状态的命名和位数区间不一样外,其它的两个代码综合出来的没有区别!

小结:从上面的四幅原理图看,尽管随着EDA的发展让不那么优秀的代码综合出和优秀代码一样的原理图,但良好编码风格的代码仍然非常必要,即使是13.1和20.3巨大版本差异的情况下,良好编码风格的代码综合出来的原理图也是一样的。但在代码风格不好的情况下,13.1和20.3却有比较大的差距。人作为设计的主体,不能完全依靠EDA的优化,编译器也不是万能的,有些其它地方未必会优化的那么好,在大型复杂项目中不太好的编码风格可能编译器也未必能够给出比较好的优化,好的编码风格可以让我们更好的理解一些底层的设计,也能知道代码会如何综合。更重要的是需要知道自己数字设计师!用数字的思想去设计FPGA。这些只是自己的意见,大家可以做一个参考,有不对的地方也欢迎批评指正。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120297
  • vhdl
    +关注

    关注

    30

    文章

    817

    浏览量

    128129

原文标题:VHDL的编码风格(Verilog也可参考思想)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 Verilog :Verilog 的语法更接近于 C 语言,对于有 C 语言背景的工程师来说,学习曲线较平缓。它支持结构化编程,代码更直观,易于
    的头像 发表于 12-17 09:44 134次阅读

    FPGA编码风格介绍

    组合逻辑环路(Combinational Loops):指组合逻辑的输出信号不经过任何时序逻辑电路(FF等),而直接反馈到输入节点,从而构成的电路环路。
    的头像 发表于 11-15 10:49 214次阅读
    FPGA<b class='flag-5'>编码</b><b class='flag-5'>风格</b>介绍

    求助vhdl

    vhdl 技术
    发表于 11-13 11:35

    风华贴片电容物料编码如何看?

    风华贴片电容的物料编码规则通常包含多个部分,每个部分都代表了不同的信息。以下是关于如何解读风华贴片电容物料编码的分点表示和归纳: 1、电容数值: 编码的第一至第三位数字表示电容的数值,
    的头像 发表于 11-04 15:33 214次阅读
    风华贴片电容物料<b class='flag-5'>编码</b>如何看?

    增量编码器和绝对值编码器是什么

    工业编码器是一类传感器,是在工业自动化闭环控制和数字化转型物理感知重要的传感器。关于传感器的宣传已很多,但是对于编码器这么重要的传感器,大家的认识还是模糊的。
    的头像 发表于 10-22 14:23 312次阅读
    增量<b class='flag-5'>编码</b>器和绝对值<b class='flag-5'>编码</b>器是什么

    有没有关于PDM信号编码格式输出的IC呢?

    请教一下大家,有没有关于PDM信号编码格式输出的IC呢? 比如PCM转PDM或者I2S什么的转PDM?
    发表于 10-15 07:37

    磁电编码器和光电编码器的区别

    磁电编码器和光电编码器是两种不同类型的编码器,它们在原理、结构、性能和应用领域上都有所不同。 磁电编码器和光电编码器的区别 1. 引言
    的头像 发表于 10-12 09:54 1107次阅读

    编码器在机器人系统中的应用

    随着科技的飞速发展,机器人技术已广泛应用于工业、医疗、服务等多个领域。在机器人系统中,编码器作为核心的位置和速度检测装置,发挥着至关重要的作用。本文将从编码器的原理、分类及其在机器人系统中的应用等方面进行详细阐述,旨在为读者提供关于
    的头像 发表于 06-13 14:51 823次阅读

    Verilog到VHDL转换的经验与技巧总结

    Verilog与VHDL语法是互通且相互对应的,如何查看二者对同一硬件结构的描述,可以借助EDA工具,如Vivado,打开Vivado后它里面的语言模板后,也可以对比查看Verilog和VHDL之间的差异。
    的头像 发表于 04-28 17:47 2465次阅读
    Verilog到<b class='flag-5'>VHDL</b>转换的经验与技巧总结

    伺服编码器分辨率越高越快吗?

    。较高的分辨率意味着编码器能够提供更精确的位置或运动反馈信息。 然而,关于伺服编码器分辨率与速度之间的关系,并没有直接的等号关系。分辨率高主要代表编码器的精度和位置信息的细致程度,而速
    的头像 发表于 03-21 08:43 1050次阅读
    伺服<b class='flag-5'>编码</b>器分辨率越高越快吗?

    基于VHDL的组合逻辑设计

    电子发烧友网站提供《基于VHDL的组合逻辑设计.ppt》资料免费下载
    发表于 03-11 09:23 2次下载

    编码器好坏怎么判断,编码器原理

    编码器(Encoder)是将输入数据转化为特定编码表示的一种技术。对于不同类型的编码器,评判其好坏可以从多个方面进行考量,包括编码质量、速度、模型结构等。
    的头像 发表于 01-23 10:58 1890次阅读

    磁性编码器和光电编码器的比较

    伺服电机编码器是一种关键的反馈装置,用于测量和控制电机的转速和位置。在选择伺服电机编码器时,常常面临一个选择:使用磁电编码器还是光电编码器。接下来将从几个关键方面比较这两种类型的
    的头像 发表于 01-18 10:29 3180次阅读

    求助,关于绝对值编码器断电后移动范围的问题求解

    最近在找关于绝对值编码器的一些资料,看到了一种说法,不是很明白,想向各位请教一下。 在有些资料里提到了,当绝对值编码器的信号采集设备断电后,绝对值编码器的移动范围不能够超过量程的1/2
    发表于 01-10 08:24

    开源VHDL验证方法 (OSVVM)

    电子发烧友网站提供《开源VHDL验证方法 (OSVVM).docx》资料免费下载
    发表于 12-26 09:57 0次下载