Vhdl 计数器在FPGA中不工作

Vhdl 计数器在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

我有一个连接到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 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用户指南》,了解对上升沿敏感的可识别顺序逻辑。很抱歉,我的代码不完整,但我认为它足够让您理解我的问题。非常感谢,我能修好它。问题是我没有检查任何时钟边缘。我添加了这个条件,现在它就像一个符咒一样起作用。请看我在问题下面的评论。