Matrix 如何通过UART读取文本文件?

Matrix 如何通过UART读取文本文件?,matrix,vhdl,fpga,Matrix,Vhdl,Fpga,我有一个用于UART组件的VHDL模块,用于在FPGA和PC之间发送和接收串行数据。它目前工作正常。但是,如何使用这种串行通信来解释从PC发送到FPGA的文本文件中的二维整数矩阵呢? 更具体地说,一旦文本文件从PC发送到fpga,二维阵列将如何存储在内存中?我不知道如何在vhdl中做到这一点 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity uart is generic( --

我有一个用于UART组件的VHDL模块,用于在FPGA和PC之间发送和接收串行数据。它目前工作正常。但是,如何使用这种串行通信来解释从PC发送到FPGA的文本文件中的二维整数矩阵呢? 更具体地说,一旦文本文件从PC发送到fpga,二维阵列将如何存储在内存中?我不知道如何在vhdl中做到这一点

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity uart is
   generic(
     -- Default setting:
     -- 19,200 baud, 8 data bis, 1 stop its, 2^2 FIFO
     DBIT: integer:=8;     -- # data bits
      SB_TICK: integer:=16; -- # ticks for stop bits, 16/24/32
                            --   for 1/1.5/2 stop bits
      DVSR: integer:= 326;  -- baud rate divisor
                            -- DVSR = 100M/(16*baud rate)
      DVSR_BIT: integer:=9; -- # bits of DVSR
      FIFO_W: integer:=2    -- # addr bits of FIFO
                            -- # words in FIFO=2^FIFO_W
   );
   port(
      clk, reset: in std_logic;
      rd_uart, wr_uart: in std_logic;
      rx: in std_logic;
      w_data: in std_logic_vector(7 downto 0);
      tx_full, rx_empty: out std_logic;
      r_data: out std_logic_vector(7 downto 0);
      tx: out std_logic
   );
end uart;

architecture str_arch of uart is
   signal tick: std_logic;
   signal rx_done_tick: std_logic;
   signal tx_fifo_out: std_logic_vector(7 downto 0);
   signal rx_data_out: std_logic_vector(7 downto 0);
   signal tx_empty, tx_fifo_not_empty: std_logic;
   signal tx_done_tick: std_logic;
begin
   baud_gen_unit: entity work.mod_m_counter(arch)
      generic map(M=>DVSR, N=>DVSR_BIT)
      port map(clk=>clk, reset=>reset,
               q=>open, max_tick=>tick);
   uart_rx_unit: entity work.uart_rx(arch)
      generic map(DBIT=>DBIT, SB_TICK=>SB_TICK)
      port map(clk=>clk, reset=>reset, rx=>rx,
               s_tick=>tick, rx_done_tick=>rx_done_tick,
               dout=>rx_data_out);
   fifo_rx_unit: entity work.fifo(arch)
      generic map(B=>DBIT, W=>FIFO_W)
      port map(clk=>clk, reset=>reset, rd=>rd_uart,
               wr=>rx_done_tick, w_data=>rx_data_out,
               empty=>rx_empty, full=>open, r_data=>r_data);
   fifo_tx_unit: entity work.fifo(arch)
      generic map(B=>DBIT, W=>FIFO_W)
      port map(clk=>clk, reset=>reset, rd=>tx_done_tick,
               wr=>wr_uart, w_data=>w_data, empty=>tx_empty,
               full=>tx_full, r_data=>tx_fifo_out);
   uart_tx_unit: entity work.uart_tx(arch)
      generic map(DBIT=>DBIT, SB_TICK=>SB_TICK)
      port map(clk=>clk, reset=>reset,
               tx_start=>tx_fifo_not_empty,
               s_tick=>tick, din=>tx_fifo_out,
               tx_done_tick=> tx_done_tick, tx=>tx);
   tx_fifo_not_empty <= not tx_empty;
end str_arch;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体uart是
一般的(
--默认设置:
--19200波特,8个数据双,1个停止,2^2 FIFO
DBIT:integer:=8;——#数据位
SB_TICK:integer:=16;——#停止位的ticks,16/24/32
--对于1/1.5/2停止位
DVSR:整数:=326;--波特率除数
--DVSR=100M/(16*波特率)
DVSR#位:整数:=9;——#DVSR的位
FIFO_W:整数:=2--#添加FIFO的位
--#FIFO中的字=2^FIFO
);
港口(
时钟,复位:在标准逻辑中;
rd_uart,wr_uart:标准逻辑中;
rx:标准逻辑中;
w_数据:标准逻辑向量(7到0);
tx_满,rx_空:输出标准逻辑;
r_数据:输出标准逻辑向量(7到0);
输出标准逻辑
);
结束uart;
uart的架构结构是
信号勾号:标准逻辑;
信号接收完成勾选:标准逻辑;
信号发送fifo输出:标准逻辑矢量(7到0);
信号接收数据输出:标准逻辑矢量(7到0);
信号tx_为空,tx_fifo_不为空:标准逻辑;
信号发送完成勾选:标准逻辑;
开始
baud_gen_单位:实体工作。mod_m_计数器(arch)
通用映射(M=>DVSR,N=>DVSR\U位)
端口映射(clk=>clk,reset=>reset,
q=>打开,最大刻度=>刻度);
uart\U接收单元:实体工作。uart\U接收(arch)
通用映射(DBIT=>DBIT,SB_TICK=>SB_TICK)
端口映射(clk=>clk,reset=>reset,rx=>rx,
s_tick=>tick,rx_done_tick=>rx_done_tick,
dout=>rx_数据_输出);
先进先出装置接收装置:实体工作。先进先出装置(arch)
通用映射(B=>DBIT,W=>FIFO\U W)
端口映射(clk=>clk,reset=>reset,rd=>rd_uart,
wr=>rx_完成,w_数据=>rx_数据输出,
空=>rx\U空,满=>打开,r\U数据=>r\U数据);
先进先出单位:实体工作先进先出(arch)
通用映射(B=>DBIT,W=>FIFO\U W)
端口映射(clk=>clk,reset=>reset,rd=>tx\U done\U tick,
wr=>wr\u uart,w\u data=>w\u data,empty=>tx\u empty,
满=>tx\U满,r\U数据=>tx\U fifo\U输出);
uart\U发送单元:实体工作。uart\U发送(arch)
通用映射(DBIT=>DBIT,SB_TICK=>SB_TICK)
端口映射(clk=>clk,reset=>reset,
tx\u启动=>tx\u fifo\u非空,
s_tick=>tick,din=>tx_fifo_out,
tx_done_tick=>tx_done_tick,tx=>tx);

tx_fifo_not_emptyUART只是一种通信协议,因此它对接收数据的含义完全一无所知。您可以做的是动态解释数据,而不是稍后再进行解释,但我仍然建议您在单独的模块中进行解释

如果适用,最简单的方法是预先知道矩阵大小和/或以各种方式移动问题软件端

您可以在设计中硬连线已知尺寸(例如,N×4矩阵格式,硬连线4列)以简化内容,但最常用的方法是让电脑为您完成工作(如果事先不知道任何尺寸,则无法根据条目数计算尺寸)

例如,您可以指示PC发送类似以下内容

数字箭头
数字列
值[0][0]
值[0][1]
.
.
值[NumberRows-1][NumberColumns-1]

现在,您只需将接收到的所有内容保存在内存中,就可以知道从何处查看行数和列数,并从何处开始


如果您不能让PC发送纯文本文件以外的任何内容,那么您将需要在本地解析ASCII字符流。我的建议是设计一个模块,将任何内容存储到分隔符中,一旦检测到分隔符,就开始将缓冲区中的任何内容从ASCII十进制转换为二进制,然后将其保存在内存中。在使用分隔符时,它还应增加一个计数器,以便在换行符到达时,您知道列数;而在换行符上,它应增加另一个计数器,以便在EOF时,您知道行数。

代码来自Pong Chu的代码。您的问题似乎是针对Stackoverflow的,但似乎是针对。为什么这个问题在这里是离题的?我知道,VHDL不是编程语言,但用VHDL设计数字系统就像编程一样困难。这个问题与电子学无关,但与VHDL有关。我怎么知道字符是分隔符还是换行符?vhdlIt的Im新手取决于文件格式。通常分隔符是逗号、空格或分号,而换行符是\n字符。要检查接收的字符是否为其中之一,可以将UART接收的字符与二进制ASCII码进行比较。同样,需要一些关于该文件的知识:只需使用纯文本编辑器(记事本、vi、kate等)打开它,并尝试了解发生了什么。例如,即使分隔符是逗号,也可能必须放弃制表符和空格。