在梳状逻辑块中保持输出

时间:2014-06-27 05:46:47

标签: hardware vhdl fpga

我有一个问题是持续存在gpo的价值。 我希望它只在下面的代码中进行更改。

gpo_int <= gpo_int when n_wr = '1';
gpo <= gpo_int;
write : process(n_en, n_wr) begin
  if n_wr = '0' and n_en='0' then
    case addr(15 downto 12) is
      when x"f" => -- i/o
        case addr(11 downto 8) is
          when x"0" => -- gpo
            gpo_int <= data;
          when others =>
            gpo_int <= gpo_int;
        end case;
      when others =>
        gpo_int <=  gpo_int;
    end case;
  end if;
end process;

gpo_int是std_logic_vector的信号(7 downto 0):= x&#34; 00&#34 ;;

首先gpo_int没有正确保持(我可以看到gpo改为x&#34; 00&#34;当n_rw进入&#39; 1&#39;。还有什么方法可以更整齐地做到这一点(定义梳子逻辑的真值表?

2 个答案:

答案 0 :(得分:1)

分配信号的每个并发语句都有该信号的驱动程序。并发信号分配(在这种情况下是条件信号分配)是并发语句。进程是并发语句。

所以有两个驱动因素:

gpo <= gpo_int;

write : process

std_logic_vector是已解析的数据类型。 std_logic_vector信号gpo_int的有效值是所有它的驱动程序的解析值(并且你有两个显示)。对于gpo_int的每个元素,两个驱动程序中每个元素的对应值用于通过使用在中定义的分辨率表中查找两个值的交集处的值来确定gpo_int的有效值。包的主体std_logic_1164:

CONSTANT resolution_table : stdlogic_table := (
--      ---------------------------------------------------------
--      |  U    X    0    1    Z    W    L    H    -        |   |
--      ---------------------------------------------------------
        ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
        ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
        ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
        ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
        ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
        ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
        ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
        ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
        ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' )  -- | - |
    );

因此,当您的相应元素不会解析时,您可能会遇到由存储值(gpo_int <= gpo_int when n_wr = '1')和流程分配的值导致的冲突相同的价值。

例如,如果一个驱动程序的gpo_int(7)'1'且另一个驱动程序为'0',则该元素的已解析值为'X'

如果您想将gpo_int作为闩锁操作,请尝试:

gpo <= gpo_int;

WRITE:
    process (n_en, n_wr, data)
        begin
        if n_wr = '0' and n_en ='0' and addr(11 downto 8) = x"F0" then
            gpo_int <= data;
        else
            gpo_int <= gpo_int;  -- the else clause is optional for some synthesis tools
        end if;

    end process;

忘记了gpo_int的并发信号赋值语句。当if语句中的所有三个条件都为真时,分配了gpo_int的流程语句将保留其值。

datan_wrn_en之后转换的原因n_wr列在敏感度列表中。

您可以在现有已撤销的IEEE Std 1076.6-2004 6.2.1.1级别敏感存储中查找已识别的方法的描述,该过程具有敏感性列表,或者您的供应商描述支持的VHDL语言结构的文档

通常情况下,系统会确保您不会遇到组合性故障&#39;通过确保转向信号之一(在这种情况下为n_enaddr),在其他信号转换内的转换(例如{{1}}是稳定的),锁存器使能寄存器。是的,你可以在零时间模型中获得一个三角形循环长的组合事件。

答案 1 :(得分:1)

好像你要求一个闩锁。特别是在FPGA中,这通常不是正确的做法(出于各种原因)。

您是否可以使用时钟进程来使用触发器创建所需的持久性?

process (clk)
begin
    if rising_edge(clk) then
        if n_wr = '0' and n_en ='0' and addr(11 downto 8) = x"F0" then
           gpo_int <= data;
        end if;
     end if;
end process;
gpo <= gpo_int;