2013-04-10 4 views
3
library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.std_logic_arith.all; 
use ieee.numeric_std.all; 

- лицо часть содержит R для вывода регистраVHDL - Как добавить 1 в STD_LOGIC_VECTOR?

entity register_16 is 
    port( input: in std_logic_vector(15 downto 0); 
     ld, inc, clk, clr: in std_logic; 
     R: buffer std_logic_vector(15 downto 0)); 
end register_16 ; 

- это должен параллельный процесс

architecture behavioral of register_16 is 
begin 


reg: process (input, ld, clk, clr) 
    variable R_temp : std_logic_vector(15 downto 0); 
begin 
    if (clr='1') then 
     R_temp := b"0000000000000000"; 
    elsif (clk'event and clk='1') then 
     if (ld='1') then 
      R_temp := input; 
     end if; 
    end if; 
    R <= R_temp; 
end process reg; 

--my ошибку в этом шаге

inc_R: process (inc) 
begin 
    R <= R+'1'; 
end process inc_R; 


end behavioral ; 

- Основной процесс (reg) работает правильно - но другой процесс имеет erro r путем добавления 1.

ответ

4

К сожалению сказать, но есть довольно много вещей неправильно с вашим кодом ...

  1. Вы смешиваете комбинаторный и последовательный код тот же процесс, который является плохой стиль кодирования. Если правильно закодировано, нет необходимости в переменной R_temp.
  2. Список чувствительности - это только средство моделирования, но вы пытаетесь использовать его как условное (когда inc inc, increment R). Это не будет работать на оборудовании. Когда я начинаю работу с VHDL, я предлагаю использовать VHDL_2008 и всегда использовать процесс (все) в качестве списка чувствительности. Это позволяет избежать ошибок начинающих, поскольку отражает то, что делает синтез.
  3. Вы создаете комбинаторный цикл во втором процессе. Это не будет отображаться в симуляции из-за 2. выше, но вызовет ошибки в синтезе.
  4. Как уже упоминалось baldyHDL, вы назначаете R в нескольких процессах.
  5. Предпочитайте неподписанные std_logic_vector при работе с числами. Как правило, вы не должны включать std_logic_arith или std_logic_unsigned, только std_logic_1164 и numeric_std.
  6. Добавление значения std_logic (например, '1') не является стандартным или, по крайней мере, не поддерживается всеми инструментами. Просто используйте целое число: R <= R + 1;

По вашему коду, я понимаю, что вы пытаетесь написать счетчик с приращением, загрузкой и очисткой сигналов.Я не просто хочу дать вам код (который испортит опыт для вас), но пытаются втиснуть весь счетчик в единый процесс, используя следующий шаблон:

process(clk) begin 
    if(rising_edge(clk)) then 
     -- Your code here vvv 
     if(clr = '1') then 

     elsif(ld = '1') then 

     elsif(inc = '1') then 

     end if; 
     -- Your code here ^^^ 
    end if; 
end process; 
+0

От # 6, вместо этого используйте целое число. Лучшая альтернатива часто используется 'unsigned' из' ieee.numeric_std'. Это позволяет вам хранить семантику std_logic и также использовать большие значения, такие как 'unsigned (127 downto 0)', которые вы не можете сделать с целыми числами. – wjl

+1

@wjl Я имел в виду целое число 1, а не R. OP пытался добавить std_logic_vector и std_logic, что недопустимо. Учитывая 5., можно добавить целое число от 1 до R. – zennehoy

+0

Я согласен, что имеет смысл! – wjl

0

вы пишете R в обоих процессах. это приводит к ситуации с несколькими драйверами, которые невозможно синтезировать. чтобы решить, объединить процессы, например:

reg: process (clk, clr) 
    variable R_temp : std_logic_vector(15 downto 0); 
begin 
    if (clr='1') then 
     R_temp := b"0000000000000000"; 
    elsif (clk'event and clk='1') then 
     if (ld='1') then 
      R_temp := input; 
     elsif (inc='1') then 
      R_temp := R_temp + '1'; 
     end if; 
    end if; 
    R <= R_temp; 
end process reg; 
+3

Я также использовать 'numeric_std' и сделать' R_temp' и '' r' unsigned' vectors –

+0

Я не думаю, что добавление между R_temp и '1' разрешено. – Khanh

+0

Здесь нет необходимости в R_temp. Это просто усложняет процесс и приводит к ошибкам. Избегайте переменных, если это вообще возможно (и избегайте их безоговорочно при запуске с HDL), поскольку переменные приводят к последовательному мышлению, что точно не относится к HDL. – zennehoy

8

Вы должны преобразовать вектор в целое число обратно, вот пример:

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

signal in : std_logic_vector(7 downto 0); 
signal out : std_logic_vector(7 downto 0); 

out <= std_logic_vector(to_unsigned(to_integer(unsigned(in)) + 1, 8)); 

для хорошей картины о преобразовании типа посмотрите здесь:

http://www.bitweenie.com/listings/vhdl-type-conversion/

0

Вы должны быть в состоянии добавить вектор, содержащий значение 1, так как это, как вы используете библиотеку numeric_std:

R <= R + x"0001"; 
Смежные вопросы