No dices lo que quieres que haga el código, pero puedo ver un par de áreas problemáticas. La primera es que no tiene ninguna lógica de reinicio en su proceso. Es importante asegurarse de que inicializa correctamente todo para evitar un funcionamiento inusual. Sin embargo, esto probablemente no sea la causa de su problema.
Lo que creo que está causando la operación incorrecta es que está buscando que la señal del reloj sea alta en lugar de verificar que el reloj pase de baja a alta. Esto se llama el "borde ascendente" del reloj. La lógica síncrona funciona en los bordes del reloj en lugar de en los niveles del reloj.
Usted menciona que no debería tener que buscar un flanco ascendente ya que el reloj está en la lista de sensibilidad y, por lo tanto, si su proceso se ejecuta, solo puede verificar el nivel del reloj. Esto puede ser teóricamente cierto, pero las herramientas de síntesis funcionan al inferir la lógica del lenguaje utilizado para describirlo. La mayoría de las herramientas de síntesis que he usado están diseñadas para producir la lógica correcta cuando se describe a continuación.
process(clock, reset)
variable counter : std_logic_vector (15 downto 0) := x"0000";
variable op : std_logic_vector (7 downto 0);
begin
if reset = '1' then
-- reset everything to a known state here
elsif rising_edge(clock) then
op := cw(15 downto 8);
if op = x"20" then
counter := counter + cw(7 downto 0);
end if;
counter := counter + 2;
ia <= counter;
end if;
end process;
Escribir un buen HDL tiene tanto que ver con corregir la lógica como con describirlo en la forma en que las herramientas de síntesis esperan verlo. Si decides "es lo mismo" y escribes las cosas de una manera no estándar, puedes encontrar que el simulador te dice una cosa pero el sintetizador no lo ve de la misma manera. Este es un buen punto para aprender, y uno que puede causarle muchos dolores de cabeza y frustración en caso de que decida lo contrario.