fifo_write_top.v代码如下 |
`timescale 1ps/1ps /******************************************************** 说明: 1、该模块是自定义的fifo写操作控制器的顶层文件 2、采用基本写传输,每次操作时仅维持一个时钟周期 3、fifo数据格式可调,默认是16bit 4、从设计时序上看,从端口收到write信号到fifo接收到数据 间存在两个时钟周期 作者: tzj 时间: 2011-09-30 版本; V1.0 镭射打印 ********************************************************/ module fifo_write_top #( // parameters parameter bits_of_data = 16 // 可调参数 ) ( // avalon clock interface signals input clk, // 总线时钟 input reset_n, // 总线复位 // signals for avalon-mm slave port input chipselect, // 片选 input [ 1:0 ] address, // 地址线 input [ 3:0 ] byteenable, // 数据字节使能 input write, // 写请求 metal dome input [ 31:0 ] writedata, // 写数据 // fifo interface signals input full, // fifo满标志 output[ bits_of_data-1:0 ] data, // 写入fifo数据 output wrreq // fifo写请求 ); defparam i1.bits_of_data = bits_of_data; // 调整data位数 fifo_write_avalon i1( // avalon clock interface signals .clk( clk ), .reset_n( reset_n ), // signals for avalon-mm slave port .chipselect( chipselect ), .address( address ), .byteenable( byteenable ), .write( write ), .writedata( writedata ), // fifo interface signals .data( data ), .full( full ), .wrreq( wrreq ) ); endmodule |
fifo_write_avalon.v代码如下 |
`timescale 1ps/1ps /******************************************************** 链轮设计 说明: 1、该模块是自定义的fifo写操作控制器的核心文件 2、avalon总线信号,每次操作时仅维持一个时钟周期 3、fifo数据格式可调,默认是16bit 4、从设计时序上看,从端口收到write信号到fifo接收到数据 间存在两个时钟周期 作者: tzj 时间: 2011-09-30 版本: V1.0 ********************************************************/ module fifo_write_avalon ( // avalon clock interface signals clk, reset_n, // signals for avalon-mm slave port chipselect, address, byteenable, write, writedata, // fifo interface signals data, full, wrreq ); // parameters parameter bits_of_data = 16; // 对应nios ii下可修改的参数 //=============================================== // 端口声明 // avalon clock interface signals input clk; // 总线时钟 input reset_n; // 总线复位 // signals for avalon-mm slave port input chipselect; // 片选 input [ 1:0 ] address; // 地址线 input [ 3:0 ] byteenable; // 数据字节使能 input write; // 写请求 input [ 31:0 ] writedata; // 写数据 // fifo interface signals input full; // fifo满标志 output[ bits_of_data-1:0 ] data; // 写入fifo数据 output wrreq; // 写fifo请求 reg wrreq; //=============================================== // 寄存器 reg [ 31:0 ] write_data_reg; // 写数据寄存器 reg write_data_reg_sel; // 写数据寄存器使能 //=============================================== // 对控制寄存器地址进行译码 always @ ( address ) begin write_data_reg_sel <= 1'b0; case ( address ) 2'b00 : write_data_reg_sel <= 1'b1; default: write_data_reg_sel <= 1'b0; endcase end //=============================================== // 写入fifo数据寄存器 always @ ( posedge clk or negedge reset_n ) // 上升沿时获取数据 if ( !reset_n ) write_data_reg = 32'b0; else if ( write & chipselect & write_data_reg_sel & !full ) begin if ( byteenable[0] ) write_data_reg[ 7:0 ] = writedata[ 7:0 ]; if ( byteenable[1] ) write_data_reg[ 15:8 ] = writedata[ 15:8 ]; if ( byteenable[2] ) write_data_reg[ 23:16 ] = writedata[ 23:16 ]; if ( byteenable[3] ) write_data_reg[ 31:24 ] = writedata[ 31:24 ]; end //=============================================== // 写fifo请求 always @ ( posedge clk or negedge reset_n ) if ( !reset_n ) wrreq = 1'b0; else if ( write & chipselect & write_data_reg_sel & !full ) // 非满 wrreq = 1'b1; else wrreq = 1'b0; //=============================================== // 写数据 assign data = write_data_reg[bits_of_data-1:0]; endmodule |
fifo_read_top.v代码如下 |
`timescale 1ps/1ps /******************************************************** 说明: 1、该模块是自定义的fifo读操作控制器 2、avalon总线信号,每次操作时仅维持一个时钟周期 3、读操作有两个时钟的等待 4、状态读的是fifo的usedw,位数可调,默认6bit 5、fifo外设的数据位数可调,默认16bit 作者: tzj & cj 时间: 2011-09-30 版本: V1.0 ********************************************************/ module fifo_read_top #( // parameters parameter bits_of_q = 16, parameter bits_of_usedw = 6 ) ( // avalon clk interface signals input clk, input reset_n, // signals for avalon-mm slave port input chipselect, input [1:0] address, input read, output [31:0] readdata, // fifo interface signals input [bits_of_q-1:0] q, input empty, input [bits_of_usedw-1:0] usedw, output rdreq ); defparam i1.bits_of_q = bits_of_q; defparam i1.bits_of_usedw = bits_of_usedw; fifo_read_avalon i1( // avalon clk interface signals .clk( clk ), .reset_n( reset_n ), // signals for avalon-mm slave port .chipselect( chipselect ), .address( address ), .read( read ), .readdata( readdata ), // fifo interface signals .q( q ), .empty(empty), .usedw( usedw ), .rdreq( rdreq ) ); endmodule |
fifo_read_avalon.v代码如下 |
`timescale 1ps/1ps /******************************************************** 说明: 1、该模块是自定义的fifo读操作控制器 2、avalon总线信号,每次操作时仅维持一个时钟周期 3、读操作有两个时钟的等待 4、状态读的是fifo的usedw,位数可调,默认6bit 5、fifo外设的数据位数可调,默认16bit 作者: tzj & cj 手提把 时间: 2011-09-30 版本: V1.0 ********************************************************/ module fifo_read_avalon ( // avalon clk interface signals clk, reset_n, // signals for avalon-mm slave port chipselect, address, read, readdata, // fifo interface signals q, empty, usedw, rdreq ); // parameters parameter bits_of_q = 16; parameter bits_of_usedw = 6; //=============================================== // 端口声明 // avalon clk interface signals input clk; // 总线时钟 input reset_n; // 总线复位 // signals for avalon-mm slave port input chipselect; // 片选 input [ 1:0 ] address; // 地址线 input read; // 读请求 output [ 31:0 ] readdata; // 读数据 // fifo interface signals input [ bits_of_q-1:0 ] q; // 读取fifo数据 input empty; // fifo空标志 input [bits_of_usedw-1:0] usedw; // fifo使用情况 output rdreq; // 读fifo请求 reg [ 31:0 ] readdata; reg rdreq; reg wait_ready; // 等待周期标志 reg ready; // 控制读的时钟标志 //=============================================== // 寄存器 wire [ 31:0 ] read_data_reg; // 读数据寄存器 wire [ 31:0 ] read_usedw_reg; // 读状态寄存器 reg read_data_reg_sel; // 读数据寄存器使能 reg read_usedw_reg_sel;// 读状态寄存器使能 //=============================================== // 对控制寄存器地址进行译码,非阻塞 always @ ( address ) begin read_data_reg_sel = 1'b0; read_usedw_reg_sel = 1'b0; case ( address ) 2'b01 : read_data_reg_sel = 1'b1; // 使能读取数据寄存器 2'b10 : read_usedw_reg_sel = 1'b1; // 使能读取状态寄存器 default: begin read_data_reg_sel = 1'b0; read_usedw_reg_sel = 1'b0; end endcase end //=============================================== // 读fifo请求 always @ ( read or chipselect or read_data_reg_sel or empty or wait_ready or ready ) begin rdreq = 1'b0; if ( read & chipselect & read_data_reg_sel & !empty & !wait_ready & !ready ) // rdreq信号只持续一个时钟,由wait_ready引起 rdreq = 1'b1; else rdreq = 1'b0; end //=============================================== // 控制时钟周期的标志 always @ ( posedge clk or negedge reset_n ) if ( !reset_n ) wait_ready <= 1'b0; else if ( read & chipselect & !wait_ready & !ready &(read_data_reg_sel | read_usedw_reg_sel)) // fifo收到rdreq的上升沿,即等待周期中 wait_ready <= 1'b1; else if ( wait_ready ) // 第二个时钟上升沿,readdata将返回q值 胶衣树脂 wait_ready <= 1'b0; else wait_ready <= 1'b0; always @ ( posedge clk or negedge reset_n ) if ( !reset_n ) ready <= 1'b0; else if ( wait_ready ) // fifo收到rdreq的上升沿,即等待周期中 ready <= 1'b1; else ready <= 1'b0; //=============================================== // 读取fifo寄存器数值 always @ ( posedge clk or negedge reset_n ) if ( !reset_n ) readdata = 32'h88888888; else if ( wait_ready ) // 等待一个时钟后返回结果标志 case ( address ) 2'b01 : readdata = read_data_reg; // 返回数据值 2'b10 : readdata = read_usedw_reg; // 返回空状态 default: readdata = 32'h88888888; endcase wire [32-bits_of_q-1:0] tmp1; wire [32-bits_of_usedw-1:0] tmp2; assign tmp1 = 0; assign tmp2 = 0; assign read_data_reg = { tmp1, q }; // 读入fifo输出的数据 assign read_usedw_reg = { tmp2, usedw }; // 读fifo状态 endmodule |
本文发布于:2024-09-22 15:38:06,感谢您对本站的认可!
本文链接:https://www.17tex.com/tex/1/249327.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |