《vhdl设计深入》ppt课件.ppt
30页EDA技术 第8章 VHDL设计深入,8.1 数据对象,8.1.1 常量,常量 定义: constant 常量名:数据类型:= 赋值表达式; 常量只能在定义时被赋值如,constant vcc : real := 3.3; 作用范围:可定义在程序包、实体、结构体、进程、子程序中 若定义在实体中,则可在这个实体的所有结构体中使用 若定义在结构体中,则只能用于该结构体 若定义在进程/子程序中,则只能用于该进程/子程序 若在程序包中定义,则可以用在调用该程序包的所有设计实体中变量: 定义: variable 变量名:数据类型 [ := 初始值 ]; 如,variable b ,c : integer := 2; 功能及作用范围:属于局部量,主要用于数据的暂存,而且只能在进程或子程序中定义变量,变量无法将数据传递出进程 变量的赋值: 目标变量名:=表达式; 变量的赋值是立即执行的,不存在任何延时8.1.2 变量,信号 定义:SIGNAL 信号名:数据类型 [ := 初始值 ] ; 如,SIGNAL clk : std_logic := ‘0’; 功能及作用范围:属于全局量,相当于电路中的一条导线,不能定义在进程或子程序中,只可定义在其外部,用于在结构体中传递数据。
注:可以在进程中使用信号,将进程外的信息带入进程(将信号放在敏感列表中),或将进程内的信息带出进程(在顺序语句中对信号赋值) 信号的赋值:信号名 = 表达式 AFTER 延时时间; 信号的赋值存在延时8.1.3 信号,进程语句及进程中的信号/变量赋值语句的执行特点: 一个进程语句的仿真周期是固定的,为一个δ时间 在进程被激活的瞬间开始计时,在顺序执行到END PROCESS语句时停止计时,这一段时间称为δ仿真周期 δ时间是一个非常小的量(fs),是VHDL仿真器的最小分辨时间) 进程中信号赋值语句的执行发生在δ延时之后,即当执行完END PROCESS语句时,对进程中的所有信号进行赋值操作 进程中变量赋值语句的执行时立即发生的,不存在延时 若进程中存在对同一信号多次赋值的情况,则只执行最后一条信号赋值语句…… SIGNAL a,b,c,y,z: integer; …… PROCESS (a,b,c ) VARIABLE x; BEGIN y = a+b; z = c-x; y = b; END PROCESS; ……,信号定义在process外部,--变量定义在process内部,--信号赋值,存在延时δ,--进程结束后,才对信号赋值,【例】信号赋值:在进程中允许对同一目标信号进行多次赋值,其结果是只有最后的赋值语句被执行。
例8-3】 ARCHITECTURE bhv OF DFF1 IS SIGNAL A, B: STD_LOGIC ; BEGIN PROCESS( CLK ) IS BEGIN IF CLK’EVENT AND CLK = ‘1‘ THEN A = D ; B=A; Q=B; END IF; END PROCESS; END ARCHITECTURE bhv ;,【例8-4】 ARCHITECTURE bhv OF DFF1 IS BEGIN PROCESS( CLK ) IS VARIABLE A, B: STD_LOGIC ; BEGIN IF CLK’EVENT AND CLK = ‘1‘ THEN A := D ; B:=A; Q=B; END IF; END PROCESS; END ARCHITECTURE bhv ;,【例8-3】中需要保存信号A,B及输出端口信号Q的值,因此会引入三个触发器 【例8-4】的变量A、B起到临时存储输入信号D的作用,只需要保存输出端口Q的值,因此只会引入一个触发器读取信号A、B时,使用的是其原来的值通过变量A、B将输入端口D赋值给输出端口Q,【例8-3】和【例8-4】的RTL视图,【例8-5】进程中的信号/变量赋值语句的执行特点 …… PROCESS( in1 ,in2, …) IS variable c1: std_logic_vector(3 downto 0); BEGIN … e1 = “1010” ; … c1 := “0011”; END PROCESS; ……,信号e1的赋值:在进程的末尾才执行。
变量c1的赋值:立即执行例8-6】4选1数据选择器设计(错误的例子) entity mux4 is port( i0,i1,i2,i3,a,b: in std_logic; q :out std_logic); end entity mux4; ARCHITECTURE body_mux4 OF mux4 IS SIGNAL muxval : integer range 3 downto 0 ; BEGIN PROCESS( i0,i1,i2,i3,a,b ) IS BEGIN muxval=0; if(a=‘1’) then muxval=muxval +1 ; end if; if(b=‘1’) then muxval=muxval +2 ; end if;,case muxval is when 0 = q q q q null; end case; END PROCESS; END body_mux4 ;,进程中的信号/变量赋值语句的执行特点:,信号muxval的值并未更新,仍保留原来的值将a,b转换为整型信号muxval,【例8-7】4选1数据选择器设计(正确的例子) entity mux4 is port( i0,i1,i2,i3,a,b: in std_logic; q :out std_logic); end entity mux4; ARCHITECTURE body_mux4 OF mux4 IS BEGIN variable muxval : integer range 3 downto 0 ; PROCESS( i0,i1,i2,i3,a,b ) IS BEGIN muxval :=0; if(a=‘1’) then muxval := muxval +1 ; end if; if(b=‘1’) then muxval := muxval +2 ; end if;,case muxval is when 0 = q q q q null; end case; END PROCESS; END body_mux4 ;,进程中的信号/变量赋值语句的执行特点:,变量muxval已更新为相应的整型。
将a,b转换为整型变量muxval,【例8-8】三态门设计 …… entity tri_s is port ( enable : in std_logic; datain : in std_logic_vector(7 downto 0); dataout : out std_logic_vector( 7 downto 0)); end entity tri_s ; ARCHITECTURE bhv OF tri_s IS BEGIN PROCESS( enable , datain) IS BEGIN if enable = ‘1’ then dataout = datain; else dataout = “ZZZZZZZZ” ; end if; end process; end bhv;,8.2 含高阻输出的电路设计,使能信号enable无效:输出高阻态,【例8-9、8-10】双向端口的设计 …… entity tri_s is port ( control: in std_logic; in1: in std_logic_vector(7 downto 0); q : inout std_logic_vector(7 downto 0); x: out std_logic_vector( 7 downto 0)); end entity tri_s ; ARCHITECTURE bhv OF tri_s IS BEGIN PROCESS(control, q , in1) IS BEGIN if control = ‘0’ then x= q; q= “ZZZZZZZZ” ; else q= in1; x = “ZZZZZZZZ” ; end if; end process; end bhv;,8.2 含高阻输出的电路设计,q作为输出端,q作为输入端,,【例8-11】三态总线电路设计(错误的例子) entity tri_s is port ( datain3,datain2,datain1,datain0 : in std_logic_vector(7 downto 0); ctl : in std_logic_vector(1 downto 0); output : out std_logic_vector( 7 downto 0)); end entity tri_s ; ARCHITECTURE bhv OF tri_s IS BEGIN PROCESS( ctl , datain3,datain2,datain1,datain0) IS BEGIN if ctl = ‘00’ then output’Z’) ; end if; if ctl = ‘01’ then output’Z’) ; end if; if ctl = ‘10’ then output’Z’) ; end if; if ctl = ‘11’ then output’Z’) ; end if; end process; end bhv;,8.2 含高阻输出的电路设计,分析: 当ctl=00时 output’Z’) output ’Z’) output ’Z’) ; 进程结束时只执行最后一个信号赋值语句。
例8-12】三态总线电路设计(正确的例子) entity tri_s is port ( datain3,datain2,datain1,datain0 : in std_logic_vector(7 downto 0); ctl : in std_logic_vector(1 downto 0); output : out std_logic_vector( 7 downto 0)); end entity tri_s ; ARCHITECTURE bhv OF tri_s IS BEGIN output ’Z’) ; output ’Z’) ; output ’Z’) ; output ’Z’) ; end bhv;,8.2 含高阻输出的电路设计,分析: 当ctl=00时 output’Z’) output ’Z’) output ’Z’) ; 四个信号赋值语句都起作用,三态总线电路的RTL视图,8.2 含高阻输出的电路设计,8.3 顺序语句归纳,进程语句 [ 进程标号: ] process [ ( 敏感信号列表)] [ is ] [声明部分;] begin 顺序语句; end process [进程标号] ; ☞声明部分:数据类型、常量、变量、属性、子程序等。
☞敏感信号列表:当其中敏感信号发生变化时,将激活进程 ☞顺序语句:信号/变量赋值、进程启动语句(wait语句)、子程序调用、IF\CASE\LOOP语句、进程跳出语句(exit、next语句),进程语句要点 ☞进程为一无限循环语句 进程只有两种运行状态,即执行和等待状态当敏感信号发生变化时,进入执行状态,执行到end process;语句后自动返回到process起始处,进入等待状态 ☞一个结构体中可包含多个进程,进程之间是并行关系,进程内部为顺序执行 ☞进程之间通过信号进行通信8.4 并行赋值语句讨论,并行性讨论 并行语句书写顺序的改变对其没有影响; 若并行语。





