我不知道如何描述它,但也许是这样的?
void monitor_thread(void)
{
for(;;){
if (data==10){
data=0;
data2++;
}
}
}
对我来说,我会在VHDL中以这种方式实现它:
signal data,data2:std_logic_vector(3 downto 0);
...
process(data)
begin
case data is:
when "0101" => data2<=data2+1;
when others =>
end case;
end process;
但是在Quartus II编译时会引起警告。我认为这不是正确的方法。有什么建议吗?
警告:
Warning (10492): VHDL Process Statement warning at xxx: signal "data2" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10631): VHDL Process Statement warning at xxx: inferring latch(es) for signal or variable "data", which holds its previous value in one or more paths through the process
答案 0 :(得分:2)
首先假设data
是一个寄存器,它在时钟clock
的上升沿更新。然后data
每个时钟周期只会改变一次,所以我们需要它每个时钟周期只与目标值进行一次比较。这是通过另一个时钟进程实现的,该进程将data2
同步增加到clock
:
process (clock)
begin
if rising_edge (clock) then
if data = x"0101" then
data2 <= data2 + 1; -- data2 of type unsigned, signed, or integer
end if;
end if;
end process;
如果data
是某些组合逻辑的输出,其中该组合逻辑的输入是由clock
计时的寄存器,则data
可能在时钟周期内改变若干次。但是,您实际上只能依赖于已确定的值,因为中间值取决于硬件中的实际延迟,因此不是确定性的。对于监控,您可以使用与上面相同的过程。
如果data
取决于某些异步输入,则必须首先使用公共时钟同步这些输入。然后可以应用上面的解决方案。