小白提问,在用VHDL写流水灯实验的时候,灯一直亮着,显然是没有延时的,怎么去延时呢

2019-07-15 22:14发布

entity led_water is

port(
                 clk  :  in  std_logic;
                 rst  :  in  std_logic;
                 led  :  out std_logic_vector(7 downto 0)
                 
    );
end led_water;

architecture Behavioral of led_water is
signal clk1 : std_logic; --建立中间时钟信号
begin

P1: process(clk,rst)  --进程1 对时钟信号进行N分频
  variable  count  :  integer range 0 to 50000000 := 0;
  variable  count1 :  std_logic := '0';

  begin  
        if (rst = '1') then    --如果有复位信号
            count := 0;
                 
                 elsif(clk'event and clk = '1') then  --如果clk上升沿到来
                 count := count + 1;
                 
                 if(count = 50000000)  then
                    count := 0;
                         
                 end if;
                 count1 := not count1;  --时钟信号翻转
                 
                 clk1 <= count1;
               
         end if;
         end process;
       
P2: process(clk1)  --对分频信号进行计数,进而控制LED灯亮灭
    variable count2 : integer range 0 to 8 := 0;
         
         begin
          if(clk1'event and clk1 = '1') then
            count2 := count2 + 1;
                 if (count2 = 8) then
                    count2 := 0;
                 end if;
          end if;
          
          case count2 is
          when 0 => led <= "00000001";
          when 1 => led <= "00000010";
          when 2 => led <= "00000100";
          when 3 => led <= "00001000";
          when 4 => led <= "00010000";
          when 5 => led <= "00100000";
          when 6 => led <= "01000000";
          when 7 => led <= "10000000";
          when others => led <= (others => 'Z');
          end case;
          
         end process;

end Behavioral;

请大神们帮我看看错误

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
hawke
1楼-- · 2019-07-16 03:59
 精彩回答 2  元偷偷看……
sunfa1993
2楼-- · 2019-07-16 07:11
最近才开始学习,有不懂的地方希望大神们帮助一下
hawke
3楼-- · 2019-07-16 10:46
你这是二分频;clk1频率太高。
              if(count = 50000000)  then
                    count := 0;
                 count1 := not count1;  --时钟信号翻转
               end if;
sunfa1993
4楼-- · 2019-07-16 13:19
hawke 发表于 2016-11-15 10:34
你这是二分频;clk1频率太高。
              if(count = 50000000)  then
                    count := 0;

麻烦您能帮我看看嘛?我改过之后,仿真有输入,输出不变化了,有问题,谢谢您
entity led_water is

port(
                 clk  :  in  std_logic;
                 led  :  out std_logic_vector(7 downto 0)
                 
    );
end led_water;

architecture Behavioral of led_water is
signal clk1 : std_logic; --建立中间时钟信号
begin

process(clk)  --进程1 对时钟信号进行N分频
  variable  count  :  natural range 0 to 40000000 := 0;
  variable  count1 :  std_logic := '0';

begin  
   if(clk'event and clk = '1') then  --如果clk上升沿到来
       if(count = 40000000)  then
           count := 0;
                          clk1 <= clk1;
       else
           count := count + 1;                                 
       end if;
        end if;
         
        
end process;
        
process(clk1)  --对分频信号进行计数,进而控制LED灯亮灭
    variable count2 : integer range 0 to 8 := 0;
         begin
          if(clk1'event and clk1 = '1') then
            count2 := count2 + 1;
                 if (count2 = 8) then
                    count2 := 0;
                 end if;
          end if;
         
          case count2 is
          when 0 => led <= "00000001";
          when 1 => led <= "00000010";
          when 2 => led <= "00000100";
          when 3 => led <= "00001000";
          when 4 => led <= "00010000";
          when 5 => led <= "00100000";
          when 6 => led <= "01000000";
          when 7 => led <= "10000000";
          when others => led <= (others => 'Z');
          end case;
         
         end process;

end Behavioral;
泛爱不懂
5楼-- · 2019-07-16 15:00
利用计数来产生延时
sunfa1993
6楼-- · 2019-07-16 17:43
 精彩回答 2  元偷偷看……

一周热门 更多>