【FPGA】顺序语句

顺序语句概述

特点:执行顺序和书写顺序基本一致

出现的位置:只能出现在进程和子程序中,子程序包括函数(function)和过程(procedure)

 

顺序语句种类

  1. 顺序信号/变量赋值语句

  2. IF-THEN 语句

  3. CASE 语句

  4. LOOP 语句

  5. RETURN语句

  6. NULL语句


 

顺序信号/变量赋值语句

进程中的顺序信号赋值语句:

signal<=expression;

End process时更新多次赋值,以最后一次赋值为准

 

进程中的顺序变量赋值语句:

variable:= expression; 立刻更新 多次赋值,以最后一次赋值为准

 


 

 

IF-THEN 语句

 

 

 

从上到下按照顺序评估条件 存在优先级

若第一个条件满足,可以执行对应的顺序语句。其他的都不再执行。

如果所有的条件都不满足,将执行ELSE之内的语句。 可以嵌套使用。

 

 

 

 

 

CASE 语句

 

 

 

条件只被评估一次 没有优先级 ;

必须包括所有的条件(可以没有when others,但是必须包含所有条件)

WHEN OTHERS 语句包括了没有指定的所有条件

 

 

 

 

 

IF语句和CASE语句之例

 

 

 

 

 


 

LOOP语句

无限 Loop Loop   =  while(True)

将无限执行,

除非EXIT 语句存在

WHILE LOOP  =  if( *** ){ while(True) }

条件满足,则循环

FOR LOOP   = for( *** ; *** ; *** );

迭代 loop

 

Format:

 

 

 

注意:

VHDL综合器不支持无法事先确定循环次数的LOOP语句。因此,无限loop,while loop循环语句不可综合。

 

4-bit Left Shifter

 

 

 

 

 


 

RETURN语句

Return语句是一段子程序结束后,返回主程序的语句

格式

Return;--只能用于过程,它后面不要有表达式

Return 表达式;--只用于函数,它后面必须有表 达式,函数结束必须用return语句

 

 

 

 

 

 

 

 

 


 

NULL语句

空操作

格式 NULL;

 

 

 

 


 

 

顺序语句总结

在一个进程中,可以有多个语句,需要考虑的问题

  1. 当敏感表中的信号发生变化, 此进程将被激活

  2. 一旦被激活,在进程中的所有语句都将顺序执行一次

  3. 进程中对信号的任何赋值在进程之外是不可见的,直到进程执行结束,才会更新信号

  4. 如果有多个语句对同一个信号赋值,只有最后一个是可见的,或有效的

 


 

讨论Signal赋值语句

 

(注意:图1,图3,敏感表里中间的s1应改成w1)

Conditon1: f<= w0;

该赋值语句直到进程结束才会执行 若之后有另外的赋值给f,那么默认赋值将会被重写

 

 

Conditon2:

if statement 只会执行其中一种情况,f不会被重写

 

 

 

 

 

Conditon3 :

首先评估if语句,然后对f赋值 最后的结果是f始终为w0,多次赋值以最后一次为准

 


 

 

优先级编码器(3种写法)

 

when语句

 

if... elsif .... else 语句:

 

 

 

 

 if 语句:

 

 

 

 


 

D触发器(clk=‘1’)

 

 

 

D触发器- “WAIT”

 

 

 

D 触发器(CLK )

 

 

 

D触发器(上升沿)

 

 

 

注意:rising_edge(clk) 里面clk必须是std_logic;这个是函数本身设置的.

 

 

同步和异步

异步 放置在上升沿描述语句之前

同步 放置在上升沿描述语句之后

 

D触发器异步清零

 

 

 

D触发器同步清零

LIBRARY ieee ; 
USE ieee.std_logic_1164.all ; 

ENTITY flipflop_ar IS 
    PORT (     D, Resetn, Clock     : IN     STD_LOGIC ; 
            Q                 : OUT     STD_LOGIC) ; 
END flipflop_ar ;

ARCHITECTURE behavioral OF flipflop_ar IS    
BEGIN
    PROCESS ( Resetn, Clock ) 
    BEGIN 
        IF rising_edge(Clock) THEN 
             IF Resetn = '0' THEN             
                Q <= '0' ; 
            ELSE
                Q <= D ; 
            END IF ; 
        ENDIF;
    END PROCESS ;
END behavioral ; 

 

使用异步reset的8-bit寄存器

 

 

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ENTITY reg8 IS
    PORT (     D                : IN     STD_LOGIC_VECTOR(7 DOWNTO 0) ;
            Resetn, Clock        : IN     STD_LOGIC ;
            Q                 : OUT     STD_LOGIC_VECTOR(7 DOWNTO 0) ) ;
END reg8 ;

ARCHITECTURE behavioral OF reg8 IS    
BEGIN
    PROCESS ( Resetn, Clock )
    BEGIN
        IF Resetn = '0' THEN
            Q <= "00000000" ;
        ELSIF rising_edge(Clock) THEN
            Q <= D ;
        END IF ;
    END PROCESS ;
END behavioral ;`

 

使用异步reset的N-bit寄存器

 

 

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ENTITY regn IS
    GENERIC ( N : INTEGER := 16 ) ;
    PORT (     D            : IN         STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
            Resetn, Clock    : IN         STD_LOGIC ;
            Q            : OUT     STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END regn ;

ARCHITECTURE behavioral OF regn IS    
BEGIN
    PROCESS ( Resetn, Clock )
    BEGIN
        IF Resetn = '0' THEN
            Q <= (OTHERS => '0') ;
        ELSIF rising_edge(Clock) THEN
            Q <= D ;
        END IF ;
    END PROCESS ;
END behavioral ;

 

使用变量的计数器

 

 

 

 

 

全加器-数据流描述

 

 

4-bit 进位加法器

结构化描述

 

 

 

行为描述

 

 

 

posted @ 2020-06-25 14:58  Osea  阅读(831)  评论(0编辑  收藏  举报