Поведенческий в FlipFlop Структурный

В этом коде, когда reset равно 1, s становится 1000, а когда reset равно 0, s становится 0100, тогда 0010, затем 0001, и все начинается сначала с 1000 в качестве начального значения, только если часы идут вверх.

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all; 


entity clock_behav is
  port (clock  : in  std_logic;
          reset   : in  std_logic;
          s  : out std_logic_vector (3 downto 0));
end clock_behav;

architecture behav of clock_behav is
begin
process(clock,reset)
variable shift_counter: integer := 0;
begin
if (reset='1') then
    s<="1000";
    shift_counter := 1;
else
    if(clock'event and clock='1') then
        if(shift_counter =1) then
            s<="0100";
            shift_counter := 2;
        elsif(shift_counter =2) then
            s<="0010";
            shift_counter := 3;
        elsif(shift_counter =3) then
            s<="0001";
            shift_counter := 0;
        else
            s<="1000";
            shift_counter := 1;
        end if;
    end if;

end if;
end process;
end behav;

Я хочу создать это введите описание изображения здесьс FlipFlops, как вы видите, один Set и 3 Reset. Но я изо всех сил пытаюсь перейти от поведенческого к структурному, потому что в VHDL мы не можем иметь карты портов в процессе. Я конечно много чего перепробовал, как вы можете видеть ниже, но пересоздать его с помощью флипфлопов невозможно, если карты портов не находятся внутри процесса. Как вы понимаете, мои познания в VHDL не так уж и велики. Кроме того, я хочу, чтобы вы сказали мне, правильно ли я поступил, когда изменил типы триггеров D и Q, это был std_logic, а я изменил его на std_logic_vector. Я сделал это для целей данного упражнения.

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all; 


entity clock_structural is
  port (clock  : in  std_logic;
          reset   : in  std_logic;
          s  : out std_logic_vector (3 downto 0));
end clock_structural;


architecture behavior of clock_structural is
signal t,t1,t2,t3 : std_logic_vector (3 downto 0);
component flipflop_new
port
 (D : in std_logic_vector (3 downto 0);
 CLK : in std_logic;
 CLR : in std_logic;
 Q : out std_logic_vector (3 downto 0));
end component;

component flipflop_set
port
 (D_s : in std_logic_vector (3 downto 0);
 CLK_s : in std_logic;
 CLR_s : in std_logic;
 Q_s : out std_logic_vector (3 downto 0));
end component;
begin
process(clock,reset)
variable shift_counter: integer := 0;
begin
if (reset='1') then
    t<="1000";  

    shift_counter := 1;
else
    if(clock'event and clock='1') then
        if(shift_counter =1) then
            shift_counter := 2;
        elsif(shift_counter =2) then
            shift_counter := 3;
        elsif(shift_counter =3) then
            shift_counter := 0;
        else
            shift_counter := 1;
        end if;
end if;

end if;

end process;

FFS1: flipflop_set port map(t,clock,reset,t1);
s<=t1;
FFR1: flipflop_new port map(t1,clock, reset,t2);
s<=t2;
FFR2: flipflop_new port map(t2,clock, reset,t3);
s<=t3;
FFR3: flipflop_new port map(t3,clock, reset,s);

end behavior ;



library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all; 

entity flipflop_new is
 port ( D : in std_logic_vector (3 downto 0);
 CLK : in std_logic;
 CLR : in std_logic;
 Q : out std_logic_vector (3 downto 0)
 );
end flipflop_new; 


architecture behavior of flipflop_new is
begin
process(CLK)
begin
if CLR='0' then null;
elsif RISING_EDGE(CLK) then
Q <= D;
end if;
end process ;
end behavior ;

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all; 

entity flipflop_set is
 port ( D_s : in std_logic_vector (3 downto 0);
 CLK_s : in std_logic;
 CLR_s : in std_logic;
 Q_s : out std_logic_vector (3 downto 0)
 );
end flipflop_set; 


architecture behavior of flipflop_set is
begin
process(CLK_s)
begin
if CLR_s='1' then null;
elsif RISING_EDGE(CLK_s) then
Q_s <= D_s;
end if;
end process ;
end behavior ;

person Manolis Pap    schedule 18.05.2015    source источник


Ответы (1)


Есть несколько вещей, которые нужно изменить или улучшить. Структурная модель VHDL должна описывать вашу схему, чего вы на самом деле не делаете.

Во-первых, почему у вас есть shift_counter в вашей структуре? Вам не нужен этот процесс.

Во-вторых, вы создаете 4 объекта триггера, каждый из которых имеет ширину 4 бита, в то время как ваша схема имеет 4 триггера. По сути, вы создаете в общей сложности 16 регистров, когда вам нужно 4. Почему ваша модель триггера имеет ширину 4 бита? Это должен быть один бит.

В-третьих, посмотрите на описание своего триггера:

process(CLK)
begin
    if CLR='0' then
        null;
    elsif RISING_EDGE(CLK) then
        Q <= D;
    end if;
end process ;

Кажется, что делает триггер? Q <= D при повышении часов нормально, но ничего не происходит, когда активен clr триггера? В этом случае ваш вывод должен сбрасываться/устанавливаться, а это не то, что описывает ваш VHDL.

Другая ошибка заключается в том, что вы назначаете свой вывод s 3 раза. s должен быть назначен один раз, но вы можете назначить бит индивидуально, как s(0) <= t1.

Наконец, вы не описываете обратную связь. Выход вашего последнего триггера равен s, а вход первого триггера — t. Судя по вашей схеме, они должны быть соединены вместе.

person Jonathan Drolet    schedule 18.05.2015
comment
Один вопрос, прежде чем я продолжу, нужен ли мне вообще этот процесс, или я должен использовать только карту портов? - person Manolis Pap; 18.05.2015
comment
Вам не нужен процесс в структуре. Вам, конечно, нужен один в описании триггера. - person Jonathan Drolet; 18.05.2015
comment
У меня проблема с триггером, потому что мой учитель дал сущность с этими переменными, и нам нужно было написать архитектуру. И вы сказали, что мне нужно установить/сбросить, которого у меня нет. - person Manolis Pap; 18.05.2015
comment
У вас есть это, CLR для триггера сброса и CLR_s для триггера установки - person Jonathan Drolet; 18.05.2015
comment
Спасибо за ваши предложения, я исправил это! - person Manolis Pap; 18.05.2015