зарегистрировать дизайн в vhdl с modelsim - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь написать регистр VHDL код в ModelSim, мой код здесь:

Library ieee;
use ieee.std_logic_1164.all;
------------------------------
entity reg_8Bit is
Generic(N:integer := 8);

port(clk,reset:in std_logic;
 ctrl:in std_logic_vector(1 downto 0);
 d:in std_logic_vector(n-1 downto 0);
 q:out std_logic_vector(n-1 downto 0);
 d2:out std_logic
 );
end reg_8Bit;
-------------------------------
Architecture arch_8bit of reg_8Bit is
  signal r_reg,r_next:std_logic_vector(n-1 downto 0);

  begin
   process(clk,reset)
     begin
       if(reset = '1') then 
         q <= (others => '0');
       elsif(clk='1' and clk 'event) then
         r_reg <= r_next;
       end if;
   end process;
 with ctrl select
   r_next <= r_reg when "00",
           r_reg(n-2 downto 0) & d(i) when "10",
           d(7) & r_reg(n-1 downto 1) when "01",
           d when others;

   q <= r_reg;
end arch_8bit;

Я хочу создать сдвиг вправо, когда ctrl = "01", и сдвиг влево, когда ctrl = "10" Но я получаю только d(0) или d(7), как я могу это исправить?

1 Ответ

0 голосов
/ 05 января 2019

Проблемы с вашим кодом:

  • Сигнал q является многократным.
  • Вы сбрасываете q, но не r_reg

Улучшенный код:

library ieee;
use     ieee.std_logic_1164.all;
------------------------------
entity reg_8Bit is
  generic(
    N:integer := 8
  );
  port(
    clk   : in  std_logic;
    reset : in  std_logic;
    ctrl  : in  std_logic_vector(1 downto 0);
    d     : in  std_logic_vector(n-1 downto 0);
    q     : out std_logic_vector(n-1 downto 0);
    d2    : out std_logic
  );
end entity;
-------------------------------
architecture arch_8bit of reg_8Bit is
  signal r_reg : std_logic_vector(n-1 downto 0) := (others => '0');
begin
  process(clk,reset)
  begin
    if(reset = '1') then 
      r_reg   <= (others => '0');
    elsif rising_edge(clk) then
      if ctrl = "11" then
        r_reg <= d;
      elsif ctrl = "10" then
        r_reg <= r_reg(r_reg'high - 1 downto r_reg'low) & d(0);
      elsif ctrl = "01" then
        r_reg <= d(7) & r_reg(r_reg'high downto r_reg'low + 1);
      end if;
    end if;
  end process;

  q <= r_reg;
end arch_8bit;

Другие подсказки:

  • Не использовать асинхронный сброс.
  • Используйте rising_edge(clk) вместо clk'event ....
  • Вы можете избежать дополнительного сигнала r_reg, если вы включили VHDL-2008 в своем инструменте. В VHDL-2008 вы можете считывать значения из выходных портов.
...