0

在此代码中,当reset等于1s变为1000,当reset等于0s变为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 创建这个 , oneSet和 3 Reset。但是,我很难从行为转向结构,因为在 VHDL 中我们不能拥有进程端口映射。当然,我尝试了很多东西,如下所示,但如果端口映射不在进程内,就不可能用触发器重新创建它。正如您可以清楚地理解的那样,我对 VHDL 的了解并不是那么好。另外,我想让你告诉我,当我改变触发器DQ类型时,我是否做对了,是的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 ;
4

1 回答 1

1

有几件事需要改变或改进。结构 VHDL 模型应该描述您的原理图,而您实际上并没有这样做。

首先,为什么你有shift_counter你的结构?你不需要那个过程。

其次,您实例化 4 个触发器实体,每个 4 位宽,而您的原理图有 4 个触发器。基本上,当您需要 4 个寄存器时,您总共实例化 16 个寄存器。为什么您的触发器模型是 4 位宽?它应该是一个位。

第三,看你的人字拖描述:

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

人字拖看起来是做什么的?时钟Q <= D上升时很好,但是当触发器处于活动状态时没有任何反应吗?clr在这种情况下,您的输出应该重置/设置,这不是您的 VHDL 描述的。

另一个错误是您将输出分配了s3 次。s必须分配一次,但您可以像s(0) <= t1.

最后,您没有描述反馈。最后一个触发器的输出是s,而第一个触发器的输入是t。从您的原理图中,它们应该连接在一起。

于 2015-05-18T15:14:39.807 回答