2013-03-17 2 views
1

Я первый пользователь, поэтому, пожалуйста, несите меня.Ошибка тестирования 8-бит LFSR, записанный на VHDL

Часть простой игры, которую мы должны выполнить для назначения, включает в себя запись генератора псевдослучайных чисел в виде 8-битного LFSR. Я пишу свой код с помощью Xilinx ISE, мои заметки и пример, приведенный здесь:

http://www.oocities.org/siliconvalley/screen/2257/vhdl/lfsr/lfsr.html

Теперь код делает синтезировать, но дает мне предупреждения, касающиеся списка чувствительности. Однако, когда я запускаю тестовый стенд, я получаю все значения U для pseudo_rand. Я понимаю, что этот генератор случайных чисел будет внутренним, поэтому не должно быть выхода, но когда я пишу код с псевдо-графом в качестве сигнала (этот вариант в настоящее время прокомментирован), он не отображается в симуляции.

Ниже приведен код для ЛРСОС следует код для соответствующего испытательного стенда:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity LFSR_3_16_2013 is 
port(  clk:   in std_logic; 
      rst:   in std_logic; 
      pseu_rand: out std_logic_vector(7 downto 0)); 
end LFSR_3_16_2013; 

architecture Behavioral of LFSR_3_16_2013 is 
--signal  clk:   std_logic; 
--signal  rst:   std_logic; 
signal   seed:   std_logic_vector(7 downto 0):= "10000000"; 
signal   biffer:   std_logic_vector(7 downto 0); 
--signal  pseu_rand:  std_logic_vector(7 downto 0); 

begin 

lfsr : PROCESS(clk,rst) 
begin 
    if(rst='0') then 
    --pseu_rand <= seed; 

    biffer  <= seed; 
    pseu_rand <= biffer; 

    elsif (clk'event and clk='1') then 
    --pseu_rand(0)    <= pseu_rand(7) xor pseu_rand(6);      
    --pseu_rand(7 downto 1)  <= pseu_rand(6 downto 0); 

    biffer(0)     <= biffer(7) xor biffer(6);      
    biffer(7 downto 1)   <= biffer(6 downto 0); 
    pseu_rand     <= biffer; 

    end if; 

    end process lfsr; 
end Behavioral; 

А теперь испытательный стенд:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY LFSR_tb_3_16_2013 IS 
END LFSR_tb_3_16_2013; 

ARCHITECTURE behavior OF LFSR_tb_3_16_2013 IS 

    -- Component Declaration for the Unit Under Test (UUT) 

    COMPONENT LFSR_3_16_2013 
    PORT(
     clk  : IN std_logic; 
     rst  : IN std_logic; 
     pseu_rand : OUT std_logic_vector(7 downto 0) 
     ); 
    END COMPONENT; 


    --Inputs 
    signal clk : std_logic := '0'; 
    signal rst : std_logic := '0'; 

    --Outputs 
    signal pseu_rand : std_logic_vector(7 downto 0); 

    -- Clock period definitions 
    constant clk_period : time := 10 ns; 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 
    uut: LFSR_3_16_2013 PORT MAP (
      clk => clk, 
      rst => rst, 
      pseu_rand => pseu_rand 
     ); 

    -- Clock process definitions 
    clk_process :process 
    begin 
     clk <= '0'; 
    wait for clk_period/2; 
    clk <= '1'; 
    wait for clk_period/2; 
    end process; 


    -- Stimulus process 
    stim_proc: process 
    begin   
     -- hold reset state for 100 ns. 
     wait for 100 ns; 

     wait for clk_period*10; 

     -- insert stimulus here 
     rst <= '1'; 

     wait; 
    end process; 

END; 

Любая помощь будет принята с благодарностью, я довольно сильно.

Спасибо, Юсиф Нуризаде

+0

Я наклеил ваш код, скомпилировал и запустил его. Кажется, что работает (нет нас для меня) ... –

ответ

0

список чувствительности сообщает процессу о том, какие действия он должен «проснуться». это означает, что ваш процесс реагирует только на активность clk или rst сигнал. поэтому pseu_rand - это все «U», пока не появится первый фронт часов. Это не проблема для синтезируемого кода. однако, если вы хотите изменить это, добавьте семена и biffer в список чувствительности.

lfsr : PROCESS(clk,rst,seed,biffer) 

кстати. если вы используете решение сигнала (прокомментированное), вы определяете pseu_rand напрямую с семенами и не более biffer ... поэтому он определен в вашей симуляции с самого начала!

+0

Спасибо за ваш совет! Прошу прощения за поздний ответ, закончив тем, что ушел в офисные часы и догнал задания, которые я отложил, чтобы проверить на форумах. Школа почти закончилась, будет участвовать намного быстрее! –

0

Я думаю, что произошло, когда вы раскомментировали код, связанный с pseu_rand, , вы дважды присвоили значение во время сброса.

pseu_rand <= seed; 

и

pseu_rand <= biffer; 

В процессе оценки заявления процесса, последнее назначение будет перекрывать предыдущее назначение (ы) для параллельных сигналов. В результате «pseu_rand» получит «U» после первого сброса, так как «biffer» не был определен в начале.

Чтобы исправить это, просто удалите второе назначение pseu_rand.

+0

Спасибо за ваш совет! Прошу прощения за поздний ответ, закончив тем, что ушел в офисные часы и догнал задания, которые я отложил, чтобы проверить на форумах. Школа почти закончилась, будет участвовать намного быстрее! –

0

Ваши текущие проблемы с чувствительностью связаны с асинхронной нагрузкой семян на бифур и бифференциал в pseu_rand. Вы, вероятно, не хотите ни того, ни другого.

Вы используете Семя как постоянную, поэтому сделайте ее одной.Это фиксирует первую асинхронную нагрузку:
постоянное семя: std_logic_vector (7 downto 0): = "10000000";

Чтобы исправить второй, в процессе удалите два назначения: pseu_rand < = biffer;

Теперь вне процесса добавьте задание: pseu_rand < = biffer;

Все сделано.

Jim

+0

Спасибо за ваш совет! Прошу прощения за поздний ответ, закончив тем, что ушел в офисные часы и догнал задания, которые я отложил, чтобы проверить на форумах. Школа почти закончилась, будет участвовать намного быстрее! –