Присвоение выходному сигналу и изменение значения регистра из одной и той же ветви в блоке RTL

В VHDL я могу написать что-то вроде этого, чтобы изменить значение, хранящееся в регистре COUNTER и назначить выходному сигналу из той же ветви условия:

entity AssignTest is
  port (CLK: in std_logic; 
        OUTPUT: out std_logic_vector(1 downto 0));
end AssignTest;

architecture Behavioral of AssignTest is
  signal CLK: std_logic := '0';
  signal COUNTER: std_logic_vector (3 downto 0) := (others => '0');
begin
  process (CLK)
  begin
    if rising_edge(CLK) then
      OUTPUT <= "10";
      if COUNTER = "1001" then
        COUNTER <= "0000";
        OUTPUT <= "11";
      else       
        COUNTER <= std_logic_vector(unsigned(COUNTER) + 1);
      end if;
    end if;
  end process;
end Behavioral;

Есть ли способ сделать что-то подобное в Канзас-Лаве? Вы можете, конечно, сделать оба по отдельности с чем-то вроде

runRTL $ do
  counter <- newReg (0 :: U4)
  CASE [ IF (reg counter .==. 9) $ counter := 0
       , OTHERWISE $ counter := reg counter + 1
       ]
  return $ mux (reg counter .==. 9) (2, 3)

Тем не менее, я ищу способ не выписывать reg counter .==. 9 дважды, так как в моем реальном коде я бы изменил тонну внутренних регистров и назначил множество выходных сигналов во многих ветвях (и, в идеале, я бы даже не назначал все выходы из всех ветвей; скорее, У меня было бы какое-то задание по умолчанию).

0 ответов

Другие вопросы по тегам