2

私が抱えている問題について、何らかの助けが欲しいです。FPGA (Altera De0 Nano キット、VHDL プログラミング) と PC (LabWindows CVI ソフトウェア、C プログラミング) を FTDI (UM245R USB-Parallel conversor) 経由で通信しようとしています。そのために、約 960 kbps の非同期 FIFO 通信を使用しています。FTDI メーカーが推奨するライブラリを使用しています ( https://ftdichip.com/wp-content/uploads/2020/08/D2XX_Programmers_GuideFT_000071.pdfおよびhttps://www.ftdichip.com/Support/Documents/DataSheets/モジュール/DS_UM245R.pdf)。現在、PC から送信されたデータを FPGA に読み込もうとしています。ここで、次の問題があります。Ft_Write 関数を使用して複数のバイトを送信したい場合、すべてが正しく送信されることもあれば、送信が切り捨てられて一部のデータが失われることもあります。後者は非常に頻繁に発生します。エラーを確認するために、次のことを行いました。

  1. Modelsim で、FTDI データシートが提案する内容に基づいて入力信号と出力信号に関する VHDL コードの動作をシミュレートし、すべての信号が正しく機能します。
  2. FT_Write プロセスをプログラムするコードの例を探して試してみましたが、同じ結果が得られました。
  3. オシロスコープで UM245R の RXF フラグを分析します。これは、FPGA が受信するデータがバッファにあり、データシートまたはテクニカル マニュアルに示されているように動作しないことを示します (常に高レベルです)。コードで要求したようにRD信号が機能しない方法ですが、データは上記の方法で送信されます。私が間違っているのは何でしょうか?UM245R に何らかのハードウェアの問題があり、壊れている可能性がありますか?. ここでは、コードを VHDL に、関数を C に残しています。

VHDL コード:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;

    entity driver is 
    port(
    clk: in std_logic;  --system clock 1MHz

    --FTDI ports
    datos: in unsigned(7 downto 0); --data bus
    rxf: in std_logic; -- signal indicating if data bus can be read (if '1' it cannot be read, if '0' it can be read
    rd: out std_logic; -- Reading process can be achieved when '0' and RXF is '0' 
    leds: out unsigned(7 downto 0)); -- fpga leds

    end driver;
    
    architecture driver_arch of driver is
    
    type estado is (CHEQUEO, LECTURA, POSTLECTURA); 
    signal ME: estado:= CHEQUEO;

    begin
    
    process(clk)
    
    begin

    if(rising_edge(clk)) then
       CASE ME IS             
          WHEN CHEQUEO=>     if(rxf='0') then
                                rd<='0';
                                ME<=LECTURA;
                             end if; 
          WHEN LECTURA=>     leds<=datos;
                             ME<=POSTLECTURA;
                              
          WHEN POSTLECTURA=> rd<='1';
                             ME<=CHEQUEO;
    end CASE;
    end if;
    end process;
    end driver_arch;

そして、これはCコードです():

// here is the function for sending data
int WriteDevice(char datos[128])
{
    // assuming the device is already open
    int write=4;
    DWORD BytesWritten;
    ftStatus = FT_Write(ftHandle, datos, 128, &BytesWritten); 
    if (ftStatus == FT_OK) 
    { 
        // FT_Write OK 
        write=40;
    } 
    else 
    { 
        // FT_Write Failed 
        write=41;
    }
    return write; 
} 
4

1 に答える 1

1

いくつかの問題が発生する可能性があります。

  • UM245R のデータシートによるとRXF#、 と#反転は、FIFO バッファにデータが存在するまで常にハイになり、データが存在する場合はフラグがローになります。

    1. FIFO バッファ内のデータ AND
    2. POWEREN#= 0

    したがって、 を保証する必要がありますPOWEREN#0また、この信号はプロトコルには必要ないため、pull-down抵抗器で降ろします。

  • また、データの読み取りにも問題があります。データシートと図のとおり 4.4

    ハイの場合、FIFO からデータを読み取りません。Low の場合、FIFO で使用可能なデータがあり、RD# をストローブすることで読み取ることができます。

    ステート マシンで行うことは、WAIT-RXF( CHEQUEO)、RD-LOW+READ( LECTURA)、RD-HIGH( POSTLECTURA) です。これは、読み取り時にデータが利用可能であることを保証するものではありませんD[0-7]。図のように、RD#ローになると、T3 - RD# Active to Valid Data最大 50ns の遅延が発生します。したがって、ステート マシンには次WAIT-RXFの4 つの状態が必要です。クロック サイクルの長さによっては、 と の間に遅延状態を追加して、データ バスの読み取りを開始できるようになる前に Low になってから少なくとも 50ns を確保する必要がある場合があります。RD-LOWDATA-READRD-HIGHRD-LOWDATA-READRD#

  • デバッグ中は PC と UM245R 間の通信速度を下げてください (仕様の制限に関するコメントを確認してくださいData transfer rate to 300 kilobyte / second – VCP Drivers

  • そして、上記が実際のコードである場合、Craig がコメントで述べたように、再帰呼び出しがあってはなりませんwrite=WriteDevice(datos);

于 2021-03-09T05:42:21.427 に答える