버퍼가있는 SPI 마스터 모듈을 구현하려고합니다. 이 FSM 모듈을 사용하여 테스트하고 수신 된 데이터를 UART를 통해 직렬 콘솔에 전송합니다. I는 UART 전에 "FFFFFFFF"X로 시작 값으로 전환 bytes_rec 시뮬레이션으로 판단받은 바이트VHDL 코드가 시뮬레이션에서는 작동하지만 FPGA에서는 작동하지 않습니다.
if(rx_upd <='0' and loadFromRxBuf ='1') then
rx_upd <='1';
rx <= rx_buffer(d_width*buffer_size-1 downto d_width*(buffer_size-1));
rx_buffer<= rx_buffer(d_width*(buffer_size-1)-1 downto 0) & x"00";
elsif(rx_upd ='1' and loadFromRxBuf ='0') then
rx_upd <='0';
end if;
을 (미소 항상 높다) 밖으로 이동 여기서 여기서
library IEEE;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
entity FSM_SPI_buf is
Port (clk: in STD_LOGIC;
increase: in STD_LOGIC;
reset: in STD_LOGIC;
busy : in STD_LOGIC;
tx : out STD_LOGIC_VECTOR (7 downto 0);
rx : in STD_LOGIC_VECTOR (7 downto 0);
transmit : out STD_LOGIC;
loadFromRXBuf : out STD_LOGIC;
loadToTxBuf : out STD_LOGIC;
rxBufEmpty : in STD_LOGIC;
rxBufFull : in STD_LOGIC;
txBufEmpty : in STD_LOGIC;
txBufFull : in STD_LOGIC;
led: out STD_LOGIC_VECTOR (7 downto 0);
uartTXData: out STD_LOGIC_VECTOR(7 downto 0);
uartRXData: in STD_LOGIC_VECTOR(7 downto 0);
uartTXSig: out STD_LOGIC;
uartTXRdy: in STD_LOGIC ;
uartRXCont: out STD_LOGIC;
uartRXSig: in STD_LOGIC;
uartRXFrameError: in STD_LOGIC
);
end FSM_SPI_buf;
architecture Behavioral of FSM_SPI_buf is
type statex is (start,updateTX, closeTX, send,openRX, receive, closeRX,
sendUART,closeUART, stop);
signal state: statex:=start;
signal counter: integer range 0 to 5 := 0;
signal bytes:STD_LOGIC_VECTOR(31 downto 0) := x"030001FF";
signal bytes_rec:STD_LOGIC_VECTOR(31 downto 0):=x"03040506";
begin
process(clk, reset) begin
if(clk'event and clk = '1') then
case state is
when start =>
if(increase = '0') then
state <= updateTX;
counter <= 0;
uartrxCont <= '1';
else
state <= start;
end if;
when updateTX =>
if(counter < 4) then
loadToTxBuf <= '1';
tx<=bytes(31 - counter * 8 downto 32 - (counter+1) * 8);
counter <= counter + 1;
state <= closeTX;
else
state <= send;
end if;
when closeTX =>
loadToTxBuf <= '0';
state <= updateTX;
when send =>
transmit <= '1';
counter <= 0;
if (rxbuffull = '1') then
state <=openRX;
end if;
when openRX =>
transmit <= '0';
if(counter < 4) then
loadFromRxBuf <= '1';
state <=closeRX;
else
counter <= 0;
state <= sendUART;
end if;
when closeRX =>
loadFromRXBuf <= '0';
state <= receive;
when receive =>
bytes_rec(31 - (counter) * 8 downto 32 - (counter+1) * 8)<=rx;
counter <= counter + 1;
state <= openRX;
when sendUART =>
if(counter < 4) then
if uarttxRdy = '1' then
uarttxData <=bytes_rec(31 - (counter) * 8 downto 32 - (counter+1) * 8);
uarttxSig <= '1';
counter <= counter + 1;
state <= closeUART;
end if;
else
state <= stop;
end if;
when closeUART =>
if (uarttxRdy= '0') then
uarttxSig <= '0';
state <= sendUART;
else
state <= closeUART;
end if;
when stop =>
if (uarttxRdy= '0') then
uarttxSig <= '0';
end if;
if(increase = '1') then
state <= start;
else
state <= stop;
end if;
end case;
elsif(reset = '1') then
counter <= 0;
state <= updateTX;
end if;
end process;
end Behavioral;
는 SPI 모듈로부터 발췌 전송이 발생합니다.
하지만 내 FPGA에 (모조 보드 v3의 XC6SLX9를) 생성 된 비트 파일을 업로드 할 때 나는 3.3 소스에 된장을 묶어 경우에도 나는 UART를 통해서만 제로를받을 수 있습니다. 내가 그것을 통해 신호 "바이트"를 전송하여 사용하고 UART 구현을 확인했습니다 그리고 그것은 잘 작동 그래서 그것은 비난하는 것 같아요.
복제 한 자습서를 세지 않으면 처음 프로그래밍 FPGA입니다. 따라서 오류가 발생했을 것으로 예상됩니다. 그러나 가능한 원인을 알려주십시오. 필요가 생기면 내 코드의 다른 부분을 제공 할 수 있습니다. 미리 감사드립니다.
답장을 보내 주셔서 감사합니다. 그에 따라 코드를 수정합니다. 나는 uartTXRdy가 외부 입력이 아니라는 것을 분명히하지 않았 음을 유감스럽게 생각합니다. 실제로 UART 모듈에서 오는 신호입니다. 내가 사용하고있는 코드는 https://github.com/Domipheus/UART에서 확인할 수 있습니다. 그리고 txRdy는 다음 값을 취합니다 : 유휴 상태 일 때 1 ', 전송할 때'0 '. –
이 모델에 대한 모든 외부 입력 (uartTxRdy뿐만 아니라)이 동기이면 ... 뭔가 다른 것이 틀림 없습니다. synth가 모든 논리를 완벽하게 다듬을 수있는 간단한 실수가 있다는 증거를 합성 보고서에서 확인하십시오! –
Brian, SPI 마스터와 FSM 모듈 만 있으면서 프로젝트를 단순화하려고했지만 (http://pastebin.com/aWndX0eY) 합성하면 (http : // pastebin .com/DKMs4ind), 내 문제를 일으키는 것으로 보입니다. 내 논리의 일부를 왜 왜 다듬 었는지 설명하고이 문제를 피하기 위해 무엇을 할 수 있습니까? –