inout port 仿真
这两天在做verilog的ds1302,ds1302中有一个端口是输入/输出管教。即这个管教即是输出,同时也可以当输入。在verilog中有一个特殊的端口与之对应,就是inout。
Inout这个端口,之前用得不多,所以用法也不怎么记得。但是这个地方要用,所以就要学习下。
在端口申明中,可以申明一个端口为inout,申明后,这个端口就是输入/输出端口。那么怎么用这个端口了,什么时候让他输出,什么时候让他输入。这个时候,就有一个固定的用法。就是assign
如:申明一个 inout端口 a, inout a,
那么在用的时候,就要这样用: assign a = read == 1 ? 1'bz : data;
可以看出,这里多了一个read信号,这个read信号就说明此端口a,在什么时候作为输入,什么时候作为输出。当read为1的时候,a为输入,否则作为输出。
以下是一个inout使用的一个实例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
module inout_1( input clk, input rst_n, input read, input data, inout a, output reg b ); assign a = read == 1 ? 1'bz : data; always@( posedge clk ) begin if( !rst_n ) b <= 0; else begin if(read) b <= a; end end endmodule |
以上代码,功能是,当a端口作为输入的时候,把输入a的值给输出b。当a端口作为输出的时候,将输入data的值输出给a。
Inout使用时很简单的,其实就是控制使能信号。使能信号有效的话,就将端口当做输入用。使能信号无效的时候,就把端口当做输出,此时改变输出的值,就改变assing语句中的输出信号值(上例中就是data信号)。、
接下来就是仿真了,对于inout的端口,仿真和其他两种端口是不一样的,input端口在仿真中,就是定义为reg型,然后直接在测试文件中改变值。而输出就是定义为wire型,直接在仿真结果中查看信号结果即可。
那对于inout又该怎么定义信号了。其实inout信号,在测试文件中,要定义为wire型。另外还要加一个assign语句。
如上例中,a为inout信号,那么在测试文件中,要有这样一个语句
assign a = read== 1 ? in_a : 1'bz;
信号in_a是a的输入值,可以看出,测试的assign和功能代码中的assign顺序是反着的。在功能代码中,是使能信号有效的时候,inout信号的值为z,即表示为输入。但是在测试中,信号有效的时候,inout的值是定义的一个输入的值,而信号无效的时候,值为z,表示输出。
上面的顺序不能反,之前做的时候,在testbench中对assign的赋值顺利反了,结果仿真中,a的值输出的时候有值,而输入的值为高阻。
以下是上面功能代码的测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
module inout_1_tb; // Inputs reg clk; reg rst_n; reg read; reg data; // Outputs wire b; // Bidirs wire a; // Instantiate the Unit Under Test (UUT) inout_1 uut ( .clk(clk), .rst_n(rst_n), .read(read), .data(data), .a(a), .b(b) ); reg in_a; assign a = read == 1 ? in_a : 1'bz; always #1 clk = ~clk; initial begin // Initialize Inputs clk = 0; rst_n = 0; read = 0; data = 0; in_a = 0; #10 rst_n = 1; repeat(10) begin //a作为输出 此时a的值等于data #2 data = {$random}%2; end read = 1; repeat(10) begin //a作为输入,此时a的值为in_a #2 in_a = {$random}%2; end // Add stimulus here end endmodule |
用isim仿真,其仿真图如下:
从图中,可以看出,当read信号为低的时候,a作为输出,此时a的值等于data的值。当read信号为高的时候,a作为输入,此时a的值等于in_a的值。仿真正确。
对于inout信号的时候,要注意使能信号的正确运用,以及对应的assign赋值写好。其次要注意,inout信号最好是使用在设计的端口中,不要在设计的内部模块中使用inout。
Read=0时,a<=data;a作为输出端口,向外部模块输出数据。
Read=1时,b<=a;a作为输入端口,从外部模块输入数据。
inout port 仿真相关推荐
- Illegal output or inout port connection (port 'out').
一个4位计数器程序在ISE 联合modelsim进行仿真,代码如下 testbench的内容: module count4_tb; reg clk,reset; wire [3:0] out; ...
- 关于报错: output or inout port “seven_tube_sel_n“must be connected to a structural net expression
前提:input端口默认类型是wire:output端口可以是线网型wire,也可以是寄存器类型reg. 与output输出端口的下一级端口必须是线网型wire,但input端口可以用线网型wire和 ...
- Verilog使用inout信号的方法
目录 一.inout在设计文件中的使用方法 1.1.inout的第一种使用方法 1.2.inout实现的第二种使用方法 1.3.inout使用总结 二.inout在仿真测试中的使用方法 一.inout ...
- specify的含义、作用及vcs对应仿真选项
转载自https://www.cnblogs.com/hxing/p/9584190.html 一.specify的含义 specify block用来描述从源点(source:input/inout ...
- Cadence IRUN仿真编译选项
IRUN仿真编译选项 1. 仿真编译选项 -64bit Invoke 64bit version-a_ext <ext> Override extensions for archive f ...
- 通俗易懂的带你解读inout双向端口【Verilog高级教程】
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- VIVADO inout 端口的使用
使用2018.1版本编译带有INOUT 端口的代码,代码逻辑没问题,写了三态控制.但是下板子,inout端口输入数据一直是0. 最终查找原因,看RTL级原理图,并没有三态控制,端口信号只是被认为一个简 ...
- inout端口使用,一看即懂
inout端口引入:节省引脚资源. inout端口功能:数据线,既可以作为输入端口接收数据:也可以作为输出端口发出数据. 图例:在FPGA中,通过三态门来控制inout端口,如下. 使用: 当z=0 ...
- Specify 的含义 ------ 转载
specify block用来描述从源点(source:input/inout port)到终点(destination:output/inout port)的路径延时(path delay),由sp ...
最新文章
- bzoj 1877: [SDOI2009]晨跑 (网络流)
- 数据结构之【数组和广义表】复习题
- Boost:bind绑定和或||的测试程序
- java 面向对象个人理解
- bootstrap组件
- Maven核心概念及Eclipse使用Maven
- 网站已做好,如何放到服务器上,将做好的网站放到云服务器上
- Identity Server 4 原理和实战(完结)_建立Angular 客户端
- pycharm关闭/开启代码补全/代码提示
- 如何用有道词典查找论文
- nyoj--496--巡回赛(拓扑排序)
- python 自然语言处理(四)____词典资源
- 2021年中国商业地产市场现状分析,销售面积下降,依托核心城市构建差异化是关键「图」
- 调用Android自带浏览器打开网页
- Tixati——BT下载软件
- 获取空气质量站点数据 城市数据 日数据 时数据
- EI收录中国期刊目录 各个版本的含义及收录例子-12年初版
- 365值得吗 office_对于一个大学生来说,Office365是否值得购买?
- 应用程序编程太难?Appy Pie推出“零基础”VR AR设计平台
- SQL Server应用开发概述