📄 dma_cntrl.v
字号:
/********************************************************* MODULE: Sub Level Direct Memory Access Controller FILE NAME: dma_cntrl.v VERSION: 1.0 DATE: May 7th, 2002 AUTHOR: Hossein Amidi COMPANY: CODE TYPE: Register Transfer Level DESCRIPTION: This module is the top level RTL code of DMA Controller verilog code. It will instantiate the following blocks in the ASIC: 1) DMA FIFO 2) DMA Internal Registers Hossein Amidi (C) April 2002*********************************************************/// DEFINES`timescale 1ns / 10ps // TOP MODULEmodule dma_cntrl( // Inputs reset, clk0, dma_host_addr, dma_host_cmd, dma_host_datain, dma_bus_grant, dma_rd_datain, dma_wr_datain, // Output dma_host_dataout, dma_irq, dma_bus_req, dma_rd_addr, dma_wr_addr, dma_wr_dataout, dma_rd_cmd, dma_busy, uart_cs, uart_rd, uart_wr, dma_rd_dataout );// Parameter`include "parameter.v"// Inputsinput reset;input clk0;input [padd_size - 1 : 0]dma_host_addr;input [cmd_size - 1 : 0]dma_host_cmd;input [data_size - 1 : 0]dma_host_datain;input dma_bus_grant;input [fifo_size - 1 : 0]dma_rd_datain;input [fifo_size - 1 : 0]dma_wr_datain;// Outputsoutput [data_size - 1 : 0]dma_host_dataout;output dma_irq;output dma_bus_req;output [padd_size - 1 : 0]dma_rd_addr;output [padd_size - 1 : 0]dma_wr_addr;output [fifo_size - 1 : 0]dma_wr_dataout;output [cmd_size - 1 : 0]dma_rd_cmd;output dma_busy;output uart_cs;output uart_rd;output uart_wr;output [fifo_size - 1 : 0]dma_rd_dataout;// Signal Declarationswire reset;wire clk0;wire [padd_size - 1 : 0]dma_host_addr;wire [cmd_size - 1 : 0]dma_host_cmd;wire [data_size - 1 : 0]dma_host_datain;wire dma_bus_grant;wire [fifo_size - 1 : 0]dma_rd_datain;wire [fifo_size - 1 : 0]dma_wr_datain;wire [data_size - 1 : 0]dma_host_dataout;wire dma_irq;wire dma_bus_req;reg [padd_size - 1 : 0]dma_rd_addr;reg [padd_size - 1 : 0]dma_wr_addr;reg [fifo_size - 1 : 0]dma_wr_dataout;reg [cmd_size - 1 : 0]dma_rd_cmd;reg [fifo_size - 1 : 0]dma_rd_dataout;wire [fifo_size - 1 : 0]wdma_rd_dataout;wire dma_busy;reg uart_cs;reg uart_rd;reg uart_wr;// Internal wire and reg Signalswire done;wire busy;wire reop;wire weop;wire len;wire byte;wire hw;wire word;wire go;wire i_en;wire reen;wire ween;wire leen;wire rcon;wire wcon;reg fifo_rd;reg fifo_wr;reg [dma_fifo_depth - 1 : 0]dma_wr_addr_cnt;reg [dma_fifo_depth - 1 : 0]dma_rd_addr_cnt;wire [dma_fifo_depth - 1 : 0]wdma_wr_addr_cnt;wire [dma_fifo_depth - 1 : 0]wdma_rd_addr_cnt;wire wr_inc1;wire wr_inc2;wire wr_inc4;wire rd_inc1;wire rd_inc2;wire rd_inc4;wire fifo_wr_enb;wire fifo_rd_enb;wire [fifo_size - 1 : 0]fifo_in_data;wire [fifo_size - 1 : 0]fifo_out_data;reg fifo_sel_in;reg fifo_sel_out;// Assignment statmentsassign dma_irq = done;assign dma_bus_req = go;assign dma_busy = busy;assign wdma_wr_addr_cnt = dma_wr_addr_cnt;assign wdma_rd_addr_cnt = dma_rd_addr_cnt;// Muxing the fifo for bidirection functionalityassign fifo_in_data = fifo_sel_in ? dma_wr_datain : dma_rd_datain;/********************************** FIFO Instantiation ******************************/dma_fifo dma_fifo0 (// Input .clk(clk0), .sinit(reset), .din(fifo_in_data), .wr_en(fifo_wr), .rd_en(fifo_rd), // Output .dout(fifo_out_data), .full(), .empty() );dma_internal_reg dma_internal_reg0(// Input .reset(reset), .clk0(clk0), .dma_host_cmd(dma_host_cmd), .dma_host_addr(dma_host_addr), .dma_host_datain(dma_host_datain), .dma_rd_addr_cnt(wdma_rd_addr_cnt), .dma_wr_addr_cnt(wdma_wr_addr_cnt), .fifo_rd(fifo_rd), .fifo_wr(fifo_wr), // Output .dma_host_dataout(dma_host_dataout), .done(done), .go(go), .busy(busy), .fifo_wr_enb(fifo_wr_enb), .fifo_rd_enb(fifo_rd_enb), .wr_inc1(wr_inc1), .wr_inc2(wr_inc2), .wr_inc4(wr_in4), .rd_inc1(rd_inc1), .rd_inc2(rd_inc2), .rd_inc4(rd_inc4) );// Set the Demultiplexer for the FIFO output portalways @(reset or fifo_sel_out or dma_bus_grant or fifo_out_data)begin if(reset == 1'b1) begin dma_rd_dataout <= 8'h0; dma_wr_dataout <= 8'h0; end else if((dma_bus_grant == 1'b1) && (fifo_sel_out == 1'b1)) dma_wr_dataout <= fifo_out_data; else if((dma_bus_grant == 1'b0) && (fifo_sel_out == 1'b0)) dma_rd_dataout <= fifo_out_data;end// Increment the DMA Write Slave Addressalways @(posedge reset or posedge clk0)begin if(reset == 1'b1) dma_wr_addr_cnt <= 32'h0; else if (wr_inc1 == 1'b1) dma_wr_addr_cnt <= dma_wr_addr_cnt + 1; else if (wr_inc2 == 1'b1) dma_wr_addr_cnt <= dma_wr_addr_cnt + 2; else if (wr_inc4 == 1'b1) dma_wr_addr_cnt <= dma_wr_addr_cnt + 4; else dma_wr_addr_cnt <= dma_wr_addr_cnt;end// Increment the DMA Read Slave Addressalways @(posedge reset or posedge clk0)begin if(reset == 1'b1) dma_rd_addr_cnt <= 32'h0; else if (rd_inc1 == 1'b1) dma_rd_addr_cnt <= dma_rd_addr_cnt + 1; else if (rd_inc2 == 1'b1) dma_rd_addr_cnt <= dma_rd_addr_cnt + 2; else if (rd_inc4 == 1'b1) dma_rd_addr_cnt <= dma_rd_addr_cnt + 4; else dma_rd_addr_cnt <= dma_rd_addr_cnt;end// Generating FIFO read and write enable signalsalways @(posedge reset or posedge clk0)begin if(reset == 1'b1) begin fifo_wr <= 1'b0; fifo_rd <= 1'b0; fifo_sel_in <= 1'b0; fifo_sel_out <= 1'b0; end else begin if((fifo_wr_enb == 1'b1) && (dma_bus_req == 1'b1)) begin fifo_sel_in <= 1'b1; fifo_wr <= 1'b1; end else if((fifo_wr_enb == 1'b1) && (dma_bus_req == 1'b0)) begin fifo_sel_in <= 1'b0; fifo_wr <= 1'b1; end else begin fifo_sel_in <= 1'b0; fifo_wr <= 1'b0; end if((fifo_rd_enb == 1'b1) && (dma_bus_req == 1'b1)) begin fifo_sel_out <= 1'b0; fifo_rd <= 1'b1; end else if((fifo_rd_enb == 1'b1) && (dma_bus_req == 1'b0)) begin fifo_sel_out <= 1'b1; fifo_rd <= 1'b1; end else begin fifo_sel_out <= 1'b0; fifo_rd <= 1'b0; end endendalways @(posedge reset or posedge clk0)begin if(reset == 1'b1) begin dma_wr_addr <= 24'h0; dma_rd_addr <= 24'h0; dma_rd_cmd <= 3'h0; uart_cs <= 1'b0; uart_rd <= 1'b0; uart_wr <= 1'b0; end else begin dma_wr_addr <= dma_wr_addr_cnt; if(ween == 1'b1) begin uart_cs <= 1'b1; uart_wr <= 1'b1; dma_rd_cmd <= 3'b010; dma_wr_addr <= dma_wr_addr_cnt; end else if(reen == 1'b1) begin uart_cs <= 1'b1; uart_rd <= 1'b1; dma_rd_cmd <= 3'b001; dma_rd_addr <= dma_rd_addr_cnt; end endendendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -