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

📄 wb_dma_de.v

📁 DMA的控制器的IP核,和ATA控制器配合,可以实现DMA方式高速传输数据.
💻 V
📖 第 1 页 / 共 2 页
字号:
assign adr1_cnt_next[1:0] = adr1_cnt_next1[1:0];assign adr1_cnt_next[2] = am1[4] ? adr1_cnt_next1[2] : adr1_cnt[2];assign adr1_cnt_next[3] = am1[5] ? adr1_cnt_next1[3] : adr1_cnt[3];assign adr1_cnt_next[4] = am1[6] ? adr1_cnt_next1[4] : adr1_cnt[4];assign adr1_cnt_next[5] = am1[7] ? adr1_cnt_next1[5] : adr1_cnt[5];assign adr1_cnt_next[6] = am1[8] ? adr1_cnt_next1[6] : adr1_cnt[6];assign adr1_cnt_next[7] = am1[9] ? adr1_cnt_next1[7] : adr1_cnt[7];assign adr1_cnt_next[8] = am1[10] ? adr1_cnt_next1[8] : adr1_cnt[8];assign adr1_cnt_next[9] = am1[11] ? adr1_cnt_next1[9] : adr1_cnt[9];assign adr1_cnt_next[10] = am1[12] ? adr1_cnt_next1[10] : adr1_cnt[10];assign adr1_cnt_next[11] = am1[13] ? adr1_cnt_next1[11] : adr1_cnt[11];assign adr1_cnt_next[12] = am1[14] ? adr1_cnt_next1[12] : adr1_cnt[12];assign adr1_cnt_next[13] = am1[15] ? adr1_cnt_next1[13] : adr1_cnt[13];assign adr1_cnt_next[14] = am1[16] ? adr1_cnt_next1[14] : adr1_cnt[14];assign adr1_cnt_next[15] = am1[17] ? adr1_cnt_next1[15] : adr1_cnt[15];assign adr1_cnt_next[16] = am1[18] ? adr1_cnt_next1[16] : adr1_cnt[16];assign adr1_cnt_next[17] = am1[19] ? adr1_cnt_next1[17] : adr1_cnt[17];assign adr1_cnt_next[18] = am1[20] ? adr1_cnt_next1[18] : adr1_cnt[18];assign adr1_cnt_next[19] = am1[21] ? adr1_cnt_next1[19] : adr1_cnt[19];assign adr1_cnt_next[20] = am1[22] ? adr1_cnt_next1[20] : adr1_cnt[20];assign adr1_cnt_next[21] = am1[23] ? adr1_cnt_next1[21] : adr1_cnt[21];assign adr1_cnt_next[22] = am1[24] ? adr1_cnt_next1[22] : adr1_cnt[22];assign adr1_cnt_next[23] = am1[25] ? adr1_cnt_next1[23] : adr1_cnt[23];assign adr1_cnt_next[24] = am1[26] ? adr1_cnt_next1[24] : adr1_cnt[24];assign adr1_cnt_next[25] = am1[27] ? adr1_cnt_next1[25] : adr1_cnt[25];assign adr1_cnt_next[26] = am1[28] ? adr1_cnt_next1[26] : adr1_cnt[26];assign adr1_cnt_next[27] = am1[29] ? adr1_cnt_next1[27] : adr1_cnt[27];assign adr1_cnt_next[28] = am1[30] ? adr1_cnt_next1[28] : adr1_cnt[28];assign adr1_cnt_next[29] = am1[31] ? adr1_cnt_next1[29] : adr1_cnt[29];// Chunk Counteralways @(posedge clk)	if(de_start)				chunk_cnt <= #1 txsz[24:16];	else	if(chunk_dec & !chunk_cnt_is_0_r)	chunk_cnt <= #1 chunk_cnt - 9'h1;assign chunk_cnt_is_0_d = (chunk_cnt == 9'h0);always @(posedge clk)	chunk_cnt_is_0_r <= #1 chunk_cnt_is_0_d;// Total Size Counteralways @(posedge clk)	if(de_start | ptr_set)		tsz_cnt <= #1 txsz[11:0];	else	if(tsz_dec & !tsz_cnt_is_0_r)	tsz_cnt <= #1 tsz_cnt - 12'h1;assign tsz_cnt_is_0_d = (tsz_cnt == 12'h0) & !txsz[15];always @(posedge clk)	tsz_cnt_is_0_r <= #1 tsz_cnt_is_0_d;// Counter Control Logicalways @(posedge clk)	chunk_dec <= #1 read & !read_r;always @(posedge clk)	tsz_dec <= #1 read & !read_r;//always @(posedge clk)always @(rd_ack or read_r)	adr0_inc = rd_ack & read_r;//always @(posedge clk)always @(wr_ack or write_r)	adr1_inc = wr_ack & write_r;// Done logicalways @(posedge clk)	chunk_0 <= #1 (txsz[24:16] == 9'h0);assign done = chunk_0 ? tsz_cnt_is_0_d : (tsz_cnt_is_0_d | chunk_cnt_is_0_d);assign dma_done = dma_done_d & done;assign dma_done_all = dma_done_d & (tsz_cnt_is_0_r | (nd & chunk_cnt_is_0_d));always @(posedge clk)	next_ch <= #1 dma_done;// Register Update Outputsassign de_txsz = ld_desc_sel ? mast0_din[11:0] : tsz_cnt;assign de_adr0 = ld_desc_sel ? mast0_din : {adr0_cnt, 2'b00};assign de_adr1 = ld_desc_sel ? mast0_din : {adr1_cnt, 2'b00};assign de_csr = mast0_din;// Abort logicalways @(posedge clk)	dma_abort_r <= #1 dma_abort | mast0_err | mast1_err;assign	dma_err = dma_abort_r;assign dma_busy = (state != IDLE);//////////////////////////////////////////////////////////////////////// WISHBONE Interface Logic//always @(posedge clk)	read_r <= #1 read;always @(posedge clk)	write_r <= #1 write;always @(posedge clk)	rd_ack_r <= #1 read_r;// Data Pathassign mast0_dout = m0_we ? {20'h0, tsz_cnt} : csr[2] ? mast1_din : mast0_din;assign mast1_dout = csr[2] ? mast1_din : mast0_din;// Address Pathalways @(posedge clk)	mast0_adr <= #1 m0_go ?		(m0_we ? pointer_s : {pointer[31:4], ptr_adr_low, 2'b00}) :		read ? {adr0_cnt, 2'b00} : {adr1_cnt, 2'b00};always @(posedge clk)	mast1_adr <= #1 read ? {adr0_cnt, 2'b00} : {adr1_cnt, 2'b00};// CTRLassign write_hold = (read | write) & write_hold_r;always @(posedge clk)	write_hold_r <= #1 read | write;assign read_hold = done ? read : (read | write);assign mast0_go = (!csr[2] & read_hold) | (!csr[1] & write_hold) | m0_go;assign mast1_go = ( csr[2] & read_hold) | ( csr[1] & write_hold);assign mast0_we = m0_go ? m0_we : (!csr[1] & write);assign mast1_we = csr[1] & write;assign rd_ack = (csr[2] ? mast1_drdy : mast0_drdy);assign wr_ack = (csr[1] ? mast1_drdy : mast0_drdy);assign mast0_wait = !((!csr[2] & read) | (!csr[1] & write)) & !m0_go;assign mast1_wait = !(( csr[2] & read) | ( csr[1] & write));always @(posedge clk)	mast0_drdy_r <= #1 mast0_drdy;assign	de_ack = dma_done;//////////////////////////////////////////////////////////////////////// State Machine//always @(posedge clk or negedge rst)	if(!rst)	state <= #1 IDLE;	else		state <= #1 next_state;always @(state or pause_req or dma_abort_r or de_start or rd_ack or wr_ack or	done or ptr_valid or use_ed or mast0_drdy or mast0_drdy_r or csr or nd)   begin	next_state = state;	// Default keep state	read = 1'b0;	write = 1'b0;	dma_done_d = 1'b0;	de_csr_we = 1'b0;	de_txsz_we = 1'b0;	de_adr0_we = 1'b0;	de_adr1_we = 1'b0;	de_fetch_descr = 1'b0;	m0_go = 1'b0;	m0_we = 1'b0;	ptr_adr_low = 2'h0;	ptr_set = 1'b0;	ld_desc_sel = 1'b0;	paused = 1'b0;	case(state)		// synopsys parallel_case full_case	   IDLE:	     begin		if(pause_req)			next_state = PAUSE;		else		if(de_start & !csr[`WDMA_ERR])		   begin			if(use_ed & !ptr_valid)	next_state = LD_DESC1;			else			next_state = READ;		   end	     end	   PAUSE:	     begin		paused = 1'b1;		if(!pause_req)		next_state = IDLE;	     end	   READ:	// Read From Source	     begin		if(dma_abort_r)	next_state = UPDATE;		else		if(!rd_ack)	read = 1'b1;		else		   begin			write = 1'b1;			next_state = WRITE;		   end	     end	   WRITE:	// Write To Destination	     begin		if(dma_abort_r)	next_state = UPDATE;		else		if(!wr_ack)	write = 1'b1;		else		   begin			if(done)	next_state = UPDATE;			else			   begin				read = 1'b1;				next_state = READ;			   end		   end	     end	   UPDATE:	// Update Registers	     begin		dma_done_d = 1'b1;		de_txsz_we = 1'b1;		de_adr0_we = 1'b1;		de_adr1_we = 1'b1;		if(use_ed & csr[`WDMA_WRB] & nd)		   begin			m0_we = 1'b1;			m0_go = 1'b1;			next_state = WB;		   end		else			next_state = IDLE;	     end	   WB:	     begin		m0_we = 1'b1;		if(mast0_drdy)		   begin			next_state = IDLE;		   end		else	m0_go = 1'b1;	     end	   LD_DESC1:	// Load Descriptor from memory to registers	     begin		ptr_adr_low = 2'h0;		ld_desc_sel = 1'b1;		m0_go = 1'b1;		de_csr_we = 1'b1;		de_txsz_we = 1'b1;		de_fetch_descr = 1'b1;		if(mast0_drdy)		   begin			ptr_adr_low = 2'h1;			next_state = LD_DESC2;		   end	     end	   LD_DESC2:	     begin		de_fetch_descr = 1'b1;		if(mast0_drdy_r)	de_csr_we = 1'b1;		if(mast0_drdy_r)	de_txsz_we = 1'b1;		ptr_adr_low = 2'h1;		ld_desc_sel = 1'b1;		m0_go = 1'b1;		if(mast0_drdy)		   begin			ptr_adr_low = 2'h2;			next_state = LD_DESC3;		   end	     end	   LD_DESC3:	     begin		de_fetch_descr = 1'b1;		if(mast0_drdy_r)	de_adr0_we = 1'b1;		ptr_adr_low = 2'h2;		ld_desc_sel = 1'b1;		m0_go = 1'b1;		if(mast0_drdy)		   begin			ptr_adr_low = 2'h3;			next_state = LD_DESC4;		   end	     end	   LD_DESC4:	     begin		de_fetch_descr = 1'b1;		if(mast0_drdy_r)	de_adr1_we = 1'b1;		ptr_adr_low = 2'h3;		ld_desc_sel = 1'b1;		if(mast0_drdy)		   begin			next_state = LD_DESC5;		   end		else	m0_go = 1'b1;	     end	   LD_DESC5:	     begin		de_fetch_descr = 1'b1;		ptr_set = 1'b1;		next_state = READ;	     end	endcase   endendmodule

⌨️ 快捷键说明

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