여기 Verilog HDL 언어로 설계된 컴퓨터 커널이 있습니다. 간단한 프로그램을 실행할 수 있습니다. 저는 대학원반 교육에서 디자인 사례로 완성했습니다. 이 설계는 Quartus II 소프트웨어 환경 테스트를 통과했으며 자체 제작 개발 랩에 다운로드되어 실행되었습니다. 여기서 메모리는 하버드 구조이며 Quartus II 가 제공하는 메모리 요소를 직접 사용하여 구성됩니다.
프로그램
//기본 입력 시계
//리셋 제어: reset_n, 저전위 유효.
//기본 출력: o
//프로그램 메모리 iram, 16 비트, 높이 5 비트는 클래스 명령 코드이며 imem 16.mif 로 초기화됩니다.
//데이터 스토리지 dram, 16 비트, 데이터 파일 초기화 없음.
Lpm 메모리의 주소 신호는 데이터를 읽고 쓰기 전에 1 촬영에서 안정적이어야 합니다.
//명령 형식: 높이 5 자리 명령 코드, 1 1 주소 코드, 16 자리 즉시 (높낮이 8 자리).
모듈 테스트
(참조)
시계,
_n 재설정 ,
오,
//디버그 출력 (선택 사항):
Opc,
오마르,
Ojp,
Oqw,
올다,
Oadd,
Oout
);
시계를 입력합니다.
Reset _ n;; 을 입력합니다
Output [15: 0] o;
Output [15: 0] oqw;
Output [10:0] OPC, Omar
출력 [2: 0] ojp;
출력 olda, oadd, oout
와이어 dwren
와이어 [15: 0] q _ w;
와이어 [15: 0] q _ data;
Reg [15:0] b, a, IR, da, oo, ddata
Reg [10:0] PC, mar
레그 [2: 0] jp; //박자
Reg dwrit// 쓰기 제어
//명령:
Reg LDA, // fetch: 데이터 단위에서 da 까지 세어봅니다.
Add, // Add: da 가 데이터 장치에 추가되고 결과는 da 에 배치됩니다.
Out, // output: 데이터 단위의 내용을 출력 레지스터로 출력합니다.
Sdal,//low 8 비트 immediate: 8 비트 immediate 를 16 비트로 확장하고 da 에 보냅니다.
Sdah,//high 8 비트 immediate: 8 비트 immediate 를 high 8 비트로, 원본 da 에 대한 낮은 8 비트 연결로 16 비트를 형성하여 da 에 넣습니다.
Str//da 전송 데이터 저장소 장치:
//아날로그 신호 출력:
할당 o = oo
Opc 할당 = PC
대입 Omar = mar
할당 ojp = jp
할당 oqw = q _ w;;
할당 olda = LDA
Assign oadd = add
할당 oout = out
지정 dwren = dwrit
//명령어 스토리지:
Lpm_rom iram (. 주소 (개인용 컴퓨터). Inclock (시계) 입니다. Q (q _ w)); //프로그램 스토리지
Def param iram.lpm _ width =16;
Defparam iram.lpm _ width ad =11;
Defparam iram.lpm_outdata = "등록되지 않음";
Defparamiram.lpm _ indata = "registered";
Def paramiram.lpm _ address _ control = "registered";
Def param iram.lpm _ file = "imem16.mif"; //파일을 초기화하고 프로그램을 배치합니다.
//데이터 저장소:
Lpm_ram_dq dram (. 데이터 (ddata). 주소 (mar). 우리 (dwren). Inclock (시계) 입니다. Q (q _ data)); Defparamdram.lpm _ width =16;
Defparam dram.lpm _ width ad =11;
Defparam dram.lpm_outdata = "등록되지 않음";
Defparamdram.lpm _ indata = "registered";
Defparamdram.lpm _ address _ control = "registered";
Always @ (양수 가장자리 시계 또는 음수 가장자리 재설정 _n)
시작
만약 (! Reset_n)
시작
Pc<= 0;
Lda<= 0;
& lt= 0; 추가
Out<= 0;
Sdal & lt= 0;
Sdah & lt= 0;
Str<= 0;
Jp & lt=0;
끝
기타
시작
Jp< = jp+1;
사례 (jp)
0: 시작
끝
1: 시작
사례 (q _ w [15:11])
5' b00001:LDA < = 1; //lda:0000 1
5' b 00010: add < = 1; //주소: 000 10
5' b00011:out < = 1; //out:000 1 1
5' b00100: sdal < = 1; //낮음 8 비트, 부호 있는 16 비트로 확장
5' b00101:sdah < = 1; //높이 8 비트, 앞의 낮은 8 비트와 조합해서 16 비트를 형성합니다.
5' b00110: str < = 1; //da 전송 데이터 유닛
시나리오를 종료합니다
끝
2: 시작
If (lda || add || out || str)
Mar< = q _ w [10: 0];
끝
3: PC < = PC+1;
4: 시작
중간 주파수 (LDA)
시작
Da<= q _ data
Jp<= 0;
Lda<= 0;
끝
기타
(추가) 인 경우
시작
B<= q _ data
A<= da
끝
기타
만약 (아웃)
시작
Oo<= q _ data
Jp<= 0;
Out<= 0;
끝
기타
(sdal) 인 경우
시작
Da<= {{8{q_w[7]}}, q _ w [7: 0]}; //는 16 부호있는 숫자로 확장됩니다.
Sdal & lt= 0;
끝
기타
If (sdah)
시작
Da [15: 0] < = {q_w[7:0], da [7: 0]};
Sdah & lt= 0;
끝
기타
If (문자열)
시작
Ddata & lt= da
Dwrit & lt= 1;
끝
끝
5: 시작
(추가) 인 경우
시작
Da< = a+b;
Jp<= 0;
& lt= 0; 추가
끝
기타
If (문자열)
시작
Str<= 0;
Dwrit & lt= 0;
끝
끝
시나리오를 종료합니다
끝
끝
말단 모듈
/////////프로그램 시뮬레이션 또는 실행 예//////
//assembly//
// sdal 5 2005 //
// sdah 6 2806 //
// str 10 300a //
// sdal 3 2003 //
//추가 10 100a //
// str 15 300f //
// out 15 180f //
//컴파일된 16 16 진수를 imem 16.mif //
////// 16 결과 출력: 0608///////.