私が抱えている問題について、何らかの助けが欲しいです。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 関数を使用して複数のバイトを送信したい場合、すべてが正しく送信されることもあれば、送信が切り捨てられて一部のデータが失われることもあります。後者は非常に頻繁に発生します。エラーを確認するために、次のことを行いました。
- Modelsim で、FTDI データシートが提案する内容に基づいて入力信号と出力信号に関する VHDL コードの動作をシミュレートし、すべての信号が正しく機能します。
- FT_Write プロセスをプログラムするコードの例を探して試してみましたが、同じ結果が得られました。
- オシロスコープで 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;
}