Pergunta

i estou codificação um somador binário de 4 bits com acumulador:

library ieee;
use ieee.std_logic_1164.all;

entity binadder is
    port(n,clk,sh:in bit;
        x,y:inout std_logic_vector(3 downto 0);
        co:inout bit;
        done:out bit);
end binadder;

architecture binadder of binadder is
    signal state: integer range 0 to 3;
    signal sum,cin:bit;
begin
    sum<= (x(0) xor y(0)) xor cin;
    co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);

    process
    begin
        wait until clk='0';
        case state is
            when 0=>
                if(n='1') then
                    state<=1;
                end if;
            when 1|2|3=>
                if(sh='1') then
                    x<= sum & x(3 downto 1);
                    y<= y(0) & y(3 downto 1);
                    cin<=co;
                end if;
                if(state=3) then
                    state<=0;
                end if;
        end case;
    end process;

    done<='1' when state=3 else '0';
end binadder;

A saída:

- Compilando arquitetura binadder de binadder

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (15):

Não há entradas viáveis ??para operador infix "Xor".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (15):

Erro Tipo resolver expressão infix "Xor" como tipo std.standard.bit.

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Não há entradas viáveis ??para operador infix "E".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

expressão Bad no operando direito de expressão infix "ou".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Não há entradas viáveis ??para operador infix "E".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

expressão Bad no operando à esquerda do expressão infix "ou".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

expressão Bad no operando direito de expressão infix "ou".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Erro Tipo resolver expressão infix "Ou" como tipo std.standard.bit.

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (28):

Não há entradas viáveis ??para operador infix "&".

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (28):

Erro Tipo resolver expressão infix "&" Como tipo ieee.std_logic_1164.std_logic_vector.

** Erro: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (39):

VHDL Compiler sair

Eu acredito que eu não estou lidando std_logic_vector de corretamente. Por favor, diga-me como? : (

Foi útil?

Solução

Uma das características de VHDL é que muito pouca funcionalidade é fornecida no próprio idioma base. A maior parte é fornecida pelo uso de pacotes. A segunda linha de seu código é um exemplo disso (utilizar ieee.std_logic_1164.all). Isso significa que você está usando todo o pacote std_logic_1164. Consulte aqui para o que este pacote define.

Quando você escrever o código, geralmente você deseja armazenar seus sinais em qualquer std_logic ou std_logic_vector. Há duas razões para isso. A primeira é que um std_logic também pode representar outros do que '0' ou '1' valores. Pode também representar 'Z' ou 'X' por exemplo. A segunda é que os simuladores (como modelsim que você está usando) são otimizados para executar mais rápido com std_logic.

Como uma convenção geral, é boa prática para sempre fazer as entradas e saídas de sua entidade um std_logic ou std_logic_vector.

O problema específico que você está tendo é que você está usando o bit tipo (que é um dos poucos tipos definidos na norma VHDL) com xor.

A solução mais simples é para alterar a saída co na sua entidade a ser do tipo std_logic e alterar a declaração de soma e cin para ser do tipo std_logic.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:inout std_logic;
         done:out bit);
end binadder;

    signal sum,cin:std_logic;

Uma outra observação é que geralmente é má prática para fazer as suas portas inout menos que você tenha uma boa razão para fazê-lo, pois isso tira parte da rigorosa verificação de tipo que é construído dentro da linguagem. A melhor solução é criar um sinal dentro da própria entidade e atribuir o sinal diretamente para a saída.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:out std_logic;
         done:out bit);
end binadder;

    signal co_int:std_logic;
 begin
    co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
    co <= co_int;

Um comentário final é que uma vez que o valor de estado é 1, como é que vai nunca se tornar 2 ou 3?

Outras dicas

Dê uma olhada em seus mapeamentos de biblioteca lógico-físicas.

Verifique se a biblioteca física realmente tem os pacotes despejados.

Certifique-se de que você não está usando uma versão diferente do cabeçalho pré-compilado com uma versão diferente do simulador.

Se as obras nada, apenas fazer uma cópia local do IEEE, compilar os pacotes std_logic_1164 nele, mover a biblioteca de trabalho e, em seguida, compilar o seu design. Este tem ao trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top