原创 VHDL语法总结1

2013-1-29 21:24 2168 14 15 分类: FPGA/CPLD

 容易忽视的问题generic map(FIFO_width=>8, FIFO_depth=>100)    注意是逗号,不是分号

signal 命名第一个字符不能为数字 1s_valid(×),,标示符必须以英文开头,标示符中的英文字母部分大小写


 

1. 信号变量要赋初值

 

变量是一个局部变量,只能在进程和子程序中使用。变量赋值是一种理想化的数据传输,立即发生,没有延时。初始值不是必需的,综合过程中综合其将略去所有的初始值。

variable 变量名:数据类型  :=初始值

variable a :integer;

variable b,c : integer:=2;

variable d: std_logic;

 

signal :信号初始值不是必需的,信号变量具有全局性

signal temp :std_logic:=0;

signal flag : bit;

signal a : integer range 0 to 15;

signal 支持自定义设计数据类型

type four is ('X','0','1','Z');

signal s1 : four;

signal s2 : four := 'X';

 

others  省略赋值操作符

others =>X 在较多位的位矢量赋值中做省略化赋值

signal d1 : std_logic_vector( 7 downto 0);

d1<=(others=>'0');

d1 <=(1=>'1';4=>'1',others=>'0')

 

2. 当信号用于顺序描述语句如process中时,信号的值不是立即更新的,只有当其所在的process函数或过程完成之后才进行更新。若信号的变化立即赋值,不随时钟,需要将语句放在process之外,

 

3. 信号的多次赋值,一个进程中,最后一次赋值有效。

signal 变量要在结构体中声明,不能在进程中声明。signal变量可以和variable间互相赋值,需要在process完成之后进行更新。

4. when语法结构

y <= a1 when s = '1' else

        a2 when s = '0';

.when并行语句不能放在process

利用when语句组合逻辑产生寄存器

ARCHITECTURE behav OF EXAP IS
SIGNAL Y : STD_LOGIC;
    BEGIN
      Y <=  a AND b WHEN clk ELSE
            Y;
      Y1 <= Y ;
     END behav

5.integer必须说明range范围,否则无法综合,但可以仿真

 

6.   请注意 VHDL综合器要求WAIT语句必须放在进程的首部或尾部并且一个进程中的WAIT语句不能超过一个

 wait until clk'event and clk = '1'

         y <= a;

7. 赋值语句if位于同一个进程时,对同一变量赋值,只有最后一个得到赋值更新,而忽略了其它的赋值,因此在一个进程中最好只放一个if语句

可以考虑when并行语句,对比一下两段代码的区别

PROCESS(enable,input3, input2, input1, input0 )
   BEGIN
   IF enable(3) = '1' THEN output <= input3 ;
   ELSE output <=(OTHERS => 'Z'); END IF ;
   IF enable(2) = '1' THEN output <= input2 ;
   ELSE output <=(OTHERS => 'Z'); END IF ;
   IF enable(1) = '1' THEN output <= input1 ;
   ELSE output <=(OTHERS => 'Z'); END IF ;
   IF enable(0) = '1' THEN output <= input0 ;       --
最后一个if赋值有效
   ELSE output <=(OTHERS => 'Z'); END IF ;      
END PROCESS;

 

ARCHITECTURE multiple_drivers OF tristate2 IS         --结构体中每一条并行语句等同于一个独立运行的进程,独立检测各个并行语句中的敏感信号
BEGIN
output <= input3 WHEN enable(3) = '1' ELSE (OTHERS => 'Z');
output <= input2 WHEN enable(2) = '1' ELSE (OTHERS => 'Z');
output <= input1 WHEN enable(1) = '1' ELSE (OTHERS => 'Z');
output <= input0 WHEN enable(0) = '1' ELSE (OTHERS => 'Z');
END multiple_drivers;

 

1:

architecture Behavioral of var_sig_test is
signal q2 : std_logic; --signal
声明在结构体中完成,不可在process
begin
process(clk)
variable q1,q3 : std_logic;
begin
if clk'event and clk='1' then
q1 := a2; --signal
variable赋值,需要在process完成之后更新
y2 <= q1; --生成两个寄存器,信号的赋值要在process完成之后形成

q3 := q1; --variable赋值立即执行
y1 <= q3;
end if;
end process;
end Behavioral;

RTL图:

 

例2

ab的值互换 a,b都等于b的初始值
signal a,b : std_logic; -- 定义信号

process(a, b)                                                               process

      begin                                                                      variable 1,b:std_logic;
         a <= b ;                                                            begin
         b <= a ;                                                                 a:=b;

end  process ;                                                                 b:=a;

ARCHITECTURE mul OF tris IS
 BEGIN
  PROCESS(three_s,clk, input )
   BEGIN
     IF (three_s = '0') THEN
       output <= 'Z';
       ELSIF (clk ='1' AND clk'EVENT) THEN
          IF (cnd) THEN
            output <=  input;                  --
产生额外的寄存器
          END IF;
     END IF;
  END PROCESS;
 END mul

PROCESS(clk, cnd, input)   --通过两个进程减少寄存器的使用,合理地使用三态门

  BEGIN
    IF (clk ='1' AND clk’EVENT) THEN
      IF (cnd) THEN
         temp <=  input;
      END IF;

 END IF;
  END PROCESS;
  PROCESS(three_s, temp)        --
此进程产生三态门
  BEGIN
    IF (three_s = '0') THEN  output <=  'Z';
    ELSE
        output <=  temp;
    END IF;
  END PROCESS;
END ARCHITECTURE activ;

 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1259785 2013-2-5 10:00

不错,可以多看看
相关推荐阅读
用户216637 2013-02-20 20:56
VHDL语法总结2
  转换函数: conv_std_logic_vector(integer,m+1) 把integer型的数据转换为m+1位的标准矢量值 variable a : int...
用户216637 2013-01-04 20:25
关于单片机C语言与VHDL编程的思考
  单片机上C语言的特点: 不需要考虑时钟及电平的变化,只要符合逻辑思维和控制需要  控制程序,更多的时候是条件转移,if 和switch用的很多,但if更多...
用户216637 2012-12-18 11:28
Modelsim仿真使用小结
针对ISE下的Modelsim 仿真可以分为直接在ISE中采用添加库的方式安装Modelsim,例如 当需要仿真的时候,选中Simulation,而开发的时候选择Implement...
用户216637 2012-10-30 22:08
AD9522
参考时钟: 一路差分时钟或者两路单端时钟 支持CMOS,LVPEL,LVDS参考电平,最高频率250MHz 晶体参考时钟16.62M--33.3M ...
用户216637 2012-10-23 21:33
TPS74401
可编程的启动时间延时,通过选择电容来设置启动时间  顺序启动方式,控制Vin,Vbias和Ven达到控制启动顺序的目的,而且在Vin和Vbias上电完成之后再启动Ve...
我要评论
1
14
关闭 站长推荐上一条 /3 下一条