2015-04-24 3 views
0

Я пытаюсь создать код БЧХ как регистр сдвига, поэтому у меня есть эта схема:Design сдвиговый регистр в VHDL

BCH Code Shift Register (кликабельны)

И я сделал код VHDL в Altera Quartus для создания этого сдвигового регистра с циклами, компиляция работает, но не дает ожидаемого результата во время моделирования в ModelSim (без вывода). У меня могут быть некоторые ошибки в моем коде:

-- Library declaration 
LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.std_logic_arith.ALL; 
USE IEEE.std_logic_unsigned.ALL; 


-- Entity declaration 
ENTITY bchcode_implementation_top IS 

PORT(clk : IN std_logic;      
    Q : OUT std_logic_vector(7 downto 0)); 

END bchcode_implementation_top; 


-- Architecture declaration 
ARCHITECTURE arch_bchcode_implementation_top OF bchcode_implementation_top IS 

SIGNAL M: std_logic_vector(7 downto 0) := "10000000"; 

BEGIN 
PROCESS(clk) 

    VARIABLE W: std_logic; 
    VARIABLE D: std_logic_vector(7 downto 0) := "00000000"; 

     BEGIN 
      loop_bchcode: FOR I IN 7 TO 0 LOOP 
       IF rising_edge(clk) THEN 
        W := D(0) XOR M(I); 
        D(7) := W; 
        D(6) := D(7); 
        D(5) := D(6); 
        D(4) := D(5); 
        D(3) := D(4) XOR W; 
        D(2) := D(3); 
        D(1) := D(2) XOR W; 
        D(0) := D(1) XOR W; 
       END IF; 
      Q <= D; 
     END LOOP loop_bchcode; 
END PROCESS; 

END arch_bchcode_implementation_top; 

Если у кого-то есть идея, пожалуйста. Благодарю вас за ваш ответ.

+3

Переменные присваиваются немедленно. Например, если 'D (6): = D (7)', а затем 'D (5): = D (6)', 'D (5)' будет равно 'D (7)'. Это означает, что значение 'D (6)' было уничтожено, и вы должны изменить порядок присвоений. Поэтому, если вы хотите использовать переменные, порядок назначения должен быть 'D (0)', 'D (1)', ..., 'D (7)'. – Amir

+0

Спасибо за ваш ответ, я изменил для всех D, но у меня все еще нет ожидаемого результата. Если кто-то скажет мне, есть ли другие ошибки в моем коде, пожалуйста, спасибо – Gilstaills

ответ

0

В соответствии с вашим кодом, я думаю, что вы хотите создать следующую схему: enter image description here

Как я уже говорил в приведенном выше комментарии, если вы хотите использовать переменные (вместо сигналов), вы должны изменить порядок назначений.

Также диапазон петли должен быть 7 DOWNTO 0 (вместо 7 TO 0).

Выход готов к работе через 1 цикл. Если вы хотите выполнить операцию в 8 циклов, вы должны использовать счетчик, который увеличивается на каждом фронте нарастания. (вместо использования for loop)

Я отредактировал ваш код с вышеуказанными изменениями и смоделировал его с помощью Modelsim 10.3. Я мог бы получить правильный результат на первом нарастающем фронте тактового:

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 

-- Entity declaration 
ENTITY bchcode_implementation_top IS 
    PORT(
     clk : IN std_logic;      
     Q : OUT std_logic_vector(7 DOWNTO 0) 
    ); 
END bchcode_implementation_top; 


-- Architecture declaration 
ARCHITECTURE arch_bchcode_implementation_top OF bchcode_implementation_top IS 
    SIGNAL M : std_logic_vector(7 DOWNTO 0) := "10000000"; 
BEGIN 

    PROCESS(clk) 
     VARIABLE I : integer; 
     VARIABLE W : std_logic; 
     VARIABLE D : std_logic_vector(7 DOWNTO 0) := "00000000"; 
    BEGIN 
     loop_bchcode: FOR I IN 7 DOWNTO 0 LOOP 
      IF rising_edge(clk) THEN 
        W := D(0) XOR M(I); 
        D(0) := D(1) XOR W; 
        D(1) := D(2) XOR W; 
        D(2) := D(3); 
        D(3) := D(4) XOR W; 
        D(4) := D(5); 
        D(5) := D(6); 
        D(6) := D(7); 
        D(7) := W; 
      END IF; 
     END LOOP loop_bchcode; 
     Q <= D; 
    END PROCESS; 

END arch_bchcode_implementation_top; 
+0

Большое спасибо за ваш ответ. Когда я компилирую Quartus, у меня мало ошибок: «Невозможно зарегистрировать регистр для D [5], потому что он не сохраняет свое значение вне края тактового сигнала». (также для D [6] и D [7]) – Gilstaills

+0

И когда я имитирую код, это работает, но результаты не совпадают с результатами, вычисленными теоретически, приведенными здесь http://www.noelshack.com/2015- 18-1430179107-bchcode-crc-implementation.jpeg (от D7 до D0) – Gilstaills

0

я, наконец, исправить эту проблему, вот мой код, чтобы описать регистр сдвига для кода БЧХ (15,7), спасибо Amir за вашу помощь ,

-- Library declaration 
LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.numeric_std.ALL; 



-- Entity declaration 
ENTITY bchcode_implementation_top IS 

PORT(clk, rst : IN std_logic; 
Din : IN std_logic_vector(7 downto 0); 
    Dout : BUFFER std_logic_vector(7 downto 0)); -- OUT port cannot be read back to the design 

END bchcode_implementation_top; 


-- Architecture declaration 
ARCHITECTURE arch_bchcode_implementation_top OF bchcode_implementation_top IS 

SIGNAL count : std_logic_vector(7 downto 0); 

BEGIN 
PROCESS(clk, rst, Din) 

VARIABLE I : integer := 7; 

BEGIN 
    count <= Din; 

     IF rst = '1' THEN 
      Dout <= "00000000"; 
     ELSE 
      IF rising_edge(clk) THEN 
       Dout(0) <= Dout(1) XOR (Dout(0) XOR count(I)); 
       Dout(1) <= Dout(2) XOR (Dout(0) XOR count(I)); 
       Dout(2) <= Dout(3); 
       Dout(3) <= Dout(4) XOR (Dout(0) XOR count(I)); 
       Dout(4) <= Dout(5); 
       Dout(5) <= Dout(6); 
       Dout(6) <= Dout(7); 
       Dout(7) <= Dout(0) XOR count(I); 
       I := I - 1; 
      END IF; 
     END IF; 

END PROCESS; 

END arch_bchcode_implementation_top; 
Смежные вопросы