VHDL - 使逻辑可合成

时间:2016-11-22 18:36:58

标签: vhdl

我正在设计一个相对简单的内存仲裁器,有两种状态。

  • 状态1:端口1连接到内存(默认状态)
  • 状态2:端口2连接到内存(仅当有请求时)

ModelSim中的模拟工作正常,并证明我的仲裁器按要求运行。但是有人告诉我,我写的代码不是可综合的。我在下面列出了相关流程的代码。

根据请求,使能信号变为高电平,并将使能信号设置为低电平,确认已为该端口供电。要求是如果有两个同时请求,则应连接端口2。但是,如果由于先前的请求已经连接了端口1,则端口2应该等到端口1被服务。

我的问题是:

  1. 我写的代码有什么问题(以及为什么)?
  2. 使您的代码可以合成的方法是什么(不是最终解决方案,但希望有用的提示)
  3. the relevant process' code

    由于格式化这篇文章的代码部分存在问题,我还将代码包含为图像。

    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;
    

1 个答案:

答案 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