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

📄 main.v

📁 windowsxp/2000下驱动程序开发软件winddriver6.0
💻 V
字号:
// +FHDR----------------------------------------------------------
// Copyright (C) 2006 Casic23
// Casic23 Confidential Proprietary.
// ----------------------------------------------------------------
// FILE NAME : main.v
// TYPE : sub Module
// DEPARTMENT : Casic23 team 7
// AUTHOR : jing gang
// AUTHOR EMAIL : jg_xian@yahoo.com.cn
// ---------------------------------------------------------------
// Realease histroy
// VERSION DATE AUTHOR DESCRIPTION
// 		ver1.01 JAN.12 2006 Jing Gang initial version 
//      ver1.1  JAN.25 2006 Jing Gang
//------增加search_start_cmd,search_stop_cmd两个命令
//------ver1.2 Feb.2 2006 Jing Gang
//------将ExecuteBackbyte的几个命令不用反馈,命令的体现在于相应的寄存器的变化,
//------所以不需要向主机发送返回字,所以也不用置控制字传送标志位。
// ---------------------------------------------------------------
// KEYWORDS	: TLP313 
// ---------------------------------------------------------------
// PURPOSE	: main state machine.  
// ---------------------------------------------------------------
// PARAMETERS
// 		 PARAM NAME		RANGE	:	DESCRIPTION	:	DEFAULT	: VA UNIT
// ---------------------------------------------------------------
// RESUSE ISSUES
//		Reset Strategy	:
//		Coclk Domain 	:
//		Critical Timing	:
//		Test Feature	:
//		Asynchronous I/F:
//		Scan Methodoly	:
//		Instantiations	:
//		Others			:
// - FHDR----------------------------------------------------------
module main(
			  clk,
              sw_code,
              sw_int,
			  sw_ack,
            //sw_check,
              lamp_wr,
              lamp_data,
              parallel_rd, 
              parallel_busy,
              parallel_full,
              parallel_tr,
              parallel_send,
              parallel_ack,
              reset_n,

              search_start_cmd,
              search_stop_cmd
            );
`include "param.v"

input clk; // 输入时钟
input [`WIDTH_KEYCODE-1:0] sw_code; // 输入的键盘编码
input sw_int; // 键盘中断请求

output sw_ack; // 主状态机对键盘中断请求的应答
output lamp_wr; // 点灯命令
output [`WIDTH_LAMP_DATA-1:0] lamp_data; //点灯数据

input parallel_busy; //并口发送忙信号
input parallel_full; // 并口接受满信号
input [`WIDTH_PARADATA-1:0] parallel_rd; // 主状态机接受并口数据总线

output [`WIDTH_PARADATA-1:0] parallel_tr; // 主状态机发送并口数据总线
output parallel_send; // 并口发送数据命令
output parallel_ack; // 并口对接受满信号的应答
output reset_n; //产生复位信号

output search_start_cmd;  //搜索开始命令
output search_stop_cmd;  //搜索停止命令


assign search_start_cmd=SearchStart;  
assign search_stop_cmd=SearchStop;  


reg sw_ack;
reg lamp_wr;

wire [`WIDTH_LAMP_DATA-1:0] lamp_data;
reg [`WIDTH_LAMP_DATA-1:0] backbyte;
assign lamp_data=backbyte;

wire [`WIDTH_PARADATA-1:0] parallel_tr;
reg [`WIDTH_PARADATA-1:0] ParallelTransmitBuffer;// 并口发送数据缓冲
assign  parallel_tr=ParallelTransmitBuffer;

reg parallel_send;
reg parallel_ack;


reg ResetStrobe;// reset信号产生命令
reg SelfCheck; // 自检产生命令
reg SendAll; // 
reg ReSend; // 
reg SearchStart; 
reg SearchStop;

reg ControlByteTransmitFlag; // 控制字发送标志
reg [7:0] ControlByte; // 控制字

reg reset_reg;
reg [4:0] reset_cnt;
wire reset_n;
assign reset_n=!reset_reg;

reg [4:0] mach_next;
parameter JudgeParallelFull=5'd0,// 判断接受满状态
          AckParallel=5'd1, // 应答并口接受满状态
          ExecuteBackbyte=5'd2, //检测执行收到并口数据状态
          WriteToLampModule=5'd3, // 点灯状态
          ControlByteTransmitWait=5'd4, // 控制字传输等待状态
          LoadControlByteToSerialTransmitBuffer=5'd5, // 发送控制字状态
          ControlByteTransmit=5'd6, //控制字传输状态
          ControlByteTransmitControl=5'd7, //控制字传输控制状态
          LoadResendByte=5'd8, // 响应ResendByte命令状态
          LoadSelfByte=5'd9, // 响应LoadSelfByte命令状态
          LoadResetByte=5'd10, // 响应LoadResetByte命令状态
          LoadSendAllByte=5'd11, // 响应LoadSendAllByte命令状态
          LoadSearchStart=5'd12, // 响应LoadSearchStart命令状态
          LoadSearchStop=5'd13, // 响应LoadSearchStop命令状态
          LoadRevErrByte=5'd14, // 响应LoadSendAllByte命令状态
          LoadControlByte=5'd15,// 响应中断请求命令状态
          AckSwitch=5'd16; // 中断应答状态
// 主状态机初始状态是JudgeParallelFull状态,检测并口的接受满标志,若满则发出应答信号
// 同时对接受来的并口数据做检测,若是控制命令字则置响应的命令标志,接着跳到相应的发送
// 命令状态,并置发送标志位,若是数据则跳到点灯的状态,也置发送控制位。当不满时则跳到
// 控制字传输状态,检测控制字传输标志是否置位,当置位时,就跳到控制字发送等待状态,若
// 没有置位则按顺序检测响应各命令标志和中断请求信号。当有中断请求时,则置传送控制位并
// 清中断。当处于发送控制等待状态时,若并口不忙,则发出发送命令并清发送传送标志。
always @(posedge clk )
  begin
	 case(mach_next)
	  JudgeParallelFull:				
	    if(parallel_full)
	      begin
		      parallel_ack<=1'b1; //
		      mach_next<=AckParallel;
		   end
	    else
		    begin
	        parallel_ack<=1'b0; 
		      mach_next<=ControlByteTransmitControl; 
		    end
	  AckParallel: 
	    begin
		    parallel_ack<=1'b0;  
	      backbyte<=parallel_rd; 
		    mach_next<=ExecuteBackbyte; 
		  end
	  ExecuteBackbyte:
		  begin
		    if(backbyte[7:4]==4'hf)
		      begin
			      case(backbyte[3:0])
			        4'd0: begin ResetStrobe<=1'b1; reset_cnt<=5'd0;mach_next<=JudgeParallelFull; end // reset command
				    4'd1: begin SelfCheck<=1'b1; mach_next<=JudgeParallelFull;end // self check command
				    4'd2: begin SendAll<=1'b1; mach_next<=JudgeParallelFull;end // sendall command
				    4'd3: begin ReSend<=1'b1; mach_next<=JudgeParallelFull;end // resend command
				    4'd4: begin SearchStart<=1'b1; mach_next<=JudgeParallelFull;end
				    4'd5: begin SearchStop<=1'b1; mach_next<=JudgeParallelFull;end
				    default: begin  mach_next<=JudgeParallelFull; end // nop command
  			    endcase
  			end
  		 else                                 
  			begin
  			  mach_next<=WriteToLampModule;
  			  lamp_wr<=1'b1;                 
  		  end
  		end	
	  WriteToLampModule:
		  begin
		    lamp_wr<=1'b0; 
		    mach_next<=JudgeParallelFull;
		  end
	  ControlByteTransmitWait:
		begin
		  if(parallel_busy)
			  mach_next<=JudgeParallelFull;
		  else
			  begin
			    mach_next<=LoadControlByteToSerialTransmitBuffer; 
			    ParallelTransmitBuffer<=ControlByte[7:0];
			    ControlByteTransmitFlag<=1'b0;	
			  end
		end
	  LoadControlByteToSerialTransmitBuffer:
		  begin
		    parallel_send<=1'b1; 
		    mach_next<=ControlByteTransmit;
		  end
	  ControlByteTransmit:
		  begin
		    parallel_send<=1'b0;
		    mach_next<=JudgeParallelFull;
	    end
	  ControlByteTransmitControl: 
		  begin
		    if(ControlByteTransmitFlag) 
			    mach_next<=ControlByteTransmitWait;
		    else
			    mach_next<=LoadResendByte;   		
		  end
	  LoadResendByte:
		  begin  
		    if(ReSend)
			    begin
			      ReSend<=1'b0;
			      ControlByteTransmitFlag<=1'b0; 
			      mach_next<=JudgeParallelFull;       
			    end
			  else
				  mach_next<=LoadSelfByte; 
		  end
	  LoadSelfByte:  
		  begin
		    if(SelfCheck) 
			    begin
			      SelfCheck<=1'b0;
			      //ControlByte<=8'd36; 
			      ControlByteTransmitFlag<=1'b0;
			      mach_next<=JudgeParallelFull;
			    end
		    else
			    mach_next<=LoadResetByte;
		  end
	  LoadResetByte:
		  begin
		    if(ResetStrobe)
			    begin
			      if(reset_cnt>=5'd5 & reset_cnt<=5'd25 )
				      reset_reg<=1'b1;
			      else
				      reset_reg<=1'b0;	
			      if(reset_cnt<=5'd30)
				       begin
				         reset_cnt<=reset_cnt+5'd1;
				         mach_next<=LoadResetByte;
				       end
			       else
				       begin
				         ResetStrobe<=1'b0;
				        // ControlByte<=8'h36;
				         ControlByteTransmitFlag<=1'b0;
						 mach_next<=JudgeParallelFull;
						//
						parallel_ack <= 1'b0;
	    				backbyte <= 8'd0;
	    				//ResetStrobe <= 1'b0;
	    				SelfCheck <= 1'b0;
						SendAll <= 1'b0;
						ReSend <= 1'b0;
						SearchStart <= 1'b0;
						SearchStop <= 1'b0;
						lamp_wr <= 1'b0;	
						ParallelTransmitBuffer <= 8'd0;
						//ControlByteTransmitFlag <= 1'b0;
						parallel_send <= 1'b0;
						sw_ack <= 1'b0;
						//
				       end
			    end
		    else
			    mach_next<=LoadSendAllByte;			
	    end
	  LoadSendAllByte:
	    begin
		    if(SendAll)
		      begin
			      SendAll<=1'b0;
			      //ControlByte<=8'h36;
			      ControlByteTransmitFlag<=1'b0;
			      mach_next<=JudgeParallelFull;	
			    end
		    else
		      mach_next<=LoadSearchStart;				
		  end
	  LoadSearchStart:
	    begin
		  if(SearchStart)
		    begin
		      SearchStart<=1'b0;
		      //ControlByte<=8'h36;
		      ControlByteTransmitFlag<=1'b0;
		      mach_next<=JudgeParallelFull;
		    end
		  else
		     mach_next<=LoadSearchStop;
	    end
	  LoadSearchStop:
	    begin
	      if(SearchStop)
		    begin
		      SearchStop<=1'b0;
		      //ControlByte<=8'h36;
		      ControlByteTransmitFlag<=1'b0;
		      mach_next<=JudgeParallelFull;
		    end
		  else
		     mach_next<=LoadControlByte;
	    end
	  LoadControlByte: 
	    begin
		//if(sw_int && (parallel_busy!=1))
		    if(sw_int)
			    begin
			      ControlByte<=sw_code;
			      ControlByteTransmitFlag<=1'b1;
			      mach_next<=AckSwitch;
			      sw_ack<=1'b1; 		
			    end
		    else
			    begin
			      sw_ack<=1'b0;
			      mach_next<=JudgeParallelFull;
			    end
		  end
	  AckSwitch: 
		  begin
		    sw_ack<=1'b0;
		    mach_next<=JudgeParallelFull;			
	    end
	  default: 	mach_next<=JudgeParallelFull;
  endcase
end
endmodule


⌨️ 快捷键说明

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