0

これができない場合は、単に「いいえ」とその理由についての簡単な回答を残してください。ただし、これができないことを再確認したいと思います。

私はこのプロセスを持っています:

process(clk_p)
begin
    if rising_edge(clk_p) then
        if rst_i = '1' then
            stored_events <= (others => '0');
        else
            if mode_triggered = '1' and ptr = 0 and read_state = ST_ENABLE then
                stored_events <= stored_events;
            elsif mode_triggered = '1' then
                stored_events <= stored_events + 1;
            elsif ptr = 0 and read_state = ST_ENABLE then
                stored_events <= stored_events - 1;
            end if;
        end if;
    end if;
end process;

ええ、それを適切なケースのマルチプレクサに変えることで合成を支援する理由は、私たちにとって素晴らしいことではありません。

次のようなことができます。

sel(0) <= '1' when mode_triggered= = '1' else '0';
sel(1) <= '1' when ptr = 1 else '0'; 
sel(2) <= '1' when read_state = ST_ENABLE else '0';

case sel is 
    when "111" => 
        stored_events <= stored_events; -- and so on...

ただし、いくつかのプロセスを変更する予定なので、さらに多くのシグナル名を作成する必要があります。そう...

私が好きな方法があるかどうか疑問に思っていました(ただし、最終的にどのように機能するかは完全にはわかりませんwhen others):

case mode_triggered, ptr, read_state is 
    when '1', 0, ST_ENABLE =>
        stored_events <= stored_events;
4

2 に答える 2

1

別のバリアント (上下はブール値) は読みやすさに役立つ場合があります

down <= ptr = 0 and read_state = ST_ENABLE;
up   <= mode_triggered and not down;

process(clk_p)
begin
    if rising_edge(clk_p) then
        if rst_i = '1' then
            stored_events <= (others => '0');
        else
            if up then
                stored_events <= stored_events + 1;
            elsif down then
                stored_events <= stored_events - 1;
            end if;
        end if;
    end if;
end process;
于 2015-03-24T17:50:35.510 に答える