容易忽视的问题: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
a与b的值互换 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;
例3
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;
用户1259785 2013-2-5 10:00