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

📄 core1.v

📁 多功能卡的源代码
💻 V
📖 第 1 页 / 共 2 页
字号:
					RD_FIFO_ONE <= 1'b1;
					RAM_ADDR <= RAM_WRITE_ADDR_POINTER[19:0];//放入地址=首地址+计数器
					RAM_WRITE_ADDR_POINTER <= RAM_WRITE_ADDR_POINTER + 32'd1;//计数器+1
					TOTAL_NUM_received <= TOTAL_NUM_received + 32'd1;
					bag_counter <= bag_counter+9'd1;
					RAM_WE_ <= 1'b0;
					operate_state <= 5'd3;
				end
				else begin
					bag_counter <= 9'd0;
					fifo_sel[1]<=1'b1;
					operate_state <= 5'd20;
					//operate_state <= 5'd4;//进入第二通道
				end
			end
			/*5'd2:begin
				operate_state <= 5'd3;
				RD_FIFO_ONE <= 1'b0;
			end*/
			5'd3:begin	
				RAM_WE_ <= 1'b1;
				RD_FIFO_ONE <= 1'b0;
				operate_state <= 5'd1;		
			end
			//==================================================================================//
			/*
			5'd4:begin
				if(RHF_TWO_ == 1)begin             
					operate_state <= 5'd5;
					fifo_sel[2]<=1'b0;
				end
				else begin
					operate_state <= 5'd8;//第三通道
				end
			end
			*/
			5'd5:begin
			if(!bag_counter[8])begin
					RD_FIFO_TWO <= 1'b1;
					RAM_WE_ <= 1'b0;
					RAM_ADDR <= RAM_WRITE_ADDR_POINTER[19:0];//放入地址=首地址+计数器
					RAM_WRITE_ADDR_POINTER <= RAM_WRITE_ADDR_POINTER + 32'd1;//计数器+1
					TOTAL_NUM_received <= TOTAL_NUM_received + 32'd1;
					bag_counter <= bag_counter+9'd1;
					operate_state <= 5'd7;  
				end
			else begin
					bag_counter <= 9'd0;
					fifo_sel[2]<=1'b1;
					operate_state <= 5'd20;
					//operate_state <= 5'd8;//第三通道
				end
				
			end
			/*5'd6:begin
				RD_FIFO_TWO <= 1'b0;
				operate_state <= 5'd7;
				end*/
			5'd7:begin
				RAM_WE_ <= 1'b1;
				RD_FIFO_TWO <= 1'b0;
				operate_state <= 5'd5;
			end
			//==================================================================================//
			/*
			5'd8:begin
				if(RHF_THREE_ == 1)begin
					operate_state <= 5'd9;
					fifo_sel[3]<=1'b0;
				end
				else begin
					operate_state <= 5'd12;//进入第四通道
				end
			end*/
			5'd9:begin
				if(!bag_counter[8])begin
					RD_FIFO_THREE <= 1'b1;
					RAM_ADDR <= RAM_WRITE_ADDR_POINTER[19:0];//放入地址=首地址+计数器
					RAM_WRITE_ADDR_POINTER <= RAM_WRITE_ADDR_POINTER + 32'd1;//计数器+1
					TOTAL_NUM_received <= TOTAL_NUM_received + 32'd1;
					RAM_WE_ <= 1'b0;
					bag_counter <= bag_counter+9'd1;
					operate_state <= 5'd11;
				end
				else begin
					fifo_sel[3]<=1'b1;
					bag_counter <= 9'd0;
					operate_state <= 5'd20;
					//operate_state <= 5'd12;//进入第四通道
				end
			end
			/*5'd10:begin				
				operate_state <= 5'd11;
				RD_FIFO_THREE <= 1'b0;
				end*/
			5'd11:begin
				RAM_WE_ <= 1'b1;
				RD_FIFO_THREE <= 1'b0;
				operate_state <= 5'd9;
			end
			//==================================================================================//
			/*
			5'd12:begin
				if(RHF_FORE_ == 1)begin     
					operate_state <= 5'd13; 
					fifo_sel[4]<=1'b0;
				end
				else begin
					operate_state <= 5'd20;//结束
				end
			end*/
			5'd13:begin
				if(!bag_counter[8])begin
					RD_FIFO_FORE <= 1'b1;
					RAM_ADDR <= RAM_WRITE_ADDR_POINTER[19:0];//放入地址=首地址+计数器
					RAM_WRITE_ADDR_POINTER <= RAM_WRITE_ADDR_POINTER + 32'd1;//计数器+1
					TOTAL_NUM_received <= TOTAL_NUM_received + 32'd1;
					RAM_WE_ <= 1'b0;
					bag_counter <= bag_counter+9'd1;
					operate_state <= 5'd15; 
				end
				else begin
					fifo_sel[4]<=1'b1;
					bag_counter <= 9'd0;
					operate_state <= 5'd20;//结束
				end
			end
			/*5'd14:begin
				operate_state <= 5'd15;	
				RD_FIFO_FORE <= 1'b0;
				end*/
			5'd15:begin
				RAM_WE_ <= 1'b1;
				RD_FIFO_FORE <= 1'b0;
				operate_state <= 5'd13; 
			end
			//==================================================================================//
			/*
			5'd16:begin
				if(RHF_232_ == 1)begin
					operate_state <= 5'd17;
					fifo_sel[0]<=1'b0;
				end
				else begin
					operate_state <= 5'd20;
				end
			end
			5'd17:begin
				if(!bag_counter[8])begin  
					RAM_ADDR <= RAM_WRITE_ADDR_POINTER;
					RAM_WRITE_ADDR_POINTER <= RAM_WRITE_ADDR_POINTER + 20'b01;
					TOTAL_NUM_received <= TOTAL_NUM_received + 34'd1;
					RAM_WE_ <= 1'b0;
					RD_FIFO_232 <= 1'b1;
					bag_counter <= bag_counter+9'd1;
					operate_state <= 5'd18;
				end
				else begin
					fifo_sel[0]<=1'b1;
					bag_counter <= 9'd0;
					operate_state <= 5'd20;
				end
			end
			5'd18:begin			
				operate_state <= 5'd19;
				RD_FIFO_232 <= 1'b0;
				end
			5'd19:begin
				RAM_WE_ <= 1'b1;
				operate_state <= 5'd17;
			end*/
			default:begin
				//data_to_ram_en <= 1'b0;//表示模块向RAM写数据完毕
				busy_flag <= 1'b0;//busy停止
				RAM_WE_ <= 1'b1;
				RD_FIFO_ONE <= 1'b0;                  //收回读fifo信号
				RD_FIFO_TWO <= 1'b0;                  //收回读fifo信号
				RD_FIFO_THREE <= 1'b0;                  //收回读fifo信号
				RD_FIFO_FORE <= 1'b0;                  //收回读fifo信号
				RD_FIFO_232 <= 1'b0;                  //收回读fifo信号
				operate_state <= 5'd0;
			end
		endcase
		end
	endcase
	end//2
	
end//1
//====================================================================================================//
always @ (*)
begin
	if(  ((half_full_state == 1) && (busy_flag == 0))	||	((timer_start_flag == 1) && (busy_flag == 0))   ) begin
		next_state = 2'd1;//如果任意一路422半满并且busy==0,或者定时器计数到5ms并且busy==0,则触发下一状态==1
	end
	else 
	begin 
		if(busy_flag == 0) begin
			next_state = 2'd0;
		end
		else begin
			next_state = current_state;
		end
	end
end
//====================================================================================================//
//状态转换,将下一状态赋值给当前状态
always @(posedge CLK)
begin
    current_state <= next_state;
end
//====================================================================================================//
//定时器计数器
reg timer_start_flag;//定时器有效标志,当这一位有效,表示定时器计数到5ms,开始查询,高有效,低无效
parameter time_delay = 20'b10_0100_1111_1101_1011;//20'd151515 time = 151515*33ns = 4.999995ms
reg [19:0] timer;
always @ (posedge CLK or negedge reset_)
if (!reset_)begin
	timer <= 20'b0;
	timer_start_flag <= 1'b0;
end
else begin
	if(timer <= time_delay - 20'd1)begin
		timer <= timer + 20'b1;
	end
	else if(timer <= time_delay + 20'd1) begin
		if(busy_flag == 1'b1)begin//如果busy==1,表示正在工作,则如果计数器达到计数时间,则需要延迟数个周期
			timer <= timer;
			timer_start_flag <= 1'b1;
		end
		else begin
			timer <= timer + 20'b1;
			timer_start_flag <= 1'b1;
		end		
	end 
	else begin
		timer <= 20'd0;
		timer_start_flag <= 1'b0;
	end
end
//==================================================================================//
reg [14:0]read_bkfifo_counter;
reg [7:0] error_counter;
reg error_counter_enable;
always @(negedge CLK or negedge reset_)
begin
	if(!reset_)	begin
		TOTAL_NUM_be_readed <= 32'd0;
		read_bkfifo <= 1'b0;
		read_state <= 1'b0;
		read_bkfifo_counter <= 15'd0;
		error_counter_enable <= 1'b0;
		error_counter <= 8'd0;
	end
	else if(read_bkfifo_start) 
	begin 
		if(!read_bkfifo_counter[12]) begin
			case (read_state)
			1'b0:begin
				read_state <= 1'b1;
				read_bkfifo <= 1'b1;
				TOTAL_NUM_be_readed <= TOTAL_NUM_be_readed+32'd1;
				read_bkfifo_counter <= read_bkfifo_counter + 15'd1;
			end
			1'b1:begin
				read_state <= 1'b0;
				read_bkfifo <= 1'b0;
			end
			endcase
		end
		else begin
			read_bkfifo <= 1'b0;
			read_state <= 1'b0;
			error_counter_enable <= 1'b1;
		end		
	end
	else begin
		if(error_counter_enable)begin
			if(error_counter[5])begin
				read_bkfifo_counter <= 15'd0;
				error_counter_enable <= 1'b0;
			end
			else error_counter <= error_counter+ 8'd1;
		end
		else begin
			error_counter <= 8'd0;
		end
	end
	
end
assign read_bkfifo_request=((TOTAL_NUM_received - TOTAL_NUM_be_readed)>=32'd4096)? 1'b1:1'b0;
endmodule

⌨️ 快捷键说明

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