А Вы напишите, что хотели сделать... ну или тот самый схематик приложите, что ли... А то непонятно, что же Вы хотели сделать этим кодом.
Вот, например, это место очень подозрительно выглядит:
Код
clk_counter := clk_counter + 1;
if (clk_counter = 1) then --cl2 rise
cl2_val := not cl2_val;
cl2 <= cl2_val;
if (cl2_val='1') then
d0 <= '0';
d1 <= '0';
d2 <= '1';
d3 <= '0';
cl2_counter := cl2_counter + 1;
end if;
Переменная clk_counter "мгновенно" перейдет в состояние '+1' (= 1), и if обязательно сработает... Затем cl2_val "мгновенно" поменяет свое состояние с '0' на '1' и следующий if сработает.... А т.к. сигналам D(3:0) больше нигде не присваиваются значения, то они
ВСЕГДА равны D(3:0) = 0100. А зачем тогда весь этот огород городить ??? Даже XST ругается на это:
INFO:Xst:2679 - Register <d0> in unit <main> has a constant value of 0 during circuit operation. The register is replaced by logic.Прочитайте внимательно про разницу между присвоением переменных и сигналов.