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

    文章

    5590

    浏览量

    129086
  • vhdl
    +关注

    关注

    30

    文章

    820

    浏览量

    131349

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么我选择VHDL入门

    在群里交流提问的时候,大家总是惊讶并疑惑:为什么我要选择 VHDL入门?因为好像 99% 搞 FPGA 开发的人都在用 Verilog。 我的选择,是通过网上搜索的讨论而做出的,为了留存,我这里水一
    的头像 发表于 06-25 11:18 893次阅读
    为什么我选择<b class='flag-5'>VHDL</b>入门

    优先编码器:高效数据选择与编码的解决方案

    在现代数字电路设计中,数据的选择与编码是不可或缺的重要环节。面对众多输入信号,如何高效地选择并编码所需数据,成为设计师们面临的一大挑战。优先编码器,作为一种独特的数字电路组件,凭借其高效、灵活的特点
    的头像 发表于 03-25 08:33 863次阅读

    伺服电机编码器怎么选型

    伺服电机编码器的选型是一个综合性的过程,需要考虑多个因素以确保所选编码器能够满足系统的性能要求。以下是一些关键的选型步骤和考虑因素: 一、明确应用需求 首先,需要明确伺服电机编码器的应用需求,包括
    的头像 发表于 03-11 12:01 1470次阅读
    伺服电机<b class='flag-5'>编码</b>器怎么选型

    从步进电机到智能系统,编码器究竟如何选择?

    从步进电机到智能系统,编码器的选择是一个关键决策,它直接影响到系统的性能和精度。以下是一些关于如何选择编码器的建议: 一、明确应用场景和需求 首先,需要明确编码器的应用场景和需求。不同
    的头像 发表于 03-05 07:34 958次阅读
    从步进电机到智能系统,<b class='flag-5'>编码</b>器究竟如何选择?

    DISCOAA编码器类型功能

    DISCOAA编码器可能包括绝对编码器和增量编码器两种类型,其主要功能是将输入信号进行分析和处理,并将其转换为数字信号 ‌。 关于类型,虽然搜索结果中并未直接提及DISCOAA
    的头像 发表于 02-20 13:47 673次阅读

    AN90034用于功率MOSFETs的SPICE和VHDL-AMS中的Nexperia精密电热模型

    电子发烧友网站提供《AN90034用于功率MOSFETs的SPICE和VHDL-AMS中的Nexperia精密电热模型.pdf》资料免费下载
    发表于 02-19 15:43 1次下载
    AN90034用于功率MOSFETs的SPICE和<b class='flag-5'>VHDL</b>-AMS中的Nexperia精密电热模型

    浅谈Verilog和VHDL的区别

    Verilog和VHDL是两种广泛使用的硬件描述语言(HDL),它们用于描述和模拟数字电路系统的行为和结构。这两种语言的主要作用是帮助工程师设计、仿真和验证集成电路(IC)和系统级芯片(SoC)中的硬件模块。
    的头像 发表于 02-17 14:20 2640次阅读
    浅谈Verilog和<b class='flag-5'>VHDL</b>的区别

    用于功率MOSFET的SPICE和VHDL-AMS精密电热模型

    电子发烧友网站提供《用于功率MOSFET的SPICE和VHDL-AMS精密电热模型.pdf》资料免费下载
    发表于 02-12 15:15 2次下载
    用于功率MOSFET的SPICE和<b class='flag-5'>VHDL</b>-AMS精密电热模型

    ADS1298负数的编码,应该怎么处理?

    由于是送到TFT屏上显示,没做过负的显示。ADS1298是24位,而常见的都是32和16位,我要同时显示正负数,关于负数的编码,应该怎么处理?
    发表于 02-12 07:59

    信道编码和信源编码的区别

    信道编码和信源编码是数字通信系统中两个至关重要的环节,它们各自承担着不同的功能和角色。
    的头像 发表于 01-29 16:29 2901次阅读

    伺服电机编码器故障及维修

    伺服电机编码器故障及维修,伺服电机编码器4大常见故障,编码器信号丢失或不稳定,编码器零点偏移,编码器过热,
    的头像 发表于 01-21 14:49 4038次阅读
    伺服电机<b class='flag-5'>编码</b>器故障及维修

    SMT元器件的编码与识别

    随着电子技术的快速发展,SMT因其高密度、高性能、低成本等优势在电子制造领域占据了主导地位。在SMT生产过程中,元器件的正确编码与识别对于保证生产效率和产品质量至关重要。 1. SMT元器件编码规则
    的头像 发表于 01-10 18:01 2746次阅读

    MT-HIL(4):如何在Simulink下使用HDL Coder导出FPGA/VHDL代码

    vhdl
    芒果树数字
    发布于 :2025年01月10日 17:22:17

    bcd编码的优缺点 bcd编码的常见错误

    BCD(Binary-Coded Decimal)编码是一种二进制编码方式,用于将十进制数(0-9)直接转换为二进制形式。这种编码方式在数字系统中非常常见,尤其是在需要处理数字数据的硬件和软件中
    的头像 发表于 12-20 17:17 2391次阅读

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

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