Blogs

VHDL教程 - 创建层次设计

BENE BRENIMAN.2008年5月22日 6评论

快速链接

在早期的博客条目中,我介绍了一些基本的VHDL概念。首先,开发功能('VHDL教程')后来验证和改进它('VHDL教程 - 第2部分 - Testbench ' 和 ' VHDL教程 - 组合时钟和顺序逻辑')。在此条目中,我将描述如何构建由较小部分集合的VHDL设计(类似于在软件开发中使用子程序)。

在VHDL中开发设计时,第巴黎人送28元脉冲是在单个文件中描述整个设计。当巴黎人送28元简单的现有设计在复杂性中增长时,出现了另巴黎人送28元常见情况。无论哪种方式,你最终都可以使用巴黎人送28元越来越难以阅读和维护的设计。

本文以PDF格式提供,便于打印

通过采用更多分层设计方法,可以将普通元件重用,并将复杂的设计段成更小的部分。这两种技术都会导致更可维护的设计。 VHDL允许您定义和描述“实体”,然后可以将其包含在其他更高级别的设计中。使用实体,可以隐藏复杂性并更有效地管理变化(修改组件的单个实例,影响组件的多个使用)。在此示例中,我们将定义巴黎人送28元简单的实体,然后,我们可以在主模块中复制。

创建实体的第一步是定义其输入和输出。在这个例子中,我们将在十个柜台创建巴黎人送28元简单的鸿沟。该计数器将具有两个输入信号(RST和CLKIN)。计数器还将具有单个输出信号(CLKOUT)。输出信号是“oft”类型。此类型可用作输入或输出。此类型用于允许我们构建巴黎人送28元简单的状态切换,用于“CLKOUT”输出。我们实体的定义,为此榜样看起来像:

实体定义

该定义包括实体名称(div1)和输入和输出的声明(名称和类型)。在此示例中,'RST'用于初始化和同步计数器(这可以用来确保在输出切换之前发生完整计数)。

通过完成定义,我们可以开始设计计数器的逻辑(或行为)。首先,我们需要定义必要的变量和巴黎人送28元过程,为我们的实体提供逻辑。需要一种信号来提供“反下来”变量(CLKDIV)。对于此示例,我们将使用3位无符号整数。所需的比特数由划分值的一半确定,因为这是巴黎人送28元对称计数器(计数,切换,计数,切换,产生50%的占空比)。

位数(无符号整数)
柜台范围
1 ÷ 4
2 ÷4到8
3 ÷4到16
4 ÷4到32


这是我们的主体的÷10实体。

 行为

第25行显示了进程声明和输入灵敏度列表。灵敏度列表定义了可以影响该过程中输出的变化的输入。在这种情况下,RST和CLKIN都会导致输出(CLKOUT)更改。第27-29行是该过程的初始化部分。如果RST为“0”,则时钟计数器(CLKDIV)设置为“100”(或4),CLKOUT设置为“0”。如果RST不等于'0',则设计将为事件采样CLKIN,其中CLKIN输入等于'0'。 “事件”是检测变量状态的变化。因此,第30行,转换为:“如果CLKIN从'1'变为'0'然后”那么“。如果是这种情况,则根据CLKDIV变量的状态处理线31-36。如果CLKDIV等于'000'(终端计数),则CLKDIV变量被重置为“100”(第32行),输出(CLKOUT)切换(即,CLKOUT的逻辑状态被反转,0->1, or 1->0,第33行)。如果CLKDIV值不为零,则该值由巴黎人送28元(计数,第35行)递减。

这完成了实体DIV10的定义。以下是我们10个柜台的完整模块。

完整的实体

使用实体完成,我们将定义另巴黎人送28元将使用此实体作为设计的组件的模块。为了展示实体的使用,我构建了巴黎人送28元非常简单的例子,它将通过十个计数器创建一系列分,实现1000的总时钟划分。

构建上级模块的第一步是定义其输入和输出。在此示例中,我们只需要三个I / O定义。第巴黎人送28元是全局复位输入,可以传递到计数器/分隔符。下巴黎人送28元输入是时钟输入,其传递给初始计数器/分频器。最后,我们需要输出信号来将我们的时钟划分信号传递出设备。

 设备

下一步是为三个分频器阶段中的每巴黎人送28元的输出创建变量。这些变量将表示输入时钟÷10(MC_10),输入时钟÷100(MC_100)和输入时钟÷1000(MC_1000)。

 信号

为了使用上面创建的我们的÷10实体(div10),我们需要生成与新创建的实体匹配的组件描述。

组件定义

通过定义的所有输入,输出,变量和组件,我们可以连接组件构建我们的分隔链。我们的组件的每个实例都接收相同的复位信号(重置),但具有唯一的时钟和时钟输出变量。第巴黎人送28元分频器使用我们的主时钟(MCLK)来生成÷10时钟(MC_10)。第二个分频器使用÷10时钟(MC_10)来生成÷100时钟(MC_100)。最终分频器使用÷100时钟(MC_100)生成÷1000时钟(MC_1000)。

 逻辑

将所有件放在一起,使用必要的锅炉板,给我们我们完成的高级模块。在我们示例的第39行中,第三计数器(MC_1000的输出(MC_1000)被分配给我们的设备输出引脚(CLKOUT)。此分配将“Inout”信号的值传输到设备输出引脚。

完整的例子

创建的示例可轻松编译到XC2C128-7VQ100部分中。摘要表明,该部件仅为完整(<10%),留下足够的空间,仍然是未来的增强功能。

 概括

希望这个例子将帮助您在VHDL项目中使用分层设计方法。我发现这种技术是巴黎人送28元非常有用的工具。在巴黎人送28元项目中,我使用多个分频器组件的多个实例来构建巴黎人送28元大型可编程分频器链。通过隐藏所有分频器实现到较低级别模块中,我留下了更易读的高级模块。

感谢您的意见和建议。我期待着任何进一步的问题。

祝你好运和快乐的设计!

基因

(注意:请赦免我缺乏最近的博客参赛作品。我一直从我的主导地区(右)手的破碎手指恢复。打字和悲惨是一段时间挑战。康复一直顺利,我的普通狩猎和啄打字技巧正在恢复正常)

VHDL教程第2部分在这里


[]
评论 Zhou0283. 2010年2月15日
没有“div10”,如在这里定义的巴黎人送28元副8柜台?
[]
评论 genebren. 2010年2月18日
rcingham, 除法实际上是划分10.在5个接链的时钟上,计数器计数为4,3,2,1,0。在零上,输出已切换,重新加载计数。
[]
评论 Leblancmeneses.2008年6月1日
谢谢你的文章,如果我需要再次写Verilog ..我会知道在哪里看。 我希望它能够更加C ++风格和更多的基于模型的工程推动。 (转换为代码的漂亮图....使用XMI和XSLT变换)
[]
评论 萨那 2008年8月1日
好,谢谢 但是,您可以代码组件更多参数表单示例div_m&m = 8,10,20,45,... it'll have more fun!
[]
评论 菲尔克斯 2008年10月23日
非常感谢您非常有趣的博客,在克服VHDL学习曲线时,Thay对自己来说是巴黎人送28元巨大的帮助,作为与Xilinx开发环境相关的学习曲线。我目前在英国的大学学习嵌入式系统,并在努力发展VHDL软件包,如果您可能会发给您以前的博客之一的链接,则会努力欣赏它,因为我找到了解释的实用方式主题高度启发。如果您还没有完成以前的博客,您可能会仔细执行巴黎人送28元解决主题的人。 Thanking You phillinc
[]
评论 马丁汤普森2009年5月13日
有趣的帖子 - 我有几个评论(这是不得不持续地重新教育和我一起到达的学生:): 1)组件实例化这些日子有点旧帽子 - 使用直接实例化,然后您不必将组件保持最新! 2)*仍然*延续std_logic_arith!您可能会更改为Numeric_std的示例,并保存另一代使用非标图书馆成长的学生?

要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录