PC通过USB读写FPGA

	`timescale 1ns / 1ps
	//-------------------------------------------------------
	// Create Date:    08:57:17 04/22/2012 
	// Design Name: 
	// Module Name:    USB_FPGA 
	//-------------------------------------------------------
	//pc read 512bytes from card
	//pc write >=64bytes to card
	module USB_FPGA(
	input  clk,
	inout [15:0] fdata,
	output reg [1:0] faddr,
	output reg slrd ,
	output reg slwr,
	input flagd,
	input flaga,
	output reg sloe,
	//
	output reg				wrreq,
	output reg [15:0] 	data,
	//
	output reg		fifo_out_rdreq,
	input [15:0] 	fifo_out_q,
	input 			fifo_out_rdfull,
	input [8:0] 	fifo_out_rdusedw
	);	 
	//
	reg [8:0] pc_wr_cnt;
	reg [8:0] wr_cnt;
	reg    	 wr_valid;
	reg [1:0] state=0;
	parameter READ1=0;
	parameter READ2=1;
	parameter WRITE1=2;
	parameter WRITE2=3; 
	assign fdata= ((state==WRITE2)||(state==READ1)) ? fifo_out_q : 16'hzzzz;

	//-------------------------------------------------------
	always @(posedge clk)
	begin
	case(state)
	READ1: 
		begin
		faddr<=2'b00;
		slrd<=1;
		sloe<=0;
		state<=READ2;
		wrreq <= 0;
		fifo_out_rdreq <= 1'b0;
		end
	READ2:
		begin
		state <= WRITE1;
		if(flaga)//not empty,read one byte,then turn to WRITE
			begin
			slrd  <= 0;
			data  <= fdata;
			if(pc_wr_cnt < 9'd64) begin wrreq <= 1; end
			end
		else
			begin 
			slrd  <= 1;
			wrreq <= 0;
			end
		end
	WRITE1:
		begin
		wrreq <= 0;
		slrd  <= 1;
		sloe  <= 1;
		faddr <= 2'b10;
		state<=WRITE2;
		if(wr_valid) 
			begin
			fifo_out_rdreq <= 1'b1;
			end
		end
	WRITE2:
		begin
		fifo_out_rdreq <= 1'b0;
		state<=READ1;
		end
	default:
		begin
		faddr<=2'b00;
		sloe<=1;
		slrd<=1;
		fifo_out_rdreq <= 1'b0;
		state<=READ1;
		end
	endcase 
	end	
	//-------------------------------------------------------
	
	
	//-------------------------------------------------------
	always @(posedge clk)
	begin
		if(flaga)
			begin
			if(wrreq) pc_wr_cnt <= pc_wr_cnt + 1;
			end
		else pc_wr_cnt <= 9'd0;
	end
	//-------------------------------------------------------
  
	
	//-------------------------------------------------------
	always @(posedge clk)
	begin slwr <= ~fifo_out_rdreq; end
	//-------------------------------------------------------

	
	//-------------------------------------------------------
	always @(posedge clk)
	begin
	if(wr_valid)
		begin if(~slwr) wr_cnt <= wr_cnt + 1; end
	else wr_cnt <= 9'd0;
	end
	//-------------------------------------------------------
	
	
	always @(posedge clk)
	begin
	if(wr_cnt == 9'd256) wr_valid <= 1'b0;
	else if(fifo_out_rdusedw == 9'd256) wr_valid <= 1'b1;
	end
	
	
	endmodule

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值