【Espier FPGA VHDL学习帖】第15帖 Integer学习
1.integer 的取值可用符号的32位2进制数表示。
2.需要注意的是,VHDL仿真器将integer类型作为有符号数处理,而VHDL综合器则将integer作为无符号数处理。而且VHDL综合器要求必须使用rang子句为所定义的数限定范围,然后根据所限定的范围来确定此信号或变量的2进制的位数,因为VHDL综合器无法综合未限定范围的恶整数类型的信号和变量。
VHLD綜合器要求對具體的整數作出範圍限定,否則無法綜合成硬件電路。
如:signal s: integer range 0 to 15;
信號S的取值範圍0-15,可用4位二進制數表示,因此s將被綜合成由四條信號線構成的信號。
3.整数在表达式中不加引号,而逻辑数必须加引号,一位的加单引号,一位以上的加双引号。
4.natural,positive为integer的子类型
實例:
這裡用一個分頻器來做integer例子的分析。
程序如下:
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- ENTITY LESSON2_WAIT IS
- PORT(clk : IN STD_LOGIC;
- clk_div6 : OUT STD_LOGIC);
- END LESSON2_WAIT;
- ARCHITECTURE rtl OF LESSON2_WAIT IS
- --SIGNAL count : integer range 0 to 2;
- --SIGNAL count: integer;
- SIGNAL clk_temp : STD_LOGIC;
- BEGIN
- PROCESS(clk)
- variable count : integer range 0 to 2;
- BEGIN
- IF (clk'event AND clk= '1')THEN
- IF(count= 2 )THEN
- count := 0;
- clk_temp <=NOT clk_temp;
- ELSE
- count := count +1;
- END IF;
- END IF;
- END PROCESS;
- clk_div6 <= clk_temp;
- END rtl;
复制代码下面開始分析
(1) SIGNALcount: integer;
用Quartus9.0進行仿真分析,自帶波形仿真軟件,用起來很方便~
(2) SIGNALcount : integer range 0 to 2;
可以看出:
Integer如果不對具體的整數作出範圍限定,沒有輸出,可能就是上面所說的無法綜合成硬件電路。
Signal與Variable:
VARIABLE 是局部变量只能在进程和子程序中使用。不存在延时行为(仿真过程中共享变量例外)
SIGNAL类似连接线,SIGNAL做为一种数值容器,不但能容纳当前值,还能容纳历史值。这一点与触发器的记忆功能有很好的对应关系。除了没有方向以外,SIGNAL和实体的端口(PORT)概念是一致的。信号可以看成实体内部的端口
格式:
SIGNAL 信号名:数据类型:=初始值
(3)variable count : integer ;(注意放的位置)
(4)variable count : integer range 0 to 2;
[
本帖最后由 常见泽1 于 2013-12-7 16:09 编辑 ]