我正在设计一个相对简单的内存仲裁器,有两种状态。
ModelSim中的模拟工作正常,并证明我的仲裁器按要求运行。但是有人告诉我,我写的代码不是可综合的。我在下面列出了相关流程的代码。
根据请求,使能信号变为高电平,并将使能信号设置为低电平,确认已为该端口供电。要求是如果有两个同时请求,则应连接端口2。但是,如果由于先前的请求已经连接了端口1,则端口2应该等到端口1被服务。
我的问题是:
由于格式化这篇文章的代码部分存在问题,我还将代码包含为图像。
transition: process (clk)
begin
if rising_edge(clk) then
if reset = '1' then
state <= port1;
else
if (state = port1) and (req_p2.enable='1') and
(req_p1.enable='0' or rising_edge(req_p1.enable)) then
state <= port2;
elsif(state = port2) and (req_p2.enable='0') then
state <= port1;
end if;
end if;
end if;
end process;
答案 0 :(得分:2)
您的代码这一行不可合成:
rising_edge(req_p1.enable)
为了使其可合成,您需要将rising_edge
函数替换为检测上升沿的一些实际逻辑 - 同步上升沿检测器。有些事情应该有用(我不知道你的要求):
sync_rising_edge: process (clk)
begin
if rising_edge(clk) then
if reset = '1' then
req_p1_enable_d <= '0';
else
req_p1_enable_d <= req_p1.enable;
end if;
end if;
end process;
transition: process (clk)
begin
if rising_edge(clk) then
if reset = '1' then
state <= port1;
else
if (state = port1) and (req_p2.enable='1') and
(req_p1.enable='0' or (req_p1_enable_d = '0' and req_p1.enable = '1')) then
state <= port2;
elsif(state = port2) and (req_p2.enable='0') then
state <= port1;
end if;
end if;
end if;
end process;
rising_edge
函数是可合成的,如果在时钟进程中以常规方式使用它。请参阅my answer here。