用modelim在vhdl中注册Design

时间:2019-01-05 18:29:08

标签: vhdl

我正在尝试在modelSim中编写寄存器vhdl代码,我的代码在这里:

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)Command+Shift+P or Ctrl+Shift+P(⇧⌘P),我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的代码有问题

  • 信号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 ...
  • 如果在工具中启用了VHDL-2008,则可以避免附加信号r_reg。 在VHDL-2008中,您可以从输出端口读回值。