VHDL有没有一种方法可以自动生成基于时间的序列?

VHDL有没有一种方法可以自动生成基于时间的序列?,vhdl,fpga,Vhdl,Fpga,我正试图通过FPGA板移动机器人手臂。通信工作正常,但我想制作一个自动序列,我可以动态修改。基本上,我需要的是能够按顺序编写以下代码: PA0 <= PA1; (for 2s) PA2 <= PA5; (for 3,5s) PA4 <= PA3; (for 3s) PA2 <= PA1; (for 2s) PA0'0'); 信号CNTR:std_逻辑_向量(7到0):=(其他=>'0'); 开始 控制:过程(CLK) 开始 如果上升沿(CLK),则 如果(时间计数器=b

我正试图通过FPGA板移动机器人手臂。通信工作正常,但我想制作一个自动序列,我可以动态修改。基本上,我需要的是能够按顺序编写以下代码:

PA0 <= PA1; (for 2s)
PA2 <= PA5; (for 3,5s)
PA4 <= PA3; (for 3s)
PA2 <= PA1; (for 2s)
PA0'0');
信号CNTR:std_逻辑_向量(7到0):=(其他=>'0');
开始
控制:过程(CLK)
开始
如果上升沿(CLK),则
如果(时间计数器=b“00000000 101111101011110000000”),则

CNTR也许你可以向我们展示一个或两个方法(以及声明),并告诉我们“no where near perfect”的不利之处。你的问题有点抽象。我添加了一段测试机器人手臂的代码。如图所示,如果我想在其中任何一个语句之间添加一个操作,我必须更改以下所有if语句。如果我想做一个10+个动作的序列,它看起来会很混乱,加上时间转换是很耗时的。不要使用std_logic_unsigned。将时间计数器定义为
无符号
。您可以将无符号文本与整数文本进行比较,如
if time\u counter=123
if time\u counter=“1111011”
好得多。最后,您可能希望创建半秒的计数器,而不是使用50MHz的时间计数器。如果有
if half_secu cnt>4
来验证时间是否大于2秒会更好…使用整数而不是向量是一个很大的帮助,谢谢。那么回到问题上来,有没有一种方法可以制作基于时间的序列块,我可以在不改变其余状态的情况下修改它?理想情况下,我希望声明信号和传播时间,然后转移到另一个状态。通常,这是一个可编程状态机(PSM)或像PicoBlaze这样的8位CPU的工作。Picobaze支持通过JTAG在运行时重新编程。也许您可以向我们展示一种或两种方法(以及声明),并告诉我们“no where near perfect”的不利之处。你的问题有点抽象。我添加了一段测试机器人手臂的代码。如图所示,如果我想在其中任何一个语句之间添加一个操作,我必须更改以下所有if语句。如果我想做一个10+个动作的序列,它看起来会很混乱,加上时间转换是很耗时的。不要使用std_logic_unsigned。将时间计数器定义为
无符号
。您可以将无符号文本与整数文本进行比较,如
if time\u counter=123
if time\u counter=“1111011”
好得多。最后,您可能希望创建半秒的计数器,而不是使用50MHz的时间计数器。如果有
if half_secu cnt>4
来验证时间是否大于2秒会更好…使用整数而不是向量是一个很大的帮助,谢谢。那么回到问题上来,有没有一种方法可以制作基于时间的序列块,我可以在不改变其余状态的情况下修改它?理想情况下,我希望声明信号和传播时间,然后转移到另一个状态。通常,这是一个可编程状态机(PSM)或像PicoBlaze这样的8位CPU的工作。PicoBlaze支持通过JTAG在运行时重新编程。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

entity abra is

port
    (
    PA0 : out std_logic ;
    PA2 : out std_logic;
    PA4 : out std_logic;
    PA6 : out std_logic;
    PA1 : in std_logic;
    PA3 : in std_logic;
    PA5 : in std_logic;
    PA7 : in std_logic;

    LED: out std_logic_vector(7 downto 0);

        RST: in std_logic; --ROT_CENTER--
        CLK : in std_logic --50MHz clock--

    );
end abra;

architecture Behavioral of abra is

signal TIME_COUNTER : std_logic_vector (31 downto 0) := (others => '0');
signal CNTR : std_logic_vector (7 downto 0) := (others => '0');


begin

control: process(CLK)
begin

if rising_edge(CLK) then

    if(TIME_COUNTER = b"00000000101111101011110000100000") then
        CNTR <= CNTR + 1; --should inc every 1s--
        TIME_COUNTER <= (others => '0');
    else
    TIME_COUNTER <= TIME_COUNTER + 1;
    end if;


    if( RST = '1' ) then
                    CNTR <= (others => '0');
                    LED <= "11111111";
    end if;

        PA0 <= '0';
        PA2 <= '0';
        PA4 <= '0';
        PA6 <= '0';

    -----------------

        if( CNTR >= "00000000" AND CNTR < "00000100") then
            PA6 <= PA5; --servo 1 / side up--
            LED <= b"00000001";
        end if;

        if( CNTR >= "00000100" AND CNTR < "00001011") then  
            PA4 <= PA3; --servo 3 / side down--
            LED <= b"00000010";
        end if;

        if( CNTR >= "00001011" AND CNTR < "00110000") then  
            PA2 <= PA1; -- servo 6 / side down--
            LED <= b"00000100";
        end if;

        if ( CNTR >= "00100000") then
            LED <= b"00000000";
        end if;

    ------------------

end if;
end process control;

end Behavioral;
NET "PA0"  LOC = "A13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA2"  LOC = "B13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA4"  LOC = "A14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA6"  LOC = "B15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA1"  LOC = "A15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA3"  LOC = "A16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA5"  LOC = "A17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
NET "PA7"  LOC = "B17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;

NET "RST"  LOC = "R13" | IOSTANDARD = LVCMOS33 | PULLDOWN ;
NET "CLK" LOC = "E12"| IOSTANDARD = LVCMOS33 ;

NET "LED<0>" LOC = "W21" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<1>" LOC = "Y22" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<2>" LOC = "V20" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<3>" LOC = "V19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<4>" LOC = "U19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<5>" LOC = "U20" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<6>" LOC = "T19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;
NET "LED<7>" LOC = "R20" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | Drive = 8 ;