问题
在我的设计中,有一个用于延迟的计数器。出于模拟目的,我想在编辑任何生产代码时限制它的最大值。这样做是为了加速模拟。
我尝试了什么
我想检查它是否超过了我的测试平台的最大值,如果是,我想将它设置为该值。我的第一次尝试看起来像这样:
alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>;
cap_delay : process (ext_delay) is
constant max_value : std_logic_vector(31 downto 0) := x"00001000"
begin
if ext_delay > max_value then
ext_delay <= max_value;
end if:
end process cap_delay;
但是,这会导致架构中的延迟信号始终为'U'
,可能是因为它是由多个进程驱动的。然后我使用force
关键字尝试了它,它成功地更改了值并且没有使它成为'U'
,但是我需要一种方法在下次递减时再次释放它。
答案 0 :(得分:2)
我已经弄清楚了。通过更改为基于等待的过程,我可以轻松地使用时间延迟。我使用的完整解决方案如下所示:
alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>;
cap_delay : process is
constant max_value : std_logic_vector(31 downto 0) := x"00001000"
begin
wait until ext_delay > max_value then
ext_delay <= force max_value;
wait for 10 ns;
ext_delay <= release;
end process cap_delay;
答案 1 :(得分:1)
有一种方法可以确定您的VHDL代码是在模拟中执行还是用于合成。此代码可以封装在一个函数中,因此您可以在VHDL代码中进行检查。例如,您可以为计数器定义不同的最大值。
function SIMULATION return boolean is
variable ret : boolean;
begin
ret := false;
--synthesis translate_off
if Is_X('X') then ret := true; end if;
--synthesis translate_on
return ret;
end function;
除此之外,if-then-else函数有助于在常量声明中选择不同的值:
function ite(cond : BOOLEAN; value1 : INTEGER; value2 : INTEGER) return INTEGER is
begin
if cond then
return value1;
else
return value2;
end if;
end function;
示例计数器:
signal Counter_us : UNSIGNED(23 downto 0) := (others => '0');
[...]
process(Clock)
constant COUNTER_MAX : POSITIVE := ite(SIMULATION, 100, 10000);
begin
if rising_edge(Clock) then
if (Counter_us >= COUNTER_MAX) then
Counter_us <= (others => '0');
else
Counter_us <= Counter_us + 1;
end if;
end if;
end process;
对于像SIMULATION和ite(..)这样的更多功能,请查看PoC.utils包。
答案 2 :(得分:-1)
您使用过 Noforce 关键字, 它释放信号的值