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

📄 cpu.v

📁 16位的RISC_CPU
💻 V
字号:
//------------------------------------------- cpu.v 文件的开始  -------------------------------------------/*********************************************************************************     模块功能:CPU 模块是16位RISC_ CPU的核心, 不同书上的是该模块包含CPU的所有功能。***               它本身也是可综合的模块。已经通过门级后仿真验证。  *****************************************************************************/`timescale 1ns/1nsmodule CPU(input             clk,                //时钟           input             reset_n,            //复位信号           inout      [15:0] rddata,             //读数据           output reg        wr,                 //写使能           output reg        rd,                 //读使能           output reg        halt,               //停机指示           output reg [12:0] addr               //地址                      );                    //CPU内部用寄存器         reg [1:0]  state;                       //状态         reg en_wr;                               //写数据使能         reg [15:0] alu;                         //运算器结果          reg [12:0] ip;                          //指令指针.          reg [2:0]  opcode;                       //操作码         reg [12:0] opaddr;                       //操作地址         reg [15:0] wrdata;                       //写数据         //    wire [15:0] wrdata;         assign  rddata = (en_wr)? wrdata : 16'bzzzz_zzzz_zzzz_zzzz;parameter HLT=3'd0, SKZ=3'd1, ADD=3'd2, ANDD=3'd3, XORR=3'd4, LDA=3'd5, STO=3'd6, SJMP=3'd7;         parameter S0=2'b00, S1=2'b01, S2=2'b10, S3=2'b11;always@(posedge clk or negedge reset_n)   if(!reset_n)                                  //如果复位有效	begin	wr<=1'b1;                                //写信号无效    	en_wr<=1'b0;                             //写使能无效        rd<=1'b1;                                //读信号无效         halt<=1'b0;                              //清停机指示        addr<=13'b0;                             //初始指令地址为0        wrdata<=16'b0;                           //写数据清为0        alu<=16'b0;                              //累加器清为0        ip<=13'b0;                               //指令指针清0,从0地址执行程序	state<=S3;                               //下一状态为读指令周期	end    else    	case(state)    	S0:    	            	        begin	                //读指令处理    		   state<=S1;              //设置下一状态			opcode<=rddata[15:13];   //操作码			opaddr<=rddata[12:0];    //操作地址			case(rddata[15:13])      //根据操作码不同进行处理				HLT:             //停机	  			  begin	  			  rd<=1'b1;	   		  	  wr<=1'b1;	   		  	  en_wr<=1'b0;   //写使能无效	    			  halt<=1'b1;    //置停机标志	    			  //ip<=ip+12'd1;        //指令指针加1 			  	  end	    		        SKZ:             //计算结果为0转移	   		  	begin	   		  		rd<=1'b1;	   		  		wr<=1'b1;	   		  		en_wr<=1'b0;                             //写使能无效	   		  		if(alu==16'b0)	    		  		    ip<=ip+3'd2;   //如果转移,指令指针加2					else					    ip<=ip+3'd1;   //不转移,指令指针加1						    		        end	    		        XORR,ADD,ANDD,LDA:           //计算指令处理	    		        begin	    			        en_wr<=1'b0;                             //写使能无效	    			        rd<=1'b0;            //为下一状态设置读信号	    		  	        addr<=rddata[12:0];  //为下一状态设置读地址					ip<=ip+12'd1;        //指令指针加1       	    		        end	    		    		    	    		        STO:                         //存储指令处理	    		        begin	    		   	    en_wr<=1'b1;             //写使能有效	    		   	    rd<=1'b1;                 //读信号无效	    		   	    wr<=1'b0;                //写信号有效	    		  	    addr<=rddata[12:0];      //写地址	    		  	    wrdata<=alu;             //写数据				    ip<=ip+3'd1;             //指令指针加1	    		        end			                SJMP:                        //转移指令处理	    		        begin	    		            rd<=1'b1;	   		  	    wr<=1'b1;			  	    en_wr<=1'b0;             //写使能无效			  	    ip[12:0]<=rddata[12:0];  //设置ip	    		        end    		        endcase 			end    	S1:                                                  //读写数据周期    	        begin    		state<=S2;    		if (opcode==STO)    		   begin    		   wr<=1'b1;    		   end    		end		S2:                                                  //计算周期		begin		rd<=1'b1;                                    //下一状态读无效		wr<=1'b1;		en_wr<=1'b0;                                 //写使能无效		state<=S3;                           		   case(opcode)			ADD:                                 //加			alu<=alu+rddata;			ANDD:                                //与			alu<=alu&rddata;			XORR:                                //异或			alu<=alu^rddata;			LDA:                                 //装入			alu<=rddata;    		   endcase		end    	S3:                                                  //准备读指令    	   begin    	 	state<=S0;		rd<=1'b0;                                    //设置度信号		en_wr<=1'b0;                                 //写使能无效    	  	wr<=1'b1;                                    //写信号无效	        addr<=ip;                                    //指令地址    	  		    end	    	endcaseendmodule

⌨️ 快捷键说明

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