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

📄 km_counter.v

📁 verilog HDL编写的出租车计费系统
💻 V
字号:
module km_counter(pause,clk,start,reset,
					km_H,km_L,km_half,
					fee_B,fee_H,fee_L);

output [3:0]km_H;    //km计时的输出,公里的十位
output [3:0]km_L;    //km计时的输出,公里的个位
output [3:0]km_half; //km计时的输出,公里的小数位
output [3:0]fee_B;   //fee计时的输出,车费的百位
output [3:0]fee_H;   //fee计时的输出,车费的十位
output [3:0]fee_L;   //fee计的输出,车费的个位


input clk;                //20兆赫兹晶振输入
input start;              //开始的标志位,高有效
input reset;              //复位标志,高有效。
input pause;              //暂停的标志位,高有效

reg [3:0]km_H;   
reg [3:0]km_L;    
reg [3:0]km_half; 
reg [3:0]fee_B;   
reg [3:0]fee_H;    
reg [3:0]fee_L; 

reg fee_B_S;    //加1允许标志
reg fee_H_S;
reg fee_L_S;
reg km_H_S;    //加1允许标志
reg km_L_S;
reg km_half_S;

reg start_flag;      //   开始标志
reg reset_flag;      //  复位标志

integer n;


//////////////////////////////////////////////////////////////////////////////////////////  开始/暂停计时与清零标志 裁决
always @(posedge start or posedge reset or posedge pause)                               //
     begin                                                                              //---->开始/暂停计时标志有效,则将复位清零标志禁止
     	if(start==1'b1)                                                                 //
            begin start_flag<=1;reset_flag<=1'b0;end                                    //                                                                        
		else if(reset==1'b1)                                                            //---->复位清零标志有效,则将开始/暂停计时标志禁止
		    begin start_flag<=0;reset_flag<=1'b1;end                                    //
		else if(pause==1'b1)                                                            //---->复位清零标志有效,则将开始/暂停计时标志禁止
		    begin start_flag<=0;reset_flag<=1'b0;end                                    //
     end                                                                                //
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////计时模块
always @(posedge clk)                  
         begin 
			if(start_flag==1)                                                      //
              	begin                                                              //
					if(n==20000000)                                                //
						begin km_half_S<=1;n<=0;end                                //
					else                                                           //
						begin n<=n+1;end                                           //
				end                                                                //
                                                                                   //                                                   
                                 
			
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////复位清零开始


		if(reset_flag==1)
			begin 
				km_H<=4'b0000;km_L<=4'b0000;km_half<=4'b0000;
			end
		else
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////复位清零结束

        if(km_half_S==1)
           begin
			
			if(km_L>=4'b0011)
				begin
					if(km_half==4'b0000)
              	 	    begin  fee_L_S<=1;end
					else if(km_half==4'b0101)
						begin  fee_L_S<=1;end
			        else  
						begin fee_L_S<=0;end
				end
		    else if(km_H!=4'b0000)
				begin
					if(km_half==4'b0001)
              	 	    begin  fee_L_S<=1;end
					else if(km_half==4'b0101)
						begin  fee_L_S<=1;end
			        else  
						begin fee_L_S<=0;end
				end
			else
				begin fee_L_S<=0;end

			if(km_half==4'b1001)
               begin km_half<=4'b0000;km_half_S<=~km_half_S;km_L_S<=1;end
            else
               begin km_half<=km_half+4'b0001;km_half_S<=~km_half_S;end
           end

        if(km_L_S==1)
           begin
			
			if(km_L==4'b1001)
               begin km_L<=4'b0000;km_H_S<=1;km_L_S<=~km_L_S;end
            else
               begin km_L<=4'b0001+km_L;km_L_S<=~km_L_S;end
           end

		if(km_H_S==1)
			begin
			if(km_H==4'b1001)
			   begin km_H<=4'b0000;km_H_S<=~km_H_S;end
            else
               begin km_H<=km_H+4'b0001;km_H_S<=~km_H_S;end
	        end
	
	
	
	
	
		
		
		
//////////////////////////////////////////////////////////////////////////////////////////		
		if(fee_L_S==1)
           begin
			if(fee_L==4'b1001)
               begin fee_L<=4'b0000;fee_L_S<=~fee_L_S;fee_H_S<=1;end
            else
               begin fee_L<=fee_L+4'b0001;fee_L_S<=~fee_L_S;end
           end

        if(fee_H_S==1)
           begin
			if(fee_H==4'b1001)
               begin fee_H<=4'b0000;fee_B_S<=1;fee_H_S<=~fee_H_S;end
            else
               begin fee_H<=4'b0001+fee_H;fee_H_S<=~fee_H_S;end
           end

		if(fee_B_S==1)
			begin
			if(fee_B==4'b1001)
			   begin fee_B<=4'b0000;fee_B_S<=~fee_B_S;end
            else
               begin fee_B<=fee_B+4'b0001;fee_B_S<=~fee_B_S;end
	        end
///////////////////////////////////////////////////////////////////////////////////////////



		if(km_H==4'b0000 && km_L==4'b0000 && km_half==4'b0000)
			begin
				fee_B<=4'b0000;fee_H<=4'b0001;fee_L<=4'b0000;
			end
	end

endmodule

⌨️ 快捷键说明

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