以下代码实现了一个两位数的计数器,并在七个段上显示输出。可以看出,在每个时钟周期中,必须改变该值,但模拟结果不显示这样的事情。为了减少代码大小,我只将0和1放在七段驱动程序中。
library ieee;
use ieee.std_logic_1164.all;
entity two_digit_counter is
port( clk: in std_logic;
x, y: out std_logic_vector( 6 downto 0 ));
end;
architecture x of two_digit_counter is
begin
process( clk )
variable d1 : integer range 0 to 9 := 0;
variable d2 : integer range 0 to 9 := 0;
begin
if (clk'event and clk = '1') then
if d1 = 9 then
d1 := 0;
d2 := d2 + 1;
elsif d2 = 9 then
d2 := 0;
d1 := 0;
else
d1 := d1 + 1;
end if;
end if;
case d1 is
when 0 => x <= "1111110"; -- 7E
when 1 => x <= "0110000"; -- 30
end case;
case d2 is
when 0 => x <= "1111110";
when 1 => x <= "0110000";
end case;
end process;
end;
答案 0 :(得分:1)
不幸的是,除了丢失的y分配外,你的d2计数器还没有正常工作:
d2底部曲线应该保存10个d1计数的每个值(此处显示为10秒.if语句不全面且应该更改.d1也显示不正确。
通过嵌套两个计数器if语句来修复它:
process (clk)
variable d1 : integer range 0 to 9 := 0;
variable d2 : integer range 0 to 9 := 0;
begin
if rising_edge(clk) then
-- if d1 = 9 then
-- d1 := 0;
-- d2 := d2 + 1;
-- elsif d2 = 9 then
-- d2 := 0;
-- d1 := 0;
-- else
-- d1 := d1 + 1;
-- end if;
if d1 = 9 then -- nested if statements
d1 := 0;
if d2 = 9 then
d2 := 0;
else
d2 := d2 + 1;
end if;
else
d1 := d1 + 1;
end if;
end if;
case d1 is
when 0 => x <= "1111110"; -- 7E
when 1 => x <= "0110000"; -- 30
when 2 => x <= "1101101"; -- 6D
when 3 => x <= "1111001"; -- 79
when 4 => x <= "0110011"; -- 33
when 5 => x <= "1011011"; -- 5B
when 6 => x <= "1011111"; -- 5F
when 7 => x <= "1110000"; -- 70
when 8 => x <= "1111111"; -- 7F
when 9 => x <= "1111011"; -- 7B
end case;
case d2 is
when 0 => y <= "1111110"; -- WAS assignment to x
when 1 => y <= "0110000"; -- ""
when 2 => y <= "1101101";
when 3 => y <= "1111001";
when 4 => y <= "0110011";
when 5 => y <= "1011011";
when 6 => y <= "1011111";
when 7 => y <= "1110000";
when 8 => y <= "1111111";
when 9 => y <= "1111011";
end case;
end process;
这就产生了:
如果您的问题提供了Minimal, Complete and Verifiable example,那么您的问题的其他答案可能会指出这一点。
答案 1 :(得分:0)
不是吗?
case d2 is
when 0 => y <= "1111110";
when 1 => y <= "0110000";
end case;
-- ^
-- |
-- shouldn't this be y ?
答案 2 :(得分:0)
您是否真的要求case d2
覆盖x
声明分配给case d1
的值?或者你的意思是y
?
如果从d1和d2派生x和y的逻辑纯粹是组合的,你可以将它移出过程。