Перейти к содержанию
    

vhdl case

Здравствуйте.

 

            when S1 =>
                      buff(0) <= unsigned(i_data);
                      buff(3 downto 1) <= buff(2 downto 0);
                      if buff_count = 3 then
                         buff_count <= (others =>'0');
                         check_in <= '1';
                         reg <= buff(3);
                      else
                         buff_count <= buff_count + 1;
                     end if;

 

Сигналы check_in и buff_count , для которых вручную задаю значения - выставляются как надо и с ними нет проблем. А вот сигнал reg упорно не хочет принимать значения buff(3), и если честно не понимаю почему. Подскажите пожалуйста.

Изменено пользователем sqrt(2)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что выше и ниже с этим сигналом происходит?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выше - ничего кроме сброса. Ниже - только присвоение на выходной порт.

 

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity test is
port
(
     i_arst : in std_logic;
     i_clk  : in std_logic;
     i_data : in std_logic_vector (3 downto 0);
     o_data : out std_logic_vector (3 downto 0)
);
end entity;

architecture arch of test is

type fsm_state is (S0,S1);
signal fsm_cnt : fsm_state;

signal buff_count : unsigned (3 downto 0);

signal check_in : std_logic;

signal s0_count : unsigned (3 downto 0);

signal reg : unsigned(3 downto 0);

type buff_type is array (3 downto 0) of unsigned (3 downto 0);
signal buff : buff_type;


begin

fsm_proc : process(i_arst, i_clk)
begin
if i_arst = '1' then 
   s0_count   <= (others=>'0');
   check_in   <= '1';
   fsm_cnt    <= S0;
   reg        <= (others=>'0');
   buff_count <= (others=>'0');
   buff       <= (others=>(others=>'0'));
   elsif rising_edge(i_clk) then
      if (check_in = '1' and to_integer(unsigned(i_data)) >= 8) then
         check_in <= '0';
         s0_count <= (others=>'0');
         fsm_cnt  <= S0;
      elsif check_in = '0' then
         case fsm_cnt is
         
            when S0 =>
                      if s0_count = 15 then
                         fsm_cnt <= S1;
                      else
                         s0_count <= s0_count + 1;
                      end if;
            when S1 =>
                      buff(0) <= unsigned(i_data);
                      buff(3 downto 1) <= buff(2 downto 0);
                      if buff_count = 3 then
                         buff_count <= (others =>'0');
                         check_in <= '1';
                         reg <= buff(3);
                      else
                         buff_count <= buff_count + 1;
                      end if;
            when others => 
                       o_data <= (others=>'0');
        end case;
    end if;
end if;
end process;

o_data <= std_logic_vector(reg);


end arch;

Изменено пользователем sqrt(2)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема была в том, что сигналу o_data шло из двух мест, которые не принадлежат одному и тому же процессу, отсюда и 'X' на сигнале o_data все время.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...