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。这些只是自己的意见,大家可以做一个参考,有不对的地方也欢迎批评指正。

审核编辑 :李倩

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

    关注

    30

    文章

    5028

    浏览量

    117712
  • vhdl
    +关注

    关注

    30

    文章

    815

    浏览量

    127683

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

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

收藏 人收藏

    评论

    相关推荐

    基于VHDL的组合逻辑设计

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

    哈夫曼编码怎么算 哈夫曼编码左边是0还是1

    哈夫曼编码是一种基于频率的变长编码方式,常用于数据压缩和信息传输领域。它是由美国数学家大卫·哈夫曼在1952年发明的,被广泛应用于无损压缩领域。 哈夫曼编码算法的基本思想是根据字符出现的频率构建一棵
    的头像 发表于 01-30 11:27 528次阅读

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

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

    开源VHDL验证方法 (OSVVM)

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

    例说Verilog HDL和VHDL区别

    Verilog和VHDL之间的区别将在本文中通过示例进行详细说明。对优点和缺点的Verilog和VHDL进行了讨论。
    的头像 发表于 12-20 09:03 649次阅读
    例说Verilog HDL和<b class='flag-5'>VHDL</b>区别

    编码器的应用有哪些?编码器的五个主要特性

    旋转式编码器可以精确地测量旋转运动。它们通常收集关于绕旋转轴运动变化的信息。尽管它们非常精确。然而,在为发动机选择正确的编码时,技术工程师需要考虑对发动机性能影响最大的编码器的五个主要
    发表于 11-20 17:46 476次阅读

    基于VHDL的全数字锁相环的设计

    电子发烧友网站提供《基于VHDL的全数字锁相环的设计.pdf》资料免费下载
    发表于 11-10 09:47 0次下载
    基于<b class='flag-5'>VHDL</b>的全数字锁相环的设计

    基于VHDL的洗衣机控制器的设计

    电子发烧友网站提供《基于VHDL的洗衣机控制器的设计.pdf》资料免费下载
    发表于 11-07 10:28 2次下载
    基于<b class='flag-5'>VHDL</b>的洗衣机控制器的设计

    基于OpenCV的DNN图像风格迁移

    图像风格迁移已经属于比较成熟的领域了,现在连实时的风格迁移都不成问题。之前一直想出一篇这样的文章,但无奈于大部分开源项目配置起来非常麻烦,比如 luanfujun
    的头像 发表于 10-30 10:03 238次阅读

    DataFlash VHDL 模型用户手册

    DataFlash VHDL 模型用户手册
    发表于 07-04 20:44 0次下载
    DataFlash <b class='flag-5'>VHDL</b> 模型用户手册

    VHDL仲裁器开源分享

    电子发烧友网站提供《VHDL仲裁器开源分享.zip》资料免费下载
    发表于 06-13 16:23 0次下载
    <b class='flag-5'>VHDL</b>仲裁器开源分享

    PyTorch教程-14.12. 神经风格迁移

    14.12. 神经风格迁移¶ Colab [火炬]在 Colab 中打开笔记本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的头像 发表于 06-05 15:44 427次阅读
    PyTorch教程-14.12. 神经<b class='flag-5'>风格</b>迁移

    阿里AliOS的编码风格

    其实,我们身边就有很多“好的资源”值得学习,比如本文分享的 阿里 AliOS 的编码风格
    发表于 06-02 09:26 122次阅读

    Verilog编码风格的建议

    良好的编码风格,有助于代码的阅读、调试和修改。虽然 Verilog 代码可以在保证语法正确的前提下任意编写,但是潦草的编码风格往往是一锤子买卖。
    的头像 发表于 06-01 16:27 490次阅读
    Verilog<b class='flag-5'>编码</b><b class='flag-5'>风格</b>的建议

    STM32 Encoder编码器使用总结

    的Encoder接口的电机运行,相应的仿真和实验都是基于一个1024脉冲的增量式光电编码器,关于模型的建模也是基于实际的实验电机和实际的编码器。Encoder 原理实物图如下,2500P/R就是电机机械转36
    发表于 05-06 09:44 2次下载
    STM32 Encoder<b class='flag-5'>编码</b>器使用总结