verilog偏门小知识(不定期更新)

1. 双向(可控)开关

目的是在顶层文件中实现对两个I2C模块的sda线进行选择,最初直接使用下述代码:

assign sda = ctrl ? sda_1 : sda_2 ;

可以发现当 sda 处于输出状态时,sda 在他们之中进行选择进行输出,是没有问题的;但 sda 如果是输入的话,明显就有问题了。

最初考虑把子模块 sda 的输入和输出都拉出来,先选择信号再写三态门,但这样很麻烦。

最后发现 verilog 原语里面有双向开关这么一个东西,即数据可以双向流动。

普通双向开关

tran 或 rtran ( tran 的高阻态版本 ) 开关实例语句的语法如下:

(r)tran [instance_name] (inout_a, inout_b) ;

端口表只有两个端口,并且无条件地双向流动,即从 signala 向 signalb ,反之亦然。

可控双向开关

tranif 或 rtranif 的实例语句的语法如下:

(r)tranif [instance_name] (inout_a, inout_b, ctrl);

前两个端口是双向端口,即数据从 signala 流向 signalb ,反之亦然。第三个端口是控制信号。对于 tranif0 和 tranif0,ctrl 为 0 时允许双向数据流动;对于 tranif1 和 rtranif1 ,ctrl 为 1 时允许双向数据流动。

对于 rtran、rtranif0 和 rtranif1 (高阻态版本),当信号通过开关传输时,信号强度减弱。

注意:vivado 综合不支持开关级源语!!!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值