Задать вопрос
@roflanPominki

Правильно ли написан Синхронный сдвиговой регистр на D-триггерах?

Мое задание звучит следующим образом:
Синхронный сдвиговой регистр на D-триггерах с управлением по переднему фронту и асинхронным сбросом в "1010". Стиль описания - Структурный стиль
. Так же картинка со схемой
6636653130fdc519059728.png
Я используя программу для генерации кода по схеме получил следующий код:
LIBRARY ieee;
USE ieee.std_logic_1164.all;

entity DIG_D_FF_AS is
  
  port (
    Q: out std_logic;
    notQ: out std_logic;
    Set: in std_logic;
    D: in std_logic;
    C: in std_logic;
    Clr: in std_logic );
end DIG_D_FF_AS;

architecture Behavioral of DIG_D_FF_AS is
   signal state : std_logic := '0';
begin
    process (Set, Clr, C)
    begin
        if (Set='1') then
            state <= NOT('0');
        elsif (Clr='1') then
            state <= '0';
        elsif rising_edge(C) then
            state <= D;
        end if;
    end process;

    Q <= state;
    notQ <= NOT( state );
end Behavioral;


LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

entity main is
  port (
    CLK: in std_logic;
    RESET: in std_logic;
    Q1: out std_logic;
    Q2: out std_logic;
    Q3: out std_logic;
    Q4: out std_logic);
end main;

architecture Behavioral of main is
  signal Q4_temp: std_logic;
  signal Q1_temp: std_logic;
  signal Q2_temp: std_logic;
  signal Q3_temp: std_logic;
begin
  gate0: entity work.DIG_D_FF_AS -- DFF1
    port map (
      Set => RESET,
      D => Q4_temp,
      C => CLK,
      Clr => RESET,
      Q => Q1_temp);
  gate1: entity work.DIG_D_FF_AS -- DFF2
    port map (
      Set => RESET,
      D => Q1_temp,
      C => CLK,
      Clr => RESET,
      Q => Q2_temp);
  gate2: entity work.DIG_D_FF_AS -- DFF3
    port map (
      Set => RESET,
      D => Q2_temp,
      C => CLK,
      Clr => RESET,
      Q => Q3_temp);
  gate3: entity work.DIG_D_FF_AS
    port map (
      Set => RESET,
      D => Q3_temp,
      C => CLK,
      Clr => RESET,
      Q => Q4_temp);
  Q1 <= Q1_temp;
  Q2 <= Q2_temp;
  Q3 <= Q3_temp;
  Q4 <= Q4_temp;
end Behavioral;

Схема по которой сгенерирован код:
663665a42ed87497294424.png
P.S Я максимально не понимающий в этой теме человек. Поэтому даже не знаю радоваться ли результату или нет.
  • Вопрос задан
  • 416 просмотров
Подписаться 2 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 1
@atereffigies
Хз, как там на этом старческом VHDL будет, но на system verilog как-то так:
module sreg
(
	clk,
	nrst,
	
	q
);

input	clk, nrst;
output	logic [3:0] q;

always_ff @(posedge clk or negedge nrst)
if (~nrst)
	q <= 4'b1010;
else
	begin
	q[0] <= q[3];
	q[3:1] <= q[2:0];
	end

endmodule


Ну естественно, подгоните под своё. Т.к. мне вера не позволяет писать переменные с большой буквы, сброс писать как RESET (да ещё с активным нулём), ну и нумировать биты регистры с первого, а не с нулевого.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы