-"파일을 열 번만 읽어와 도움이 필요하십니까

K

kassie

Guest
내가 텍스트 파일에서 내 입력을 읽는 몇 가지 코드를 작성 노력에 저장됩니다.난 읽을 수 있어요,하지만 난 방법을 한 번만 읽어해야할지 모르겠다.후에 내가 정수 std_logic_vector에서 입력 변환 파일에서 첫 번째 라인을 읽어 보시기 바랍니다.후에 나는 한 번에 한 비트 그것을 밖으로 이동하는 데 필요한 데이터를 읽어 보시기 바랍니다.내 코드의 의견을 충분히 아이디어를주고 내가 어떻게 데이터를 이동하려면 확실하게해야합니다.원래 신호를 사용.그러나 내 compilier 날 그래서 변수 변경 및 작동 오류를했다.난 충돌 라이브러리와 문제가있을 수있습니다.지금 내 오류가 그것은 비록 내가 데이터를 이동 해요 나타나지 않습니다 사라 졌어요.내가 처음부터 LSByte 최소 유효 비트를 이동하려고하면 내 변수를 변경하지 않습니다 그것을 전달합니다.내가 데이터를 이동하는 속도 싶은 전송 속도입니다.내가 클럭 사이클 당 하나의 비트 이동하려는 데이터를 20 비트있습니다.그러므로 나는 카운터를 사용하고있습니다.내 입력 숫자 1026를 10 진수입니다.내가 Testbench이 쓰고 있어요.Testbench 입력 stimuls에 RS 직렬 통신 링크를 통해 파일을 다운로드해야합니다 - 422.

코드가 첨부되어있습니다

 
아무 코드를 첨부와 통해 UR 문제를 이해하지 못할 메신저입니다.아마 보는 코드가 나한테 어떤 힌트를 줄 것이다.통해 UR 기사와 함께 첨부해 주시기 바랍니다.

 
내가 파일을 첨부하려하지만, 난 그게 잘못된 확장했다 그것을 작동하지 않았던 것 같아.다시 그것을 첨부하여 사건을 그냥 붙여 해보자.신호 ClkBR : std_logic;
신호 Counter_BR 갖는 : integer;

Baud_rate : 프로세스
시작
ClkBR "= '0 '; - 당 19200 번째 비트
52 우릴 기다릴;
ClkBR "= '1 ';
52 우릴 기다릴;
최종 처리;
--------------------------------------
- 생성 1MHz의 클럭 (1uS)
--------------------------------------

Counter_BR_p : (ResetNotIn, ClkBR) 프로세스
시작
ResetNotIn = '0 '그리고 만약
Counter_BR "= 0;
elsif rising_edge (ClkBR) 다음
만약 Counter_BR "20 다음
Counter_BR "= Counter_BR 1;
그 밖의
Counter_BR "= 0;
최종면;
최종면;
최종 처리;

read_input : (ClkBR) 프로세스

파일 file_in : 텍스트;
VARIABLE line_in 갖는 : integer;
VARIABLE 털많은 : 라인;
변수 line_in_vec : std_logic_vector (15 downto 0);
변수 Dout_LSByte : std_logic_vector (9 downto 0);
변수 Dout_MSByte : std_logic_vector (9 downto 0);
변수 SDout : std_logic;- 함수 conv_std_logic_vector (line_in : 16 :)로 돌아가기 std_logic_vector;

시작
file_open (file_in, "prf_data.txt", READ_MODE);
rising_edge (ClkBR) 그리고 만약
만약 다음 Counter_BR = 0
그때까지 탈출하고 파일을 닫습니다 EOF 타 - 라인 읽기
작성한 Readline (file_in 털많은); - 파일
읽는 (털많은 line_in); - 파일에서 integer로 읽기
line_in_vec : = conv_std_logic_vector (line_in, 16);
Dout_LSByte : = STOPBIT & line_in_vec (7 downto 0) & STARTBIT;
Dout_MSByte : = STOPBIT & line_in_vec (15 downto

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="차가운" border="0" />

& STARTBIT;
elsif Counter_BR "0 Counter_BR"20 다음
- 시리얼 데이터의 20 비트 레지스터 근무 (시간) 한 비트 변화
SDout : = Dout_LSByte (0); - 최초의 LSB를 LSByte의 변화
Dout_LSByte (8 downto 0) : = Dout_LSByte (9 downto 1); - 교대 LSByte 다음
Dout_LSByte (9) : = Dout_MSByte (0); - 다음 LSB를 MSByte의 변화
Dout_MSByte (8 downto 0) : = Dout_MSByte (9 downto 1); - 교대 MSByte 마지막
최종면;
최종면;
file_close (file_in);
최종 처리;

 
미안하지만, 당신이 첨부 파일을 보려면 로그인이 필요합니다

 
만약 당신이 한 번만 뭔가 그냥 부울 변수 집합을 만들 싶어요
기본값은 '가'false입니다.전에 당신이 들립니까 변수를 확인합니다.그럼 읽어이든, 다음 변수를 true로 설정하려면 어떻게합니까.

즉 VHDL
...
읽기 : 프로세스 (CLK, 재설정)
변수 did_it : 부울 : = false를;
시작
만약 리셋 = '1 '을 선택한 다음
- 어쩌구 저쩌구;
did_it : = false를;
elsif rising_edge (CLK) 다음
다음 did_it 않을 경우
- 읽기 않아
did_it : = 진정한;
그 밖의
- 읽고 건너 뛰;
최종면;
최종면;
엔드 프로세스를 읽고;

이 도움이 되길 바래요
마이크

 
난 여기 통해 UR 코드를 수정해야 ...
희망이 hepls!

코드 :

신호 ClkBR : std_logic;

신호 Counter_BR 갖는 : integer;Baud_rate : 프로세스

시작

ClkBR "= '0 '; - 당 19200 번째 비트

52 우릴 기다릴;

ClkBR "= '1 ';

52 우릴 기다릴;

최종 처리;

--------------------------------------

- 생성 1MHz의 클럭 (1uS)

--------------------------------------Counter_BR_p : (ResetNotIn, ClkBR) 프로세스

시작

ResetNotIn = '0 '그리고 만약

Counter_BR "= 0;

elsif rising_edge (ClkBR) 다음

만약 Counter_BR "20 다음

Counter_BR "= Counter_BR 1;

그 밖의

Counter_BR "= 0;

최종면;

최종면;

최종 처리;read_input : 프로세스 ()

파일 file_in : 텍스트;

변수 line_in : 정수;

가변 광 : 라인;

file_opened 변수 : 부울 : = false를;

변수 line_in_vec : std_logic_vector (15 downto 0);

변수 Dout_LSByte : std_logic_vector (9 downto 0);

변수 Dout_MSByte : std_logic_vector (9 downto 0);

변수 SDout : std_logic;

- 함수 conv_std_logic_vector (line_in : 16 :)로 돌아가기 std_logic_vector;

시작

file_open (file_in, "prf_data.txt", read_mode);

rising_edge (ClkBR) 때까지 기다릴;

endfile하지 않음 (file_in) 루프를하는 동안

만약 다음 Counter_BR = 0

그때까지 탈출하고 파일을 닫습니다 EOF 타 - 라인 읽기

작성한 Readline (file_in 털많은); - 파일

읽는 (털많은 line_in); - 파일에서 integer로 읽기

line_in_vec : = conv_std_logic_vector (line_in, 16);

Dout_LSByte : = STOPBIT & line_in_vec (7 downto 0) & STARTBIT;

Dout_MSByte : = STOPBIT & line_in_vec (15 downto & STARTBIT;

elsif Counter_BR "0 Counter_BR"20 다음

- 시리얼 데이터의 20 비트 레지스터 근무 (시간) 한 비트 변화

SDout : = Dout_LSByte (0); - 최초의 LSB를 LSByte의 변화

Dout_LSByte (8 downto 0) : = Dout_LSByte (9 downto 1); - 교대 LSByte 다음

Dout_LSByte (9) : = Dout_MSByte (0); - 다음 LSB를 MSByte의 변화

Dout_MSByte (8 downto 0) : = Dout_MSByte (9 downto 1); - 교대 MSByte 마지막

최종면;

최종 루프;

최종 처리;

 
만약 당신이 파일을 읽는다면, 난이 Testbench 가정 (또는 비 합성) 코드입니다.
그 경우,되는 이유는 모든 코드를 시계를 생성합니다.

신호 CLK : std_logic : = '0 '
....CLK "= time_constant ns의 후 CLK하지;

코더의 많은 합성 코드가 필요없습니다 쓰는 것을 계속한다.마이크

 

Welcome to EDABoard.com

Sponsor

Back
Top