行为到触发器结构
Behavioral into FlipFlop Structural
在此代码中,当 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 ;
有几处需要更改或改进。结构 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
处于活动状态时没有发生吗?在这种情况下,您的输出应该 reset/set,这不是您的 VHDL 描述的内容。
另一个错误是您将输出分配 s
3 次。 s
必须分配一次,但您可以像 s(0) <= t1
.
一样单独分配位
最后,你不描述反馈。最后一个触发器的输出是 s
,而第一个触发器的输入是 t
。从你的示意图来看,它们应该连接在一起。
在此代码中,当 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;
我想创建这个
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 ;
有几处需要更改或改进。结构 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
处于活动状态时没有发生吗?在这种情况下,您的输出应该 reset/set,这不是您的 VHDL 描述的内容。
另一个错误是您将输出分配 s
3 次。 s
必须分配一次,但您可以像 s(0) <= t1
.
最后,你不描述反馈。最后一个触发器的输出是 s
,而第一个触发器的输入是 t
。从你的示意图来看,它们应该连接在一起。