verilog-产生axis数据流
首先这是产生aixs数据流的代码
`timescale 1ps/1ps `default_nettype none module
axis_switch_0_example_master #(
parameter integer C_MASTER_ID =
)
(
/**************** Stream Signals ****************/
output reg m_axis_tvalid = ,
input wire m_axis_tready,
output wire [-:] m_axis_tdata,
output wire [/-:] m_axis_tkeep,
output reg m_axis_tlast = ,
output wire [-:] m_axis_tuser,
/**************** System Signals ****************/
input wire aclk,
input wire aresetn,
/**************** Done Signal ****************/
output reg done =
); /**************** Local Parameters ****************/
localparam integer P_M_TDATA_BYTES = / ;
localparam integer P_M_TUSER_BYTES = ;
localparam [-:] P_M_PACKET_SIZE = ( - );
localparam [-:] P_M_PACKET_NUM = ;
localparam [-:] P_M_SINGLES_NUM = ;
localparam [-:] P_M_DONE_NUM = ;
localparam integer P_M_NUM_MI_SLOTS = ;
localparam integer P_M_NUM_SI_SLOTS = ;
localparam [P_M_NUM_MI_SLOTS*P_M_NUM_SI_SLOTS-:] P_M_CONNECTIVITY_ARRAY = 'b11;
localparam [*P_M_NUM_SI_SLOTS-:] P_M_NUM_CONNECTED_MI_ARRAY = {'d2};
localparam integer P_M_NUM_CONNECTED_MI = P_M_NUM_CONNECTED_MI_ARRAY[C_MASTER_ID*+:]; /**************** Internal Wires/Regs ****************/
genvar i;
generate
for(i=; i<P_M_TDATA_BYTES; i=i+) begin: tdata_g
reg [-:] tdata_i = 'h00;
end
endgenerate
generate
for(i=; (i<P_M_TUSER_BYTES-); i=i+) begin: tuser_g
reg [-:] tuser_i = 'h00;
end
endgenerate
reg [( - (*(P_M_TUSER_BYTES-)) - ):] tuser_i;
reg [-:] pcnt_i = 'h0000;
reg [-:] tcnt_i = 'h0000;
wire done_i;
wire transfer_i;
wire areset = ~aresetn;
reg [-:] areset_i = 'b00; /**************** Assign Signals ****************/
assign m_axis_tkeep = {P_M_TDATA_BYTES{'b1}};
generate
for(i=; i<P_M_TDATA_BYTES; i=i+) begin: tdata_assign_g
assign m_axis_tdata[*i +: ] = tdata_g[i].tdata_i[:];
end
endgenerate
generate
for(i=; i<P_M_TUSER_BYTES; i=i+) begin: tuser_assign_g
if(i == (P_M_TUSER_BYTES - )) begin: tuser_assign_upper_g
assign m_axis_tuser[- : *i] = tuser_i;
end
else begin: tuser_assign_lower_g
assign m_axis_tuser[*i +: ] = tuser_g[i].tuser_i[:];
end
end
endgenerate
assign transfer_i = m_axis_tready && m_axis_tvalid; generate
if(!P_M_NUM_CONNECTED_MI) begin: unconnected_master_g
assign done_i = 'b1;
end
else begin: connected_master_g
assign done_i = (transfer_i && (pcnt_i == P_M_DONE_NUM - 'b1) && (tcnt_i == P_M_PACKET_SIZE));
end
endgenerate // Register Reset
always @(posedge aclk) begin
areset_i <= {areset_i[], areset};
end //**********************************************
// TDATA
//**********************************************
generate
for(i=; i<P_M_TDATA_BYTES; i=i+) begin: tdata_incr_g
always @(posedge aclk) begin
if(areset) begin
tdata_g[i].tdata_i <= 'h00;
end
else
begin
tdata_g[i].tdata_i <= (transfer_i) ? (tdata_g[i].tdata_i + 'b1) : (tdata_g[i].tdata_i);
end
end
end
endgenerate //**********************************************
// TUSER
//**********************************************
generate
for(i=; (i<P_M_TUSER_BYTES-); i=i+) begin: tuser_incr_g
always @(posedge aclk) begin
if(areset) begin
tuser_g[i].tuser_i <= {( - (*i)){'b1}};
end
else
begin
tuser_g[i].tuser_i <= (transfer_i) ? (tuser_g[i].tuser_i - 'b1) : (tuser_g[i].tuser_i);
end
end
end
endgenerate always @(posedge aclk) begin
if(areset) begin
tuser_i <= {( - (*(P_M_TUSER_BYTES-))){'b1}};
end
else
begin
tuser_i <= (transfer_i) ? (tuser_i - 'b1) : tuser_i;
end
end //**********************************************
// TVALID
//**********************************************
always @(posedge aclk) begin
if(areset) begin
m_axis_tvalid <= 'b0;
end
else
begin
// TVALID
if(done_i) begin
m_axis_tvalid <= 'b0;
end
else if(areset_i == 'b10) begin
m_axis_tvalid <= 'b1;
end
else begin
m_axis_tvalid <= m_axis_tvalid;
end
end
end //**********************************************
// TLAST
//**********************************************
always @(posedge aclk) begin
if(areset) begin
m_axis_tlast <= 'b0;
end
else
begin
// TLAST
if(areset_i == 'b10) begin
m_axis_tlast <= 'b1;
end
else if((pcnt_i >= (P_M_SINGLES_NUM - 'b1)) && transfer_i && m_axis_tlast) begin
m_axis_tlast <= 'b0;
end
else if(tcnt_i == (P_M_PACKET_SIZE - 'b1) && transfer_i) begin
m_axis_tlast <= 'b1;
end
else begin
m_axis_tlast <= m_axis_tlast;
end
end
end //**********************************************
// PCNT, TCNT, DONE
//**********************************************
always @(posedge aclk) begin
if(areset) begin
pcnt_i <= 'h0000;
tcnt_i <= 'h0000;
done <= 'b0;
end
else
begin
// DONE
done <= (done_i) ? 'b1 : done; // Increment counters
tcnt_i <= (transfer_i) ? (m_axis_tlast ? 'h0000 : (tcnt_i + 1'b1)) : tcnt_i;
pcnt_i <= (transfer_i && m_axis_tlast) ? (pcnt_i + 'b1) : pcnt_i;
end
end endmodule `default_nettype wire
这里是仿真的代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2017/08/02 15:17:37
// Design Name:
// Module Name: test_axis_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////// module test_axis_tb( ); reg aclk=;
reg aresetn=;
wire s_axis_tvalid;
wire [-:]s_axis_tdata;
wire [/-:] s_axis_tkeep;
wire s_axis_tlast;
wire [-:]s_axis_tuser;
reg s_axis_tready=;
wire example_master_done;
// Example master #0
axis_switch_0_example_master #(
.C_MASTER_ID ( )
) inst_axis_switch_0_example_master_0 (
.aclk ( aclk ),
.aresetn ( aresetn ),
.m_axis_tvalid ( s_axis_tvalid),
.m_axis_tdata ( s_axis_tdata ),
.m_axis_tkeep ( s_axis_tkeep ),
.m_axis_tlast ( s_axis_tlast ),
.m_axis_tuser ( s_axis_tuser),
.m_axis_tready ( s_axis_tready ),
.done ( example_master_done )
);
always # aclk=~aclk;
initial begin
# s_axis_tready=;
# s_axis_tready=;
end
initial begin # aresetn=;
# aresetn=;
end
endmodule
verilog-产生axis数据流的更多相关文章
- axis 数据流
产生数据流的代码 模板 重新修改了下 :]axis_data_cnt='d0; :]axis_data_frame_cnt='d0; :]delay_cnt='d0; initial begin ...
- Verilog的数据流、行为、结构化与RTL级描述
Verilog语言可以有多种方式来描述硬件,同时,使用这些描述方式,又可以在多个抽象层次上设计硬件,这是Verilog语言的重要特征. 在Verilog语言中,有以下3种最基本的描述方式: 数据流描述 ...
- VHDL:信号、端口以及和Verilog的区别
1.信号 信号是描述硬件系统的基本数据对象,它的性质类似于连接线.信号可以作为设计实 体中并行语句模块间的信息交流通道. 信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值(这决定于 ...
- 硬件描述语言Verilog设计经验总结
一.硬件描述语言Verilog 粗略地看Verilog与C语言有许多相似之处.分号用于结束每个语句,注释符也是相同的(/* ... */和// 都是熟悉的),运算符"=="也用来测 ...
- Verilog HDL程序设计——基本要素
Verilog基本上熟悉了,继续整理一下Verilog的学习笔记吧.前面记载了Verilog的结构,写Verilog的结构有了,但是该怎么写呢?在写之前就得了解一下Verilog的一些基本要素了,也就 ...
- verilog 介绍
Verilog HDL Verilog HDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由.VHDL和Verilog HDL两者相比,VHDL的书写规则比Verilog HDL烦琐一些,但 ...
- 【接口时序】3、UART串口收发的原理与Verilog实现
一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...
- FIR滤波原理及verilog设计
FIR(Finite Impulse Response)Filter:有限冲激响应滤波器,又称为非递归线性滤波器. FIR滤波器的冲击响应是一个值为滤波器抽头系数的采样序列,其脉冲响应由有限个采样值构 ...
- 关于Verilog中的几种赋值语句
1. 连续赋值语句(Continuous Assignments) 连续赋值语句是Verilog数据流建模的基本语句,用于对线网进行赋值,等价于门级描述,是从更高的抽象角度来对电路进行描述.连续赋值语 ...
随机推荐
- 基于Django框架对MongoDB实现增删改查
在上一篇中,咱们已经实现了Scrapy框架爬取数据,并且存储到Mongodb数据库, 接下来呢,,,,,,,,,,,,, 咱们就要对这些数据进行操作. 目标:从Mongodb数据库取出数据,通过Dja ...
- objectMapper、JsonNode、JsonObject常用方法
一.objectMapper https://blog.csdn.net/han1196639488/article/details/79358743 二.JsonNode.JsonObject常用方 ...
- 为什么HTTPS比HTTP安全,以及两者的优缺点
一.HTTPS简介 HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全:另一种就是确认网站的真实性. HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HT ...
- scrapy基础 之 静态网页实例
1,scrapy爬虫基本流程: 1. 创建一个新的Scrapy Project > scrapy startproject 项目名称 #系统会在当前目录下创建一个项目名称命名的文件夹,其下 ...
- [转] 使用gc && objgraph 优化python内存
转自https://www.cnblogs.com/xybaby/p/7491656.html 使用gc.objgraph干掉python内存泄露与循环引用! 目录 一分钟版本 python内存管 ...
- Jquery的一些常见用法
谨以此文怀念我们大学的时光,Jquery3.4.0下载 https://code.jquery.com/jquery-3.4.0.min.js ⒈常用方法 $("#div1").h ...
- SpringSecurity权限表达式
* 当我们想要使用多个权限表达式的时候,是不能直接级联调用的,也就是说,我们只能手写了. @Override protected void configure(HttpSecurity http) t ...
- Linux内存分配小结--malloc、brk、mmap【转】
转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...
- MySQL5.7 锁定用户【转】
使用ALTER USER 语句锁定 mysql>ALTER USER 'demo'@'localhost' ACCOUNT LOCK; Query OK, rows affected (0.00 ...
- python性能分析之line_profiler模块
line_profiler使用装饰器(@profile)标记需要调试的函数.用kernprof.py脚本运行代码,被选函数每一行花费的cpu时间以及其他信息就会被记录下来. 安装 pip3 insta ...