VHDL有没有一种方法可以自动生成基于时间的序列?
我正试图通过FPGA板移动机器人手臂。通信工作正常,但我想制作一个自动序列,我可以动态修改。基本上,我需要的是能够按顺序编写以下代码: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
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 ;