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 // 可调参数 ) formal( // avalon clock interface signals input clk, // 总线时钟 input ret_n, // 总线复位 // signals for avalon-mm slave port input chiplect, // 片选 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写请求 ); defparam i1.bits_of_data = bits_of_data; // 调整data位数 fifo_write_avalon i1( // avalon clock interface signals .clk( clk ), .ret_n( ret_n ), // signals for avalon-mm slave port .chiplect( chiplect ), .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, ret_n, // signals for avalon-mm slave port chiplect, 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 ret_n; // 总线复位 // signals for avalon-mm slave port input chiplect; // 片选 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_l; // 写数据寄存器使能 //=============================================== // 对控制寄存器地址进行译码 always @ ( address ) begin write_data_reg_l <= 1'b0; ca ( address ) 2'b00 : write_data_reg_l <= 1'b1; default: write_data_reg_l <= 1'b0; endca end //=============================================== // 写入fifo数据寄存器 always @ ( podge clk or negedge ret_n ) // 上升沿时获取数据 if ( !ret_n ) write_data_reg = 32'b0; el if ( write & chiplect & write_data_reg_l & !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 @ ( podge clk or negedge ret_n ) if ( !ret_n ) wrreq = 1'b0; el if ( write & chiplect & write_data_reg_l & !full ) // 非满 wrreq = 1'b1; el 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的udw,位数可调,默认6bit 5、fifo外设的数据位数可调,默认16bit 作者: tzj & cj 时间: 2011-09-30 版本: V1.0 ********************************************************/ module fifo_read_top #( // parameters parameter bits_of_q = 16, parameter bits_of_udw = 6 ) ( // avalon clk interface signals input clk, input ret_n, // signals for avalon-mm slave port input chiplect, 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_udw-1:0] udw, output rdreq ); defparam i1.bits_of_q = bits_of_q; defparam i1.bits_of_udw = bits_of_udw; fifo_read_avalon i1( // avalon clk interface signals .clk( clk ), .ret_n( ret_n ), // signals for avalon-mm slave port .chiplect( chiplect ), .address( address ), .read( read ), .readdata( readdata ), // fifo interface signals .q( q ), .empty(empty), .udw( udw ), .rdreq( rdreq ) ); endmodule |
fifo_read_avalon.v代码如下 |
`timescale 1ps/1ps /******************************************************** 说明: 1、该模块是自定义的fifo读操作控制器 2、avalon总线信号,每次操作时仅维持一个时钟周期 3、读操作有两个时钟的等待 4、状态读的是fifo的udw,位数可调,默认6bit 5、fifo外设的数据位数可调,默认16bit 作者: tzj & cj 时间: 2011-09-30 版本: V1.0 ********************************************************/ module fifo_read_avalon ( // avalon clk interface signals clk, ret_n, // signals for avalon-mm slave port chiplect, address, read, readdata, // fifo interface signals q, empty, udw, rdreq ); beal // parameters parameter bits_of_q = 16; parameter bits_of_udw = 6; //=============================================== // 端口声明 // avalon clk interface signals input clk; // 总线时钟 input ret_n; // 总线复位 // signals for avalon-mm slave port input chiplect; // 片选 input [ 1:0 ] address; // 地址线 kudou input read; // 读请求 output [ 31:0 ] readdata; // 读数据 // fifo interface signals input [ bits_of_q-1:0 ] q; // 读取fifo数据 input empty; // fifo空标志 input [bits_of_udw-1:0] udw; // 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_udw_reg; // 读状态寄存器 reg read_data_reg_l; // 读数据寄存器使能 reg read_udw_reg_l;// 读状态寄存器使能 //=============================================== // 对控制寄存器地址进行译码,非阻塞 always @ ( address ) bimp begin read_data_reg_l = 1'b0; read_udw_reg_l = 1'b0; ca ( address ) 2'b01 : read_data_reg_l = 1'b1; // 使能读取数据寄存器 2'b10 : read_udw_reg_l = 1'b1; // 使能读取状态寄存器 default: begin read_data_reg_l = 1'b0; read_udw_reg_l = 1'b0; end endca end //=============================================== // 读fifo请求 always @ ( read or chiplect or read_data_reg_l or empty or wait_ready or ready ) begin rdreq = 1'b0; if ( read & chiplect & read_data_reg_l & !empty & !wait_ready & !ready ) // rdreq信号只持续一个时钟,由wait_ready引起改善英文 rdreq = 1'b1; el rdreq = 1'b0; end //=============================================== // 控制时钟周期的标志 always @ ( podge clk or negedge ret_n ) if ( !ret_n ) wait_ready <= 1'b0; el if ( read & chiplect & !wait_ready & !ready &(read_data_reg_l | read_udw_reg_l)) // fifo收到rdreq的上升沿,即等待周期中 wait_ready <= 1'b1; el if ( wait_ready ) // 第二个时钟上升沿,readdata将返回q值 wait_ready <= 1'b0; el wait_ready <= 1'b0; always @ ( podge clk or negedge ret_n ) if ( !ret_n ) ready <= 1'b0; el if ( wait_ready ) // fifo收到rdreq的上升沿,即等待周期中 ready <= 1'b1; el ready <= 1'b0; //=============================================== // 读取fifo寄存器数值 always @ ( podge clk or negedge ret_n ) if ( !ret_n ) readdata = 32'h88888888; el if ( wait_ready ) // 等待一个时钟后返回结果标志 ca ( address ) 2'b01 : readdata = read_data_reg; // 返回数据值 2'b10 : readdata = read_udw_reg; // 返回空状态 default: readdata = 32'h88888888; endca wire [32-bits_of_q-1:0] tmp1; wire [32-bits_of_udw-1:0] tmp2; assign tmp1 = 0; assign tmp2 = 0; assign read_data_reg = { tmp1, q }; // 读入fifo输出的数据 assign read_udw_reg = { tmp2, udw }; // 读fifo状态 endmodule |
library什么意思 |
本文发布于:2023-05-17 22:28:37,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/78/673334.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |