Найдена 1-битная защелка для сигналов и предупреждений о постоянных значениях - PullRequest
2 голосов
/ 21 февраля 2012

Я уже два дня пытаюсь отладить этот VHDL-код, но я просто не вижу, в чем ошибка.Вот код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity SSDDriver is
    Port ( cp : in std_logic;
              iin : in std_logic;
              an : buffer std_logic_vector (3 downto 0);
              --7=a, 6=b ...
              segments: out std_logic_vector (7 downto 0));
end SSDDriver;

architecture Behavioral of SSDDriver is
    signal cpo : std_logic;
    --broj BCD znamenki
    constant BCD_NUMBERS : integer := 4;
    --broj bitova ulaznog broja
    constant BITS : integer := 14;
    --broj kodiran BCD-om
    signal BCDNumber : std_logic_vector (BCD_NUMBERS*4-1 downto 0) := (others => '0');
    signal BCDForDecoder: std_logic_vector (3 downto 0);
    signal number: integer range  0 to 9999;
begin
    decoder: entity BCDToSSD port map (bcd => BCDForDecoder, segm => segments (7 downto 1));
    counter: entity djelitelj generic map (COUNTTO => 25000) port map (cpIn => cp, CpOut=> cpo);
    --tocka je uvijek ugasena
    segments(0) <= '1';

    process (iin)
    begin
        if iin='1' then
            number<=3245;
        else
            number<=1111;
        end if;
    end process;

    SwitchDisplay: process (cpo)
    begin
        if rising_edge(cpo) then
            if an="0111" then
                an<="1011";
                BCDForDecoder<=BCDNumber(11 downto 8);
            elsif an="1011" then
                an<="1101";
                BCDForDecoder<=BCDNumber(7 downto 4);
            elsif an="1101" then
                an<="1110";
                BCDForDecoder<=BCDNumber(3 downto 0);
            else
                an<="0111";
                BCDForDecoder<=BCDNumber(15 downto 12);
            end if;
        end if;
    end process SwitchDisplay;

    DoubleDabble: process (number)
        variable num : std_logic_vector (BITS-1 downto 0);
        variable bcd : std_logic_vector (BCD_NUMBERS*4-1 downto 0) := (others => '0');
        variable old_number: integer range 0 to 9999;
    begin
        if number/= old_number then
            num := conv_std_logic_vector(number, BITS);

            for i in 0 to BITS-1 loop
                bcd(BCD_NUMBERS*4-1 downto 1) := bcd(BCD_NUMBERS*4-2 downto 0);  
                bcd(0) := num(BITS-1);
                num(BITS-1 downto 1) := num(BITS-2 downto 0);
                num(0) :='0';

                if(i < BITS-1  and bcd(3 downto 0) > "0100") then 
                    bcd(3 downto 0) := bcd(3 downto 0) + "0011";
                end if;

                if(i < BITS-1 and bcd(7 downto 4) > "0100") then 
                    bcd(7 downto 4) := bcd(7 downto 4) + "0011";
                end if;

                if(i < BITS-1 and bcd(11 downto 8) > "0100") then 
                    bcd(11 downto 8) := bcd(11 downto 8) + "0011";
                end if;

                if(i < BITS-1 and bcd(15 downto 12) > "0100") then 
                    bcd(15 downto 12) := bcd(15 downto 12) + "0011";
                end if;
            end loop;
            BCDNumber <= bcd;
        else

        end if;

        old_number := number;
    end process DoubleDabble;
end Behavioral;

А здесь генерируются предупреждения:

ПРЕДУПРЕЖДЕНИЕ: Xst: 2734 - Свойство "use_dsp48" не применимо для этой технологии.ВНИМАНИЕ: Xst: 1780 - Сигнал> никогда не используется или не назначается.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 16-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 737 - Найдена 1-битная защелка для сигнала.ВНИМАНИЕ: Xst: 2734 - свойство «use_dsp48» не применимо для этой технологии.ВНИМАНИЕ: Xst: 1426 - Значение init FF / Latch bcd_0 препятствует постоянной очистке в блоке SSDDriver.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ВНИМАНИЕ: Xst: 1293 - FF / Latch имеет постоянное значение 0 в кадре.ПРЕДУПРЕЖДЕНИЕ: Xst: 1710 - FF / Latch

и так далее ...

В результате этих предупреждений, когда я внедряю этот модуль, я получаю только 0000, отображаемый на 4 7-сегментные дисплеи.

Этот код VHDL должен принимать целочисленную переменную (диапазон от 0 до 9999) и отображать это число с помощью 4 7-сегментных дисплеев ...

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

Альтернативой преобразованию в синхронный дизайн является сделать вашу логику действительно асинхронной.

В процессе DoubleDabble просто прокомментируйте самый внешний оператор if, чтобы ваша логика преобразования BCD работала все время, и посмотрите, где этополучает вас.Ваша логика не нуждается в предыдущем целочисленном значении (old_number), и именно сравнение «if number / = old_number» (без использования тактового сигнала и синхронной логики) дает подгонки синтезатора.

4 голосов
/ 21 февраля 2012

Есть ли причина, по которой вы решили выполнять весь процесс преобразования BCD асинхронно?Вот откуда все ваши проблемы с блокировками (Double Dabble Process).

Я почти уверен, что если вы преобразуете это в синхронный процесс, вы должны избавиться от предупреждений "постоянной очистки" и "защелки".

Предупреждение "постоянной очистки" обрежет всеваши защелки к их начальным значениям, поэтому вы все время видите ноль.

Когда вам нужно что-то зарегистрировать на мероприятии или в инстанции, вы должны почти ВСЕГДА использовать часы.У вас может быть разница во времени на наносекунду с того момента, когда этот сигнал станет истинным, и когда часы станут высокими, но, поверьте мне, наличие этого времени с часами спасет вас от многих проблем в будущем.

...