Vhdl 计数器在FPGA中不工作
我有一个连接到UART接收器的VHDL组件。uart有2个输出信号,一个用于接收的字节,另一个用于接收完字节后设置为1的标志 我已经编写了以下模块,它应该为每个新字符增加一个计数器,并显示它点亮一些LEDVhdl 计数器在FPGA中不工作,vhdl,fpga,spartan,Vhdl,Fpga,Spartan,我有一个连接到UART接收器的VHDL组件。uart有2个输出信号,一个用于接收的字节,另一个用于接收完字节后设置为1的标志 我已经编写了以下模块,它应该为每个新字符增加一个计数器,并显示它点亮一些LED LIBRARY ieee; USE ieee.std_logic_1164.ALL; use ieee.numeric_std.all; entity test is port ( clk : in std_logic; rst : in std_logic; ena : in
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.numeric_std.all;
entity test is
port (
clk : in std_logic;
rst : in std_logic;
ena : in std_logic;
rx : in std_logic;
led0 : out std_logic;
led1 : out std_logic;
led2 : out std_logic;
led3 : out std_logic;
led4 : out std_logic;
led5 : out std_logic;
led6 : out std_logic;
led7 : out std_logic
);
end test;
architecture arch of test is
component UART_RX
generic (
g_CLKS_PER_BIT : integer := 115 -- Needs to be set correctly
);
port (
i_Clk : in std_logic;
i_RX_Serial : in std_logic;
o_RX_DV : out std_logic;
o_RX_Byte : out std_logic_vector(7 downto 0)
);
end component;
signal sig_Din : std_logic_vector(7 downto 0);
signal sig_Dout : std_logic_vector(7 downto 0);
signal sig_RxErr : std_logic;
signal sig_RxRdy : std_logic;
signal sig_TxBusy : std_logic;
signal sig_StartTx: std_logic;
begin
UUT : UART_RX
generic map (
g_CLKS_PER_BIT => 434
)
port map (
i_clk => clk,
i_rx_serial => rx,
o_rx_dv => sig_RxRdy,
o_rx_byte => sig_Dout
);
process(clk)
variable position : integer := 0;
variable position_v : std_logic_vector(7 downto 0) := "00000000";
begin
if(sig_RxRdy = '1') then
position := position + 1;
position_v := std_logic_vector((unsigned(position_v1), 1));
led0 <= position_v(0);
led1 <= position_v(1);
led2 <= position_v(2);
led3 <= position_v(3);
led4 <= position_v(4);
led5 <= position_v(5);
led6 <= position_v(6);
led7 <= position_v(7);
end if;
end process;
end arch;
实施有什么问题吗?我发送的每一个新字符都会使计数器增加1以上。而且每次都不是相同的值。
我一定不明白FPGA是如何工作的,因为这很简单,我无法让它工作。您正在使用sig_RxRdy作为递增的条件。但是我们看不到信号的行为,因为它来自一个我们没有代码的模块
从您描述的行为来看,sig_RxRdy所在的o_rx_dv输出可能在一个以上的clk周期内处于高水平。由于UART输入来自外部源,它的高时间可能是可变的,这使得计数器增量不同
解决方案是通过使用延迟版本检测sig_RxRdy上的上升沿:
prev_sig_RxRdy <= sig_RxRdy;
sig_RxRdy_rising <= sig_RxRdy and not prev_sig_RxRdy;
然后在该信号上增加计数器。这仅在o_rx_dv已经与时钟同步时有效。您的进程对任何特定的时钟边缘都不敏感。我不知道;我不知道这是否是解决方案,但您肯定应该添加if rising_Edgeck或if falling_Edgeck,以便进程只在一个时钟边缘启动。代码不完整。位置在哪里?std_逻辑向量unsignedposition_v1,1的意思是什么。请发布工作日志。您的代码有错误,在语法或语义上无效。代替位置_v:=std_逻辑_向量unsignedposition_v1,1;看起来您应该有position\u v:=std\u logic\u vector\u unsignedposition,8;此外,您的RTL不会综合使用clk的上升沿,而是创建一个由sig_RxRdy选通的弛豫振荡器,用作锁存使能器,用于位置,由进位链为增量提供延迟,注意这将始终反转至少一位。请参阅《XST用户指南》,了解对上升沿敏感的可识别顺序逻辑。很抱歉,我的代码不完整,但我认为它足够让您理解我的问题。非常感谢,我能修好它。问题是我没有检查任何时钟边缘。我添加了这个条件,现在它就像一个符咒一样起作用。请看我在问题下面的评论。