【Espier FPGA VHDL学习帖】第20帖 引入寄存器技巧
常见泽
首先需要复习几个知识点:
第一:Signal与variablel
第二:wait语句
WAIT;-- 第一种语句格式(永远挂起)
WAIT ON 信号表;-- 第二种语句格式 (信号发生变化将结束挂起)
WAIT UNTIL 条件表达式;-- 第三种语句格式(条件表达式中的信号发生变化切满足条件是结束挂起)
WAIT FOR 时间表达式;-- 第四种语句格式, 超时等待语句(时间到结束挂起)
第三:操作符
VHDL有四类操作符:逻辑操作符、关系操作符、算术操作符、符号操作符
逻辑操作符 and or nor nand xor xnor not
如果在一个表达式中有两个以上算符,需要使用括号将这些运算分组,如果这一串运算符相同,且是AND\XOR\OR中的一种,则不需要使用括号。
其次:
高效的可综合电路的设计要求是:在么有必要时应尽量避免在电路中插入寄存器,否则既影响电路的工作速度,又占用不必要的硬件资源。
寄存器的引入通过使用WAIT和IF语句测试敏感信号边沿来实现的。
注意
(1) 一个进程中只能引入一种类型的寄存器,分为锁存器、有异步置位或复位的锁存器、触发器、有异步复位或同步置位的触发器。
(2) 引入寄存器的优选语句应该是IF语句,因为IF语句更容易控制寄存器的引入。
(3) 不要将用于产生寄存器的赋值语句放在IF(边沿)语句的ELSE条件的分支上,但可以放在ELSIF语句上。
(4) 在IF THEN或IF_THEN_ELSE语句中,只能存在一个边沿测试描述分句。也就是说一个进程综合得到的电路只能受控于一个时钟信号,并且一个同步逻辑模块(包括异步进程)
实例:
and_b<= count(2) and count(1)and count(0);
or_b <=count(2) or count(1)or count(0);
nor_b <=count(2) xor count(1)xor count(0);
为了避免引入过多的寄存器,可将这3个输出赋值语句放在另一个没有WAIT或IF语句的进程中。
硬件描述语言:
BEGIN
Process
--variablecount:std_logic_vector(2 downto 0);
begin
wait untilclock'event and clock='1';
if(rst='1')then
--count:="000";
count<="000";
else
--count:=count+1;
count<=count+1;
end if;
--and_b <=count(2) and count(1)and count(0);
--or_b <=count(2) or count(1)or count(0);
--nor_b <=count(2) xor count(1)xor count(0);
end process;
process(count)
begin
and_b <=count(2) and count(1)and count(0);
or_b <=count(2) or count(1)or count(0);
nor_b <=count(2) xor count(1)xor count(0);
end process;
END arch;
查看结果
and_b<= count(2) and count(1)and count(0);
or_b <=count(2) or count(1)or count(0);
nor_b <=count(2) xor count(1)xor count(0);
3个赋值语句放在WAIT语句的进程中。
优化前:
引入寄存器+组合电路:
将这3个输出赋值语句放在另一个没有WAIT或IF语句的进程中。
可见:如果要描述一个组合电路与时序电路混合的系统,可以将描述时序的部分放在具有边沿检测条件的IF语句或者WAIT语句的进程中,而将描述组合电路的语句放在普通的进程中,这样可以有效地控制寄存器的引入。
(本帖内容摘于潘松老师的《VHDL使用教程》)