热度 14
2013-1-29 21:24
2131 次阅读|
1 个评论
容易忽视的问题 : 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.i nteger 必须说明 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;