﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-绿茶的学习生活-文章分类-VHDL语言学习</title><link>http://www.cnitblog.com/trust2001/category/7369.html</link><description>C-Linux－VHDL</description><language>zh-cn</language><lastBuildDate>Thu, 06 Oct 2011 12:49:21 GMT</lastBuildDate><pubDate>Thu, 06 Oct 2011 12:49:21 GMT</pubDate><ttl>60</ttl><item><title>VHDL-程序包及函数</title><link>http://www.cnitblog.com/trust2001/articles/46857.html</link><dc:creator>绿茶</dc:creator><author>绿茶</author><pubDate>Sun, 20 Jul 2008 07:59:00 GMT</pubDate><guid>http://www.cnitblog.com/trust2001/articles/46857.html</guid><wfw:comment>http://www.cnitblog.com/trust2001/comments/46857.html</wfw:comment><comments>http://www.cnitblog.com/trust2001/articles/46857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/trust2001/comments/commentRss/46857.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/trust2001/services/trackbacks/46857.html</trackback:ping><description><![CDATA[<p><strong>程序包</strong><br>VHDL引入程序包的结构，使一些通用的对象、数据类型及子程序能被其他程序的实体共同使用<br>一个程序包由两大部分组成：程序包说明和程序包体。程序包体是一个可选项一般情况，程序包说明列出所有项的名称，而程序包体给出各项的细节。<br><br>程序包说明<br>通常的常量、信号数据类型及子类型的数据范围、函数和过程等说明的集合，称程序包说明。<br>下述内容中只要是通用的全局量，都可以在程序包中加以说明。<br>对象（常量、变量、信号）的数据类型说明<br>对象（常量、变量、信号）子类型的数值范围说明<br>函数与过程说明<br>元件语句说明<br>信号连接说明<br>延时常量说明<br>文件说明<br>设计者自定义的属性说明<br><br>程序包说明格式如下：<br><strong>package 程序包名 is<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明语句；<br>end&nbsp;&nbsp;&nbsp; 程序包名；<br></strong>程序包名：设计者自定义便于记忆的标识符<br>说明语句：包括各种类型的说明语句<br><br>程序包体<br>描述函数和过程功能的函数体与过程等的集合称程序包体<br>程序包说明中，定义了数据类型和子程序中的函数、过程说明，而程序包体中才具体地描述该函数、过程功能的语句和数据的赋值。<br>程序包体格式：<br><strong>package body 程序包名 is<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺序语句；<br>end 程序包名；</strong><br>程序包名：与程序包说明中的程序包名相同<br>顺序语句：描述函数、过程及其他功能的程序流<br><br>子程序——过程<br>VHDL中，所谓子程序指主程序调用它后能将处理结果返回主程序的程序模块。<br>VHDL语言中，子程序有两种类型，过程（procedure）和函数（function）。<br>他们的区别：<br>1、过程可具有多个返回值，而函数只能有一个<br>2、过程通常用来定义一个算法，而函数往往用来产生一个特定的值<br>3、过程中的参数可具有3种端口模式：in、out、inout，而函数中的参数只能具有一直端口模式：in<br>&nbsp;<br>过程的书写结构<br>对于VHDL子程序来说，它通常包括子程序说明部分和子程序定义部分。<br>其中，子程序说明部分定义了其他设计调用子程序的接口；子程序定义部分则描述该子程序具体功能的实现。<br>因此，通常将子程序说明部分和子程序定义部分的书写结构分别介绍<br></p>
<p>在VHDL中，过程说明部分的书写结构：<br><strong>procedure：过程名<br>（对象类型1 参数名1： 端口模式1 数据类型1；<br>&nbsp;&nbsp;&nbsp; 对象类型2 参数名2： 端口模式2 数据类型2；......）；</strong><br>过程说明部分以保留字&#8220;procedure&#8221;开始，紧跟着的是过程名；然后是过程的参数列表。参数列表中的每个参数包括它的对象类型、参数名、端口模式及数据类型，其中对象类型、端口模式是可选项。<br></p>
<p>在VHDL语言中，过程定义部分<br><strong>procedure 过程名<br>（对象类型1 参数名1： 端口模式1 数据类型1；<br>&nbsp;&nbsp;&nbsp; 对象类型2 参数名2： 端口模式2 数据类型2；......）is<br>&nbsp;&nbsp; 过程说明部分；<br>begin<br>&nbsp; 过程顺序语句部分；<br>end 过程名；</strong></p>
<p>可以看出，过程定义部分仍以保留字&#8220;procedure&#8221;开始，紧跟其后的是过程名；接下来是过程参数列表；然后以保留字&#8220;is&#8221;开始过程的说明部分，它主要是对过程中要用到的变量、常量和数据类型进行说明，并且说明只对该过程可见；接下来是以保留字&#8220;begin&#8221;开始的顺序语句部分，用来描述过程的具体功能；最后以&#8220;end&#8221;结尾。<br><br>参数列表中：每个参数包括它的对象类型、参数名、端口模式以及数据类型<br>参数的对象类型包括：常量、信号、变量<br>参数名是用来表示参数的唯一标识<br>端口模式：包括in、out、inout<br>若过程中没有指明参数的对象类型，那么参数的对象类型将默认为一个变量<br><br><strong>过程定义在程序包中的定义规则为：过程说明部分书写在程序包的说明部分，过程定义部分书写在程序包体部分<br><br>过程定义在结构体中：即将过程定义部分书写在结构体的说明部分，然后在结构体进程语句里调用<br><br>函数</strong></p>
函数包括：函数说明部分和函数定义部分<br>函数说明部分定义了主程序调用函数的接口<br>函数定义部分描述了该函数具体逻辑功能的实现<br>函数的书写结构<br><strong>function 函数名<br>（对象类型1 参数名1； in 数据类型1；<br>&nbsp;&nbsp;&nbsp;对象类型2&nbsp; 参数名2；&nbsp; in 数据类型2；......） return 数据类型；</strong><br>其中对象类型和端口模式in是可选项<br><br>函数定义部分书写结构<br><strong>function 函数名<br>（对象类型1 参数名1； in 数据类型1；<br>&nbsp;&nbsp;&nbsp;对象类型2&nbsp; 参数名2；&nbsp; in 数据类型2；......） return 数据类型 is<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数说明部分：<br>begin <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数顺序语句部分；<br>return（参数值）；<br>end 函数名；</strong><br>函数参数的对象类型只能包括常量和信号：参数的端口模式只能是in，因此参数端口模式可以省略。<br>函数的返回值只能有一个。<br><br>函数定义在程序包中：函数说明部分书写在程序包说明部分，函数定义部分书写在程序包体部分。如果需要使用程序包中定义的函数，那么只需要通过use语句使其对设计实体可见。<br><br>函数定义在结构体中：只需将函数定义部分书写在结构体说明部分即可。然后在结构体中调用这个函数。<br><br>
<img src ="http://www.cnitblog.com/trust2001/aggbug/46857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/trust2001/" target="_blank">绿茶</a> 2008-07-20 15:59 <a href="http://www.cnitblog.com/trust2001/articles/46857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VHDL的基本语句-顺序描述语句</title><link>http://www.cnitblog.com/trust2001/articles/46415.html</link><dc:creator>绿茶</dc:creator><author>绿茶</author><pubDate>Thu, 17 Jul 2008 13:59:00 GMT</pubDate><guid>http://www.cnitblog.com/trust2001/articles/46415.html</guid><wfw:comment>http://www.cnitblog.com/trust2001/comments/46415.html</wfw:comment><comments>http://www.cnitblog.com/trust2001/articles/46415.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/trust2001/comments/commentRss/46415.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/trust2001/services/trackbacks/46415.html</trackback:ping><description><![CDATA[<p>顺序描述语句<br>信号赋值语句和变量赋值语句<br>目标信号&lt;=表达式；<br>目标变量：=表达式；<br>信号的说明只能在VHDL语言程序的并行部分进行说明（如在结构体的说明部分），但可以在VHDL语言的并行和顺序不愤怒同时使用。<br>变量说明和赋值语句只能在VHDL的顺序部分进行说明和使用，即只能出现在进程、过程和函数中<br>信号赋值和变量赋值语句有一定相似性，但不同点也是有的：对信号赋值语句来说，信号赋值的执行和信号的更新至少有delta的延时，否则保持原状态；对于变量赋值语句来说，变量赋值语句执行后立即得到新值。<br><br>条件语句<br>if语句<br>在VHDL语言中，if语句是具有条件控制功能的语句，它根据制定的条件及其条件是否成立来确定语句的执行顺序。<br>if语句格式：<br><strong>if 条件1 then<br>&nbsp;&nbsp;&nbsp; 第一组顺序语句；<br>elseif 条件2 then<br>&nbsp;&nbsp;&nbsp;&nbsp;第二组顺序语句；<br>elseif 条件n then<br>&nbsp;&nbsp;&nbsp;&nbsp;第n组顺序语句；<br>esle 第n+1组顺序语句；<br>end if；<br></strong><br>if语句的每个条件都是一个布尔表达式，返回值为布尔型。每个分支可以有一个或多个顺序语句。<br><br>if条件的另外两种形式：<br>（1）<br><strong>if 条件 then<br>&nbsp;&nbsp;&nbsp;顺序语句；<br>end if；</strong><br><br>（2）<br><strong>if 条件 then<br>&nbsp;&nbsp; 顺序语句；<br>else&nbsp;<br>&nbsp;&nbsp;&nbsp;顺序语句；<br>end if；<br></strong><br>case语句<br>case语句是根据条件表达式的值执行由符号&#8220;=&gt;&#8221;所指的一组顺序语句。<br>case语句语法：<br><br>case 条件表达式 is<br>&nbsp;&nbsp;&nbsp;&nbsp;when 条件表达式的值 =&gt;一组顺序语句；<br>&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;when 条件表达式的值 =&gt;一组顺序语句；<br>&nbsp;&nbsp;&nbsp; when others =&gt;一组顺序语句；<br>end case；<br><br>if条件是有序的，先处理最起始、最有限的条件，后处理次优先的条件。<br>case语句是无序的，所有条件表达式的值都并行处理。<br>case语句中条件表达式的值必须列举穷尽，又不能重复，不能穷尽的条件表达式的值用others表示<br><br>循环控制语句<br>loop语句<br>loop语句使用程序进行有规则的循环，循环次数由迭代算法或其他数据<br>for loop循环语句<br>for loop循环，是loop循环语句的一种基本形式，执行有限次循环。格式如下：<br><strong>循环标号：for 循环变量 in 范围 loop<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺序处理语句；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop 循环标号；<br></strong>循环标号：for loop 循环语句的标识符。<br>循环变量：整数变量，循环变量的值在每次循环中都发生变化。循环变量不需另加说明，在循环体中可读不可写。<br>范围：离散范围，是循环变量在循环过程中依次取值的范围，实际上限制了循环次数。<br>顺序处理语句：循环体，是一组顺序语句。<br>for loop循环执行时，该循环变量从指定变量范围内每取一个之进行一次循环，取完范围内全部指定值，结束循环。<br><br>while loop循环语句<br>while loop循环是loop循环的另外一种形式<br>循环标号：while 条件表达式 loop <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺序处理语句<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop 循环标号；<br>循环标号用来作为该while loop循环语句的标识符。<br>while后面的条件表达式是布尔表达式。while loop循环语句在每次执行前要先检查条件表达式的值，当条件表达式的值为true时，就执行循环体中的顺序处理语句，执行完毕好返回到该循环的开始，然后再次检查条件表达式的值；若表达式值为false，那么结束循环并转而执行while loop后的语句。<br><br>next跳出循环语句<br>在loop中，next语句用于跳出本次循环，转入下次循环，并重新开始。<br>next 循环标号 when 条件表达式；<br>其中循环标号用来表明结束本次循环后下一次循环的起始位置；<br>条件表达式的值为布尔量，是跳出本次循环的条件，条件表达式的值为真时，跳出本次循环<br>循环标号和条件表达式是可选项。当next后无循环标号和条件表达式时，要执行到该语句就立即无条件跳出本次循环，从loop语句的起始位置进入下一次循环。<br><br>exit退出循环语句<br>在loop中，exit语句在循环体内用来描述退出循环并结束循环这一功能。<br>exit 循环标号 when 条件表达式；<br>when后的条件表达式是布尔表达式，exit退出循环语句在条件表达式为真时，退出循环标号指定的循环体。<br>exit退出循环语句when后面的条件表达式可以缺少，成为无条件退出循环语句<br>exit 循环标号；<br>当遇到无条件退出循环语句时，立即从循环标号指明的循环体中退出<br><br>exit退出循环语句后的循环标号也可缺少，成为默认无条件退出循环语句时，立即从exit所在的循环体中退出。<br>exit<br><br>null语句<br>在VHDL语言中，null表示一种站空操作，它不进行任何操作，执行该语句只是使VHDL语言程序去执行下一个语句。<br>语法简单：<strong>null；</strong>即可<br>null常出现在case中，它用来表示case语句中所剩余的条件选择值下的操作行为，从而能够满足case语句对条件选择值全部列举的要求<br></p>
<img src ="http://www.cnitblog.com/trust2001/aggbug/46415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/trust2001/" target="_blank">绿茶</a> 2008-07-17 21:59 <a href="http://www.cnitblog.com/trust2001/articles/46415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VHDL的基本语句-并行描述语句</title><link>http://www.cnitblog.com/trust2001/articles/46590.html</link><dc:creator>绿茶</dc:creator><author>绿茶</author><pubDate>Thu, 17 Jul 2008 13:55:00 GMT</pubDate><guid>http://www.cnitblog.com/trust2001/articles/46590.html</guid><wfw:comment>http://www.cnitblog.com/trust2001/comments/46590.html</wfw:comment><comments>http://www.cnitblog.com/trust2001/articles/46590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/trust2001/comments/commentRss/46590.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/trust2001/services/trackbacks/46590.html</trackback:ping><description><![CDATA[VHDL的并行语句用来描述一组并发行为，它是并发执行的，与程序的书写顺序无关。<br><br><em>进程语句</em><br>进程语句包含在结构体中，一个结构体可以有多个进程语句，多个进程语句间是并行的，并可访问结构体或实体中定义的信号。因此进程语句称为并行描述语句。<br><br>进行语句结构内部所有语句都是顺序执行的<br>进程语句的启动是由process后敏感信号表中所标明的敏感信号触发来的。<br>各进程间的通信是由信号来传递的<br>语法如下：<br><strong>标记：process（敏感信号表）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量说明语句；<br>begin <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一组顺序语句；<br>end process 标记；<br></strong><br>标记：为进程标号<br>敏感信号表：是进程用来读取所有敏感信号（包括端口）的列表。<br>变量说明：主要包括变量的数据类型说明、子程序说明等<br>从begin到end process之间是一组顺序执行语句。<br><br><em>敏感信号表<br></em>所谓敏感信号表：就是用来存放敏感信号的列表。在进程语句中，敏感信号指那些发生改变后能引起进程语句执行的信号。敏感信号表中可以使用一个或多个信号，当其中一个或多个信号值改变时，就在进程内部引起语句执行。敏感信号表也可忽略，但程序中必须有其他形式的敏感信号激励。例如wait、wait for、wait until和wait on。<br><br><em>进程语句的启动<br></em>在VHDL语言中，进程有两种工作状态：等待和执行。当敏感信号表中的信号没有变化时，进程处于等待状态；当敏感信号表中的信号有变化时，进程处于执行状态<br>进程语句的同步<br>同一个结构体中不仅可以有多个进程存在，同一个结构体中的多个进程还可以同步。VHDL中通常采用时钟信号来同步进程，具体方法是：结构体中的几个进程共用同一个时钟信号来进行激励。<br><br><em>并发信号赋值语句<br></em>信号赋值语句在进程内部出现时，它是一种顺序描述语句。信号赋值语句在结构体的进程之外出现时，它将以一种并发语句的形式出现。它们在结构体中是并行执行的。需要注意的是，并发信号赋值语句是靠事件来驱动的，因此对于并发信号赋值语句来说，只有当赋值符号&#8220;&lt;=&#8221;右边的对象有事件发生时才会执行该语句。<br><br><em>条件信号赋值语句</em><br>语法结构：<br><strong>目标信号&lt;=表达式1 when 条件1 else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表达式2 when 条件2 else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表达式3 when 条件3 else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表达式n-1 when 条件n-1 else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表达式n；</strong><br>VHDL语言程序执行到该语句时，首先要进行条件判断，之后才进行信号赋值。如果满足条件，就将该条件前面那个表达式的值赋给目标信号；如果不满足条件按，就继续判断，直到最后一个表达式，如果前面的条件均不满足就无条件的赋值给最后一个表达式，因为最后一个表达式赋值无需条件。<br><br><em>选择信号赋值语句<br></em>语法结构：<br><strong>with 表达式 select<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标信号&lt;=表达式1 when 选择条件1，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表达式2 when 选择条件2，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表达式n when 选择条件n；</strong><br>该语句在赋值之前需要对条件进行判断，附和条件则赋值，否则继续判断，直到最后一个语句。选择赋值语句需要把表达式的值在条件中都列举出来。<br><br><em>元件例化语句</em><br>在VHDL中，引用元件或者模块的说明采用component语句，他的作用是在结构体说明部分说明引用的元件或者模块，是元件说明语句。<br>语法格式：<br><strong>component 引用的元件名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; generic 参数说明；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prot 端口说明；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end componet；<br></strong>引用的元件名：是将一个设计现成的实体定义为一个元件，是已经设计好的实体名，用来制定要在结构体中使用的元件名称<br>如果结构体中要进行参数的传递，那么component语句中需要类属参数说明，是可选项；<br>引用元件端口的说明，是已经设计好的实体端口名表；<br>元件说明语句在architecture和begin之间。<br><br><em>元件例化语句<br></em>采用componet语句对要引用的原件进行说明后，为了引用的元件正确地嵌入到高一层的结构体描述中，就必须把被引用的元件端口信号于结构体中相应端口信号正确地连接起来，这就是元件例化语句要实现的功能。<br>语法结构：<br><strong>标号名：元件名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; generic map（参数映射）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot map（端口映射）；</strong><br>其中标号：是元件例化语句的惟一标识，结构体中的标号名应该是惟一的<br>generic map语句：它的功能是实现对参数的赋值操作，从而可以灵活地改变引用元件的参数，为可选项<br>prot map：它的功能是把引用元件的端口信号与实际连接的信号对应起来，从而进行元件的引用操作。<br>VHDL中，为了实现引用元件的端口信号与结构体中的实际信号相连接，往往采用两种映射方法：<br>1、位置映射方法：指port map语句中实际信号的书写顺序于componet语句中端口说明的信号书写语句顺序一致<br>2、名称映射方法：指在port map中将引用的元件的端口信号名称赋值给结构体中要使用例化元件的各个信号<br>（名称映射语句的书写要求不是十分严格，只要把映射的对应信号连接起来就可以，顺序可以颠倒）。<br><br><em>生成语句</em><br>规则结构<br>某些电路部分是由同类元件组成的阵列，这些同类元件叫规则结构，例如：随机RAM、只读ROM、移位寄存器等规则结构一般用生成语句来描述。<br>生成语句有两种形式：for_generate和if_generate<br>for_generate主要用来描述规则<br>if_generate主要用来描述结构在其端部表现出的不规则性，例如边界条件的特殊性<br>for_generate语句<br><strong>标号：for 循环变量 in 离散范围 generate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并行处理语句；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end generate 标号；</strong><br>标号：用来作为for_generate语句的唯一标识符，可选项；<br>循环变量：它的值在每次循环中都将发生变化；<br>离散范围：用来指定循环变量的取值范围，循环变量的取值将从取值范围最左边的值开始并且递增到取值范围的最右边，实际上限定了循环次数<br>for_generate与for_loop语句很类似，但二者有区别。for_loop语句的循环体中的处理语句是顺序的，而for_generate语句中处理的语句是并行处理的，具有并发性。<br><br><strong>if_generate语句<br>标号：if 条件 generate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并行处理语句；<br>end generate 标号；<br></strong>if_generate语句是并行处理语句，其中不允许出现else子语句<br><br>
<img src ="http://www.cnitblog.com/trust2001/aggbug/46590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/trust2001/" target="_blank">绿茶</a> 2008-07-17 21:55 <a href="http://www.cnitblog.com/trust2001/articles/46590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VHDL语言的表达式</title><link>http://www.cnitblog.com/trust2001/articles/46327.html</link><dc:creator>绿茶</dc:creator><author>绿茶</author><pubDate>Sat, 05 Jul 2008 08:50:00 GMT</pubDate><guid>http://www.cnitblog.com/trust2001/articles/46327.html</guid><wfw:comment>http://www.cnitblog.com/trust2001/comments/46327.html</wfw:comment><comments>http://www.cnitblog.com/trust2001/articles/46327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/trust2001/comments/commentRss/46327.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/trust2001/services/trackbacks/46327.html</trackback:ping><description><![CDATA[在VHDL中，表达式是通过不同的操作符连接多个操作完成的。<br>VHDL语言的操作符由：逻辑运算符、关系运算符、算术运算符。针对不同的数据对象，操作符的使用也不尽相同。<br><br>逻辑运算符<br>在VHDL中，逻辑运算符共6种：<br>NOT--取反；&nbsp; AND--与；&nbsp; OR--或； <br>NAND--与非；&nbsp; NOR--或非；&nbsp; XOR--异或；<br>适合逻辑运算符的变量有：std-logic、bit、std-logic-vector<br>对bit进行操作时，是按位操作的<br><br>算数运算符<br>+、-、*、/；<br>MOD--求模运算；&nbsp; REM--取余运算；&nbsp; +--正；&nbsp; -&nbsp; --负；&nbsp; **--指数运算；&nbsp; ABS--取绝对值；<br><br>关系运算符<br>=等于；/=不等于；&lt;小于；&lt;=小于等于；&gt;大于；=&gt;大于等于<br><br>并置运算符<br>并置运算符号&#8220;&amp;&#8221;用于位连接。<br>使用规则：<br>1、并置运算符可用于位的连接，形成位矢量<br>2、并置运算符可用于两个位矢量的连接，以构成更大的位矢量<br>eg：<br>signal a,b,c:bit;<br>signal x,y:bit_vector(2 downto 0);<br>z&lt;=a%b&amp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --z是3位的位矢量<br>w&lt;=x&amp;y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --w是6位的位矢量<br><br>操作符的优先级<br>
<table style="WIDTH: 320px; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td>运算操作符类型&nbsp;&nbsp;</td>
            <td>操作符</td>
            <td>含义</td>
        </tr>
        <tr>
            <td rowSpan=7>乘除运算</td>
            <td>NOT</td>
            <td>取反</td>
        </tr>
        <tr>
            <td>ABS</td>
            <td>取绝对值</td>
        </tr>
        <tr>
            <td>**</td>
            <td>取幂</td>
        </tr>
        <tr>
            <td>*</td>
            <td>乘</td>
        </tr>
        <tr>
            <td>/</td>
            <td>除</td>
        </tr>
        <tr>
            <td>MOD</td>
            <td>取模</td>
        </tr>
        <tr>
            <td>REM</td>
            <td>取余</td>
        </tr>
        <tr>
            <td rowSpan=2>一元正负运算</td>
            <td>+</td>
            <td>正</td>
        </tr>
        <tr>
            <td>-</td>
            <td>负</td>
        </tr>
        <tr>
            <td rowSpan=3>加、减、合并运算</td>
            <td>+</td>
            <td>加</td>
        </tr>
        <tr>
            <td>-</td>
            <td>减</td>
        </tr>
        <tr>
            <td>&amp;</td>
            <td>合并</td>
        </tr>
        <tr>
            <td rowSpan=6>关系运算</td>
            <td>=</td>
            <td>相等</td>
        </tr>
        <tr>
            <td>/=</td>
            <td>不相等</td>
        </tr>
        <tr>
            <td>&lt;</td>
            <td>小于</td>
        </tr>
        <tr>
            <td>&lt;=</td>
            <td>小于等于</td>
        </tr>
        <tr>
            <td>&gt;</td>
            <td>大于</td>
        </tr>
        <tr>
            <td>=&gt;</td>
            <td>大于等于</td>
        </tr>
        <tr>
            <td rowSpan=5>逻辑运算</td>
            <td>AND </td>
            <td>逻辑与</td>
        </tr>
        <tr>
            <td>OR</td>
            <td>逻辑或</td>
        </tr>
        <tr>
            <td>NAND</td>
            <td>逻辑与非</td>
        </tr>
        <tr>
            <td>NOR</td>
            <td>逻辑或非</td>
        </tr>
        <tr>
            <td>XOR</td>
            <td>逻辑异或</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/trust2001/aggbug/46327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/trust2001/" target="_blank">绿茶</a> 2008-07-05 16:50 <a href="http://www.cnitblog.com/trust2001/articles/46327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VHDL语言中的数据</title><link>http://www.cnitblog.com/trust2001/articles/46321.html</link><dc:creator>绿茶</dc:creator><author>绿茶</author><pubDate>Sat, 05 Jul 2008 04:32:00 GMT</pubDate><guid>http://www.cnitblog.com/trust2001/articles/46321.html</guid><wfw:comment>http://www.cnitblog.com/trust2001/comments/46321.html</wfw:comment><comments>http://www.cnitblog.com/trust2001/articles/46321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/trust2001/comments/commentRss/46321.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/trust2001/services/trackbacks/46321.html</trackback:ping><description><![CDATA[一、基本标识符<br>VHDL中，基本标识符有：&#8220;A-Z&#8221;，&#8220;a-z&#8221;，&#8220;0-9&#8221;以及&#8220;_"VHDL不区分大小写。标识符必须以字母开头，不能以下划线结尾，不能出现连续两个或多个下划线。<br><br>##########################################################################################<br><br>二、数据对象<br>数据对象可看做数值的载体，有三种形式的对象：常量，变量，信号<br>常量声明格式：<br>constant 常数名： 数据类型：=表达式<br>constant vcc:real:=3.1&nbsp; --常数名vcc，数据类型real，赋初始值为3.1<br><br>变量声明格式：<br>variable 变量名：数据类型：=初始值、表达式<br>variable temperature:std_logic:='0'&nbsp;&nbsp; --变量名temperature，数据类型std_logic，初始值为0<br>a(3 to6):=('1','1','1','0');&nbsp;&nbsp; --段赋值<br>a(7):='0'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --位赋值<br><br>信号：信号是电子电路内部硬件连接的抽象，可以将结构体中分离的并行语句连接起来，并能通过端口于其他模块连接。信号可以随时间改变，不像变量赋值，立即生效，允许产生时延。<br><span style="COLOR: red">信号通常在实体(entity）、结构体和程序包中使用，但不能在进程中说名。<br><span style="COLOR: #000000">对信号赋值使用符号&#8220;&lt;="号，允许产生时延（一般用delta表示延时），这和实际原件的传输延时特性吻合。<br>信号声明格式：<br>signal 信号名：数据类型：=初始值<br>signal a:bit:='0'&nbsp; --信号名a，数据类型是位数据，初值为0<br>注：赋值符号&#8220;：=与&lt;=&#8221;的不同在于，：=赋值后，会立即生效，而不产生延时。<br>信号可以赋初始值，也可不赋。即取默认值，指定数据类型的最左值例如：<br>signal INIT:bit_vector(7 downto 0);&nbsp;&nbsp;&nbsp; --定义信号INIT是位矢量<br>signal c:integer range 0 to 15;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--定义信号c的数据类型是整数类型，整数范围0-15<br>signal y,x:real;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--定义信号y、x数据为实数<br>y&lt;=x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--经过delta延时后将x值赋给y&nbsp;&nbsp;&nbsp;<br><br>#####################################################################################<br><br>三、数据类型<br>标准数据类型<br>常见的数据类型共有10种：<br>&nbsp;&nbsp;
<table style="WIDTH: 320px; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td>数据类型&nbsp;&nbsp;&nbsp;</td>
            <td>含义</td>
            <td>备注</td>
            <td>eg.</td>
        </tr>
        <tr>
            <td>整数&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
            <td>integer</td>
            <td>+125，-345</td>
        </tr>
        <tr>
            <td>实数</td>
            <td>实数范围-1.0E38-1.0E38</td>
            <td>real</td>
            <td>1.0，——2.5e23</td>
        </tr>
        <tr>
            <td>位</td>
            <td>逻辑0或1</td>
            <td>bit</td>
            <td>&#8216;1&#8217;，&#8216;0&#8217;</td>
        </tr>
        <tr>
            <td>位矢量</td>
            <td>位矢量</td>
            <td>bit_vector（双括号括起来）</td>
            <td>&#8220;0110&#8221;</td>
        </tr>
        <tr>
            <td>布尔矢量</td>
            <td>逻辑真或假</td>
            <td>
            <p>boolean（只有true和false）</p>
            </td>
            <td></td>
        </tr>
        <tr>
            <td>字符</td>
            <td>ASCII字符</td>
            <td>character</td>
            <td>&#8216;a&#8217;</td>
        </tr>
        <tr>
            <td>时间</td>
            <td>整数和时间单位</td>
            <td>
            <p>time，fs，ps，ns，us，ms，sec，min，hr</p>
            <p>time，fs，ps，ns，us，ms，sec，min，hr</p>
            </td>
            <td>20us</td>
        </tr>
        <tr>
            <td>错误等级</td>
            <td>VHDL程序在编译、仿真、综合过程的工作状态</td>
            <td>severitylevel notewarning，errorfailure</td>
            <td>note，warning可以忽略，error，failure不可忽略</td>
        </tr>
        <tr>
            <td>自然数、正整数</td>
            <td>整数的子集</td>
            <td>natural，positive</td>
            <td></td>
        </tr>
        <tr>
            <td>字符串</td>
            <td>字符矢量</td>
            <td>string双引号括起来的字符序列</td>
            <td>&#8220;start&#8221;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>用户自定义数据类型<br>VHDL允许用户自定义数据类型<br>定义格式：<br>type 数据类型名称 is 数据类型定义；<br>VHDL常用的用户自定义类型包括枚举类型，整数类型，数组类型，子类型等<br>枚举型：<br>type 数据类型名称 is（元素1，元素2，......）；<br>eg.&nbsp; type color is（blue，green，brown）；<br>枚举类型，编码顺序是默认的，左边第一元素编码为0，以后依次加1.编码过程中自动将每个元素转变成位矢量，位矢量的长度由所列举元素个数决定。<br><br>整数类型，实数类型。<br>自定义的整数类型、实数类型是标准的整数、实数的子类型，是跟据特殊需要自己定义的。目的是降低逻辑综合的复杂型和提高芯片利用率。<br>定义格式：<br>type 数据类型名称 is integer range 整数范围；<br>type 数据类型名称 is real&nbsp;range 实数范围；<br><br>数组类型：<br>type 数组类型名称 is array 范围 of 数组元素的数据类型<br>type 数据类型名称 is array （range&lt;&gt;)of 数组元素的数据类型；<br>其中范围是用整数指明数组的上下界，是一个限定数组<br>例如：type stb is array （7 downto 0）&nbsp;of bit；<br>variable addend：stb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--变量addend定义为std数组<br><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="POSITION: relative; TOP: 3pt; mso-text-raise: -3.0pt"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><br>子类型：<u>子类型说明语句就是对已经存在的基本数据类型作一些范围限制，形成了新的一种数据类型，即子类型subtype&nbsp;<br></u>subtype定义格式：<br>subtype 子类型名 is 基本数据类型 range 约束范围<br></v:shapetype></span></span><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="POSITION: relative; TOP: 3pt; mso-text-raise: -3.0pt"><v:shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">eg: type nat is integer range 0 to 999;&nbsp; --</v:shapetype></span></span><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="POSITION: relative; TOP: 3pt; mso-text-raise: -3.0pt"><v:shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">自定义整数类型nat是整数，范围0-999<br><br>IEEE标准数据类型&#8220;std-logic&#8221;和&#8220;std-logic-vector&#8221;<br>std-logic：标准逻辑位<br>std-logic-vector：标准逻辑矢量<br>std-logic定义了9种不同的值，增加了不定态&#8220;X&#8221;和高阻态&#8220;Z&#8221;<br>U--初始值；&nbsp; X--不定，未知；&nbsp; 0--0；&nbsp; 1--1；&nbsp; Z--高阻；&nbsp; W--弱信号不定，未知；<br>L--弱信号0；&nbsp; H--弱信号1；&nbsp;&#8220; 一&#8221;--不可能状态<br><br>类型转换<br><span style="COLOR: #ff6600">类型转换函数表</span><br>
<table style="WIDTH: 320px; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td>函数名&nbsp;&nbsp;</td>
            <td>功能</td>
        </tr>
        <tr>
            <td colSpan=2>std_logic_1164程序包</td>
        </tr>
        <tr>
            <td>to_std_logic_vector(a)</td>
            <td>由bit_vector转换为std_logic_vector</td>
        </tr>
        <tr>
            <td>to_bit_vector(a)</td>
            <td>由std_logic_vector转换为sbit_vector</td>
        </tr>
        <tr>
            <td>to_std_logic(a)</td>
            <td>由bit转换为std_logic</td>
        </tr>
        <tr>
            <td>to_bit(a)&nbsp;&nbsp;&nbsp;</td>
            <td>由std_logic转换位bit</td>
        </tr>
        <tr>
            <td colSpan=2>std_logic_arith程序包：</td>
        </tr>
        <tr>
            <td>conv_std_logic_vector(a)</td>
            <td>由integer、unsigned、signed转换为std_logic_vector</td>
        </tr>
        <tr>
            <td>conv_integer(a)</td>
            <td>由unsigned、signed转换为integer</td>
        </tr>
        <tr>
            <td colSpan=2>std_logic_unsigned程序包：</td>
        </tr>
        <tr>
            <td>conv_integer(a)</td>
            <td>由std_logic_vector转换为integer</td>
        </tr>
    </tbody>
</table>
<br><br>（以上内容是学习VHDL语言的一些网络笔记，以备后用）<br></p>
</v:shapetype></span></span></span></span>
<img src ="http://www.cnitblog.com/trust2001/aggbug/46321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/trust2001/" target="_blank">绿茶</a> 2008-07-05 12:32 <a href="http://www.cnitblog.com/trust2001/articles/46321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VHDL语言的基本结构</title><link>http://www.cnitblog.com/trust2001/articles/45974.html</link><dc:creator>绿茶</dc:creator><author>绿茶</author><pubDate>Fri, 27 Jun 2008 03:06:00 GMT</pubDate><guid>http://www.cnitblog.com/trust2001/articles/45974.html</guid><wfw:comment>http://www.cnitblog.com/trust2001/comments/45974.html</wfw:comment><comments>http://www.cnitblog.com/trust2001/articles/45974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/trust2001/comments/commentRss/45974.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/trust2001/services/trackbacks/45974.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; VHDL语言通常包括库说明、实体说明、结构体说明3个部分。<br><span style="COLOR: #ff0000">library ieee;<br>use ieee.std_logic_1164.all;</span>&nbsp;&nbsp;&nbsp;&nbsp; --库说明<br><span style="COLOR: #33cccc">entity dff1 is<br>port(clk,d:in std_logic;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q:out std_logic);<br>end dff1;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --实体说明<br><span style="COLOR: #00ff00">architecture rtl of dff1 is<br>begin&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(clk)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(clk'event and clk='1')then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q&lt;=d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end process;<br>end rtl;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--结构体说明<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VHDL提供5个库，IEEE库，STD库,VITAL库，自定义库和WORK库<br>IEEE库包含的常用程序包有：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std_logic_1164：常用数据类型（其中有std_logic、std_logic_vector数据类型）和函数的定义、各种类型转换 函数及逻辑运算。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std_logic_arith：它在std_logic_1164的基础上定义了无符号数unsigned、有符号数signed数据类型并为其定义了相应的算术运算、比较，无符号数unsigned、有符号数signed及整数integer之间转换函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std_logic_unsigned和std_logic_signed：定义了integer数据类型和std_logic及std_logic_vector数据类型混合运算的运算符，并定义了一个由std_logic_vector型到integer型的转换函数。其中std_logic_signed中定义的运算符是有符号数运算符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STD库是标准库，包含两个程序包：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; standard：定义了基本数据类型、子类型和函数及各种类型的转换函数等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textio文本程序包：定义了支持文本文件操作的许多类型和子程序等。在使用textio程序包之前，需要先写上use语句use std.txtio.all。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VITAL库：使用VITAL可以提高门级时序仿真的精度，一般在VHDL语言程序进行仿真时使用。主要包含两个程序包。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VITAL_timing：时序仿真包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VITAL_primitives：基本单元程序包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORK库，是现行的工作库，设计人员设计的VHDL语言程序的编译结果不需任何说明，都将存放在WORK库中。WORK库可以是设计者个人使用，也可提供给设计组多人使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>库说明的语法结构<br>library&nbsp;库名；<br>use 库名.程序包名.项目名；<br><br>###########################################################################################<br><br>实体说明<br><br>实体的电路意义相当于器件，在电路原理图上相当于元件符号，他是完整的、独立的语言模块<br>实体说明语句的语法：<br><br>entity 实体名 is<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port（端口1： 端口方式1&nbsp; 端口类型1；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;端口2： 端口方式2&nbsp; 端口类型2；......）；<br>end 实体名<br><br><span style="COLOR: #0000ff">端口方式有五种：</span><br><span style="COLOR: #0000ff">in&nbsp; 输入类型&nbsp; 信号从该端口进入实体<br>out&nbsp; 输出类型&nbsp; 信号从实体内部经该端口输出<br>inout&nbsp; 输入输出类型&nbsp; 信号既可以从该端口输入也可以输出<br>buffer&nbsp; 缓冲型&nbsp; 与out类似但在结构体内部可以作反馈<br>linkage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无制定方向，可以与任何方向的信号连接<br></span></p>
<p>############################################################################################</p>
<p>结构体说明<br>结构体会给模块的具体实现，指定输入与输出之间的行为。<br>结构体语法如下：<br><br>architecture 结构体名称 of 实体名 is<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结构体说明部分；<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结构体并行语句部分；<br>end&nbsp;&nbsp;&nbsp;结构体名称；<br><br>结构体说明：对结构体内部所使用的信号、常数、数据类型和函数进行定义。<br>结构体并行语句：具体确定各个输入、输出之间的关系，描述了结构体的行为，是一组并行处理语句。<br>结构体对实体的输入输出关系可以用3中方式进行描述，即行为描述（基本设计单元的数学模型描述）、寄存器传输描述（数据流描述）、和结构描述（逻辑元器件连接描述）。不同的描述方式，只体现在描述语句上，而框架是完全一样的。<br><br>############################################################################################<br><br>（以上材料均取材与网络）</p>
<img src ="http://www.cnitblog.com/trust2001/aggbug/45974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/trust2001/" target="_blank">绿茶</a> 2008-06-27 11:06 <a href="http://www.cnitblog.com/trust2001/articles/45974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>