Vhdl 利用结构设计制作上下计数器

Vhdl 利用结构设计制作上下计数器,vhdl,counter,Vhdl,Counter,我试着用结构设计制作一个4位上下计数器。 我的代码如下: entity counter4bit is Port ( clock : in STD_LOGIC; reset : in STD_LOGIC; load : in STD_LOGIC; enable : in STD_LOGIC; counterOut : out STD_LOGIC_VECTOR (3 downto 0);

我试着用结构设计制作一个4位上下计数器。 我的代码如下:

entity counter4bit is
    Port ( clock : in  STD_LOGIC;
           reset : in  STD_LOGIC;
           load : in  STD_LOGIC;
           enable : in  STD_LOGIC;
           counterOut : out  STD_LOGIC_VECTOR (3 downto 0);
           updown : in  STD_LOGIC);
end counter4bit;

architecture Behavioral of counter4bit is

component D_FlipFlop
    Port ( d : in  STD_LOGIC;
           reset : in  STD_LOGIC;
           clock : in  STD_LOGIC;
           load : in  STD_LOGIC;
           enable : in  STD_LOGIC;
           updown : in  STD_LOGIC;
           q : out  STD_LOGIC);
end component;

component MUX 
    Port ( i0 : in  STD_LOGIC; 
           i1 : in  STD_LOGIC; 
           i2 : in  STD_LOGIC; 
           i3 : in  STD_LOGIC;
           inload : in  STD_LOGIC;
           bitout : out  STD_LOGIC;
           load : in  STD_LOGIC;
           updown : in  STD_LOGIC;
           en : in  STD_LOGIC);
end component;

signal w: std_logic_vector(3 downto 0);
signal cnt : std_logic_vector(3 downto 0);

begin

FF0 : D_FlipFlop
    port map( d => w(0),
                 reset => reset,
                 clock =>clock,
                 load => load,
                 enable => enable,
                 updown => updown,
                 q => cnt(0) );

FF1 : D_FlipFlop
    port map( d => w(1),
                 reset => reset,
                 Clock => clock,
                 load => load,
                 enable => enable,
                 updown => updown,
                 q => cnt(1));

FF2 : D_FlipFlop
    port map( d => w(2),
                 reset => reset,
                 clock => clock,
                 load => load,
                 enable => enable,
                 updown => updown,
                 q => cnt(2));

FF3 : D_FlipFlop
    port map( d => w(3),
                 reset => reset,
                 clock => clock,
                 load => load,
                 enable => enable,
                 updown => updown,
                 q => cnt(3));

MUX0 : MUX
    port map( i0 => '1',
                 i1 => '1',
                 i2 => '1',
                 i3 => cnt(0),
                 inload => '1',
                 bitout =>w(0) ,
                 load => load,
                 updown => updown,
                 en => enable);

MUX1 : MUX
    port map( i0 => cnt(0),
                 i1 =>'1',
                 i2 => '1',
                 i3 => cnt(1),
                 inload => '1',
                 bitout =>w(1) ,
                 load => load,
                 updown => updown,
                 en => enable); 

MUX2 : MUX
    port map( i0 => cnt(0),
                 i1 => cnt(1),
                 i2 =>  '1',
                 i3 => cnt(2),
                 inload => '0',
                 bitout =>w(2) ,
                 load => load,
                 updown => updown,
                 en => enable);

MUX3 : MUX
    port map( i0 => cnt(0),
                 i1 => cnt(1),
                 i2 =>cnt(2),
                 i3 => cnt(3),
                 inload => '0',
                 bitout =>w(3) ,
                 load => load,
                 updown => updown,
                 en => enable);

counterOut <= cnt ;

end Behavioral;
实体计数器4位为
端口(时钟:标准_逻辑中;
复位:在标准逻辑中;
负载:在标准逻辑中;
启用:在STD_逻辑中;
计数器输出:输出标准逻辑向量(3到0);
向上向下:在标准逻辑中);
端部计数器4位;
counter4bit的体系结构是
分量D_触发器
端口(d:标准逻辑中的;
复位:在标准逻辑中;
时钟:标准逻辑;
负载:在标准逻辑中;
启用:在STD_逻辑中;
向上向下:在标准逻辑中;
q:输出标准(U逻辑);
端部元件;
组件多路复用器
端口(i0:标准_逻辑中;
i1:标准逻辑中;
i2:标准逻辑中;
i3:标准逻辑中;
内装:在标准逻辑中;
bitout:输出标准逻辑;
负载:在标准逻辑中;
向上向下:在标准逻辑中;
en:标准逻辑中);
端部元件;
信号w:标准逻辑向量(3到0);
信号cnt:std_逻辑_向量(3到0);
开始
FF0:D_触发器
端口映射(d=>w(0),
重置=>重置,
时钟=>时钟,
加载=>加载,
enable=>enable,
向上向下=>向上向下,
q=>cnt(0));
FF1:D_触发器
端口映射(d=>w(1),
重置=>重置,
时钟=>时钟,
加载=>加载,
enable=>enable,
向上向下=>向上向下,
q=>cnt(1));
FF2:D_触发器
端口映射(d=>w(2),
重置=>重置,
时钟=>时钟,
加载=>加载,
enable=>enable,
向上向下=>向上向下,
q=>cnt(2));
FF3:D_触发器
端口图(d=>w(3),
重置=>重置,
时钟=>时钟,
加载=>加载,
enable=>enable,
向上向下=>向上向下,
q=>cnt(3));
MUX0:MUX
端口映射(i0=>1),
i1=>“1”,
i2=>“1”,
i3=>cnt(0),
inload=>“1”,
比特=>w(0),
加载=>加载,
向上向下=>向上向下,
en=>启用);
MUX1:MUX
端口映射(i0=>cnt(0),
i1=>'1',
i2=>“1”,
i3=>cnt(1),
inload=>“1”,
比特=>w(1),
加载=>加载,
向上向下=>向上向下,
en=>启用);
MUX2:MUX
端口映射(i0=>cnt(0),
i1=>cnt(1),
i2=>“1”,
i3=>cnt(2),
inload=>“0”,
比特=>w(2),
加载=>加载,
向上向下=>向上向下,
en=>启用);
MUX3:MUX
端口映射(i0=>cnt(0),
i1=>cnt(1),
i2=>cnt(2),
i3=>cnt(3),
inload=>“0”,
比特=>w(3),
加载=>加载,
向上向下=>向上向下,
en=>启用);
反击
当我模拟它时,它从0开始,因为它应该会导致重置,然后计数到1,然后再次为0。我不明白为什么它在1之后返回到0

我修改了昨天的测试台以复制您的波形:

我必须用一组“0”到“1”和“1”到“0”的增量循环修改重置,以使计数器输出显示为所有“0”

首先要注意的是,重置极性错误

修正,给出:

我们可以看到计数没有正确地增加,仍然停止

在不进入负载极性的情况下,停滞值是由MUX中过程的灵敏度列表引起的:

process(sel, x)
    begin 
        if sel = "00" then x<= i3;
        elsif sel = "01" then x <= (not i3);
        else    x <= inload;
        end if;
    end process;
    bitout <= x ;
end Behavioral;
这就产生了:

它仍然缺少增量显示,但确实得到了改变

将testbench中的load值更改为“0”会显示计数器上缺少的事务,但这些值仍然错误:

这告诉我们要么你的选择方程是错误的,要么你的多路复用器输入是错误的,或者两者的组合

无论如何,MUX似乎是您应该集中精力的地方

因此,通过在MUX中输入您在评论中告诉我们的更改,您可以得到一个正确的计数:

-- sel(0) <= not load;
-- sel(1) <= y or z ;
sel(1) <= (not load);  -- per comments
sel(0) <= y or z; 
这给了我们:

请注意,此波形尚未测试负载或启用(false),但它会向上计数,然后成功返回


D_触发器上还有一些未使用的端口(加载、启用、向上向下)。

我希望计数器从0000计数到1111,再向下计数到0。你的意思是我的多路复用器代码错了?我发现了错的地方是选择。我的问题是现在它只算起来了。当它达到1111时,它会变成0000,但我想要1110。你知道我要做什么更改吗?不更改MUX的源代码,向我们显示对所选内容的更改。您是否在达到“1111”后向上/向下切换?请注意,
y中的i0、i1和i2值之间没有差异是的,您是对的。这意味着如果我做了z
process(sel, x)
    begin 
        if sel = "00" then x<= i3;
        elsif sel = "01" then x <= (not i3);
        else    x <= inload;
        end if;
    end process;
    bitout <= x ;
end Behavioral;
 process (sel, i3, inload) -- was (sel, x) -- incorrect sensitivity list
-- sel(0) <= not load;
-- sel(1) <= y or z ;
sel(1) <= (not load);  -- per comments
sel(0) <= y or z; 
y <= updown and i0 and i1 and i2 and en;
z <= not updown and i0 and i1 and i2 and en;
z <= not updown and not i0 and not i1 and not i2 and en;
MUX0 : MUX
    port map( i0 => updown, -- '1'
                 i1 => updown, -- '1',
                 i2 => updown, -- '1',
                 i3 => cnt(0),
                 inload => '1',
                 bitout =>w(0) ,
                 load => load,
                 updown => updown,
                 en => enable);

MUX1 : MUX
    port map( i0 => cnt(0),
                 i1 => updown,  -- '1',
                 i2 => updown, -- '1',
                 i3 => cnt(1),
                 inload => '1',
                 bitout =>w(1) ,
                 load => load,
                 updown => updown,
                 en => enable); 

MUX2 : MUX
    port map( i0 => cnt(0),
                 i1 => cnt(1),
                 i2 => updown, -- '1',
                 i3 => cnt(2),
                 inload => '0',
                 bitout =>w(2) ,
                 load => load,
                 updown => updown,
                 en => enable);