⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processor.v

📁 lease read your package and describe it at least 40 bytes. System will automatically delete the dir
💻 V
字号:
module processor(clock, reset, enter, halt, input1, output1);
input clock;
input reset;
input enter;
input [15:0]input1;
output halt;
reg halt;
output[15:0]output1;
reg [15:0]output1;
reg [3:0]state;
reg[15:0]IR;
reg[4:0]PC;
reg[15:0]A;
reg[4:0]memory_address;
reg[15:0]memory_data;
reg wren;
`define s_start 0
`define s_fetch 1
`define s_decode 2
`define s_load 3
`define s_add 4
`define s_sub 5
`define s_mul 6
`define s_div 7
`define s_and 8
`define s_or 9
`define s_not 10
`define s_jz  11
`define s_jpos 12
`define s_in 13
`define s_store 14
`define s_halt 15
//parameter DATA_WIDTH = 16;
//parameter ADDR_WIDTH = 5;
	//reg [DATA_WIDTH-1:0]memory_data[2**ADDR_WIDTH-1:0];
ram reg1(
.address(memory_address),
.clock(clock),
.data(A),
.wren(wren),
.q(memory_data)
);
	//initial
	//begin
		//$readmemb("program1.txt", memory_data);
	//end
always @(posedge clock or negedge reset)
begin
if (~reset) begin
			PC=5'b0;
			IR=16'b0;
			A=16'b0;
			halt=1'b0;
			output1 <= A;
			//$readmemb("program1.txt", memory_data);
			state = `s_start;
			end
else 	begin
			case (state)
				`s_start: 
					begin
					memory_address = PC;
					state = `s_fetch;
					end
				`s_fetch:
					begin
					IR = memory_data;
					PC = PC + 5'b1;
					state = `s_decode;
					end
				`s_decode:
					begin
					memory_address = IR[4:0];
					case (IR[15:12])
					4'b0011: state = `s_store;
					4'b0100: state = `s_load;
					4'b0101: state = `s_add;
					4'b0110: state = `s_sub;
					4'b0111: state = `s_mul;
					4'b1000: state = `s_div;
					4'b1001: state = `s_and;
					4'b1010: state = `s_or;
					4'b1011: state = `s_not;
					4'b1100: state = `s_jz;
					4'b1101: state = `s_jpos;
					4'b1110: state = `s_in;
					4'b1111: state = `s_halt;
					default: state = `s_start;
					endcase
					end
				`s_load:
					begin
					A = memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_add:
					begin
					A = A + memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_sub:
					begin
					A = A - memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_mul:
					begin
					A = A * memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_div:
					begin
					A = A / memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_in:
					begin
					A = input1;
					output1 <= A;
					if (enter == 1) state = `s_in;
					else state = `s_start;
					end
				`s_store:
					begin
					wren = 1'b1;
					//memory_data = A;
					state = `s_start;
					end
				`s_and:
					begin
					A = A & memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_or:
					begin
					A = A | memory_data;
					output1 <= A;
					state = `s_start;
					end
				`s_not:
					begin
					A = ~A;
					output1 <= A;
					state = `s_start;
					end
				`s_jz:
					begin
					if (A == 16'b0) PC = IR[4:0];
					state <= `s_start;
					end
				`s_jpos:
					begin
					if (A > 0) PC = IR[4:0];
					state <= `s_start;
					end
				`s_halt:
					begin
					halt = 1'b1;
					state = `s_halt;
					end
				default:
					state = `s_halt;
			endcase
		end
end
endmodule 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -