Vhdl 时钟内上升沿检测

Vhdl 时钟内上升沿检测,vhdl,Vhdl,我不熟悉vhdl编程。我最近接到一项任务,通过按下一个按钮来改变移位寄存器中对时钟信号敏感的std_逻辑_向量的值 当我按住键(2)时,移位寄存器的值会发生变化,但除非我松开按钮,否则它不会移位。是否可以修改我下面的代码,使其对键(2)的上升沿敏感?或者有没有其他可能通过按下键(2)按钮来改变向量的值,即使我按住按钮,向量也会移动 谢谢你的回答。我真的很感激,这对我帮助很大 对不起,我的英语不好。祝你玩得愉快 ENTITY hadvhdl IS PORT ( CLOCK_50 : IN

我不熟悉vhdl编程。我最近接到一项任务,通过按下一个按钮来改变移位寄存器中对时钟信号敏感的std_逻辑_向量的值

当我按住键(2)时,移位寄存器的值会发生变化,但除非我松开按钮,否则它不会移位。是否可以修改我下面的代码,使其对键(2)的上升沿敏感?或者有没有其他可能通过按下键(2)按钮来改变向量的值,即使我按住按钮,向量也会移动

谢谢你的回答。我真的很感激,这对我帮助很大

对不起,我的英语不好。祝你玩得愉快

ENTITY hadvhdl  IS PORT (
    CLOCK_50 : IN STD_LOGIC;
    KEY      : IN STD_LOGIC_VECTOR  (3 downto 0);
    LEDR     : OUT STD_LOGIC_VECTOR (15 downto 0)
);
END hadvhdl;

ARCHITECTURE rtl OF hadvhdl IS
    shared variable register : std_logic_vector(15 downto 0) := (1 downto 0=>'1', others=>'0');
    shared variable count   : integer range 1 to 4 :=1;
BEGIN

    changecount: process (KEY)
    begin    
        if rising_edge(KEY(2)) then
            if count<4 then
                count := count + 1; 
            else
                count := 1;
            end if;
        end if; 
    end process;

    shift: process (CLOCK_50, KEY)
        variable up : BOOLEAN := FALSE;
        variable reg : std_logic_vector(15 downto 0) := (1 downto 0=>'1', others=>'0'); 
    begin   
        if rising_edge(CLOCK_50) then
            if (KEY(2)='1') then
                case count is 
                    when 1 => register := (1 downto 0=>'1', others=>'0'); 
                    when 2 => register := (2 downto 0=>'1', others=>'0'); 
                    when 3 => register := (3 downto 0=>'1', others=>'0'); 
                    when 4 => register := (4 downto 0=>'1', others=>'0'); 
                end case; 
            end if;

            reg := register;
            LEDR <= reg;

            if up then
                reg := reg(0) & reg(15 downto 1); 
            else 
                reg := reg(14 downto 0) & reg(15);  
            end if;

            register := reg;

        end if;
    end process;

END rtl;
实体hadvhdl是端口(
时钟50:在标准逻辑中;
键:标准逻辑向量(3到0);
LEDR:OUT标准逻辑向量(15到0)
);
端部硬件描述语言;
hadvhdl的rtl体系结构是
共享变量寄存器:标准逻辑向量(15到0):=(1到0=>'1',其他=>'0');
共享变量计数:整数范围1到4:=1;
开始
更改计数:进程(键)
开始
如果上升沿(图例(2)),则
如果计数为“1”,则其他=>“0”);
开始
如果上升沿(时钟50),则
如果(键(2)='1'),则
病例数为
当1=>寄存器时:=(1到0=>'1',其他=>'0');
当2=>寄存器时:=(2到0=>'1',其他=>'0');
当3=>寄存器:=(3到0=>'1',其他=>'0');
当4=>寄存器时:=(从4到0=>'1',其他=>'0');
终例;
如果结束;
reg:=寄存器;
莱德
  • 不要使用变量!(至少作为VHDL初学者)
  • 不要将按钮用作时钟(例如,在上升沿)
  • 在您的设计中只使用一个时钟(在您的情况下似乎没有问题)
  • 请记住,机械按钮不会反弹
  • 这是一种用于边缘检测的变体:

      -- in entity
      clk    ; in std_logic;
      sig_in : in std_logic;
    
    ...
    
    signal sig_old  : std_logic;
    signal sig_rise : std_logic;
    signal sig_fall : std_logic;
    
    ...
    
      process
      begin
        wait until rising_edge( clk);
    
        -- defaults
        sig_rise <= '0';
        sig_fall <= '0';
    
        -- shift value in
        sig_old <= sig_in;
    
        -- do some real action
        if sig_old = '0' and sig_in = '1' then
          sig_rise <= '1';
        end if;
    
        if sig_old = '1' and sig_in = '0' then
          sig_fall <= '1';
        end if;
    
      end process;
    
    --在实体中
    时钟;在标准逻辑中;
    信号输入:标准逻辑输入;
    ...
    信号信号:标准逻辑;
    信号信号上升:标准逻辑;
    信号信号下降:标准逻辑;
    ...
    过程
    开始
    等待上升沿(clk);
    --默认值
    
    sig_上升键(2)如何连接到FPGA?按键开关经常连接到将信号拉低至0V,同一信号上的上拉电阻器连接到+V。在这种情况下,松开开关时会出现上升沿,按下开关时会出现下降沿……对不起。应该有if(键(2)='0')。我在这里重写的时候犯了错误。你是对的。那么,除非你也错误地将“上升沿”键入了“下降沿”,很明显,“计数”只有在你松开按钮时才会改变。这就是你看到的问题吗?另外,搜索关于开关“去抖动”的信息。@AndyS:我对你的代码做了一些缩进清理。但是,在代码末尾附近有一个额外的
    end if
    ,没有相应的
    if
    。非常感谢。我真的很感谢你的帮助。