您好我是VHDL的新手,我想问一下这样的流程是否可以 我在一个进程中有多个时钟的地方 C256Hz和C4Hz是从50MHz时钟驱动的时钟使能
process (Reset, C50Mhz, Go, start_flag, C256Hz, C4Hz)
begin
if reset = '1' then
start_flag <= '0';
elsif rising_edge (C50Mhz) then
if C4Hz = '1' then
if count4 = "11" and single_run_flag = '0' then
start_flag <= '0';
end if;
end if;
if C256Hz = '1' then
if Go = '1' and start_flag = '0' then
start_flag <= '1';
end if;
end if;
end if;
end process; `
答案 0 :(得分:0)
没关系,但是合成是否会产生良好的结果取决于面料。
灵敏度列表应该只有reset
和C50MHz
,因为这些是实际更改信号的唯一事件。当C4Hz
切换时,rising_edge(C50MHz)
为false
,因为这些不是同步的,如果要运行该流程,则不会发生任何事情。
可以假设单独的启用在任何地方都可用 - 时钟扇出非常高,每个人都实现了独立的时钟分配网络,然后需要启用寄存器。所以这是安全的。
异步重置可能并非在所有结构上都可用,但通常是。有些设备会支持异步加载(即你可以决定复位时要采用的值),其他设备只能复位(即你只能将寄存器设置为零,初始化为1会生成一个倒置表,一个寄存器带有reset-to -zero,以及下一个LE中的逆变器。
所以一般来说,这是相当安全的,可以合成为
-- intermediates
do_clear_start_flag := C4Hz = '1' and count4 = "11" and single_run_flag = '0';
do_set_start_flag := C256Hz = '1' and Go = '1' and start_flag = '0';
-- to register
enable_start_flag := do_clear_start_flag or do_set_start_flag;
new_start_flag := do_set_start_flag;
start_flag
中do_set_start_flag
的旧值检查无法优化,即使设置start_flag
之前已设置无效,因为它可能只是重置当前的时钟周期。
如果以if C256Hz = '1'
开头的广告代码为elsif
,则第二个中间版将为
do_set_start_flag := C256Hz = '1' and Go = '1' and do_clear_start_flag = '0'