首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]新手求助,如何用CPLD设计双向开关

[求助]新手求助,如何用CPLD设计双向开关

本人新手入门,初学VerilogHDL,芯片用Xilinx XC9536XL。开发环境用ISE7.1i + Synplify pro 8.1+ ModelSim SE6.1。


想用CPLD的3个IO做一个双向开关,使能时导通,反之断开,功能类似于CD4066。本来Verilog有原语 tranif0或者tranif1,可以直接实现,问题是大多数综合器都不支持这个原语。为了实现目的,我自己尝试了用三态门组合等等几种方法,效果很不理想。从原理上和CPLD的结构上看,都应该很容易实现这个功能,但是至今仍是一头雾水,恳请各位大侠不吝赐教,如何用简单的方法实现这样的双向开关呢?


非常感谢!!

我还不懂哦
多多指教
你描述的功能是三态门吧?
使能时直接赋值,否则高阻,这样可以吗?

大浪淘沙
留下的全是金子
谢谢版主关注!
可能是我描述的不够清楚,我想做的是个双向开关。
使能端有效时,双向导通,两边都既能输入又能输出,互为驱动。使能无效时,相当于断开,两端都输出高阻。
Verilog有原语tranif0或者tranif1描述这种东西,但是手上的XST Synplify 和来昂那多都无法支持综合这个原语,查阅ISE附带的原语列表,也没有发现XC9500XL系列支持类似的开关。有2款简单的芯片能实现这个功能:CD4016和CD4066。但是因为用在手持设备,体积有限,尽量不想增加芯片。恳请大家帮忙!
CD4066应该是模拟开关吧?你用三态门试试,使能时是inout型,看可以不?

大浪淘沙
留下的全是金子
多谢版主,我刚才用三态门试了一下,一个三态门的数据流向是单向的,声明成inout型也只能单向导通,所以至少要用2个三态门,但是这样就必须关心某时刻的数据流向来控制2个三态门的通断,不太容易实现。恳请大家帮忙看看还有没有什么好办法!!
process(en_1,en_2,a,b)
begin
if en_1='1' then
a<=b;
elsif en_2='1' then
b<=a;
else a<='Z';
b<='Z';
end if;
end process;

这样能满足你的要求吗?

大浪淘沙
留下的全是金子
先谢谢版主一直热心关注!
这样的确可以满足双向传输,但是必须判断某个时刻数据的传输方向才能确定en_1 en_2的值,而我的电路里面数据流长度不固定,实时的判断方向实现起来十分复杂。
我曾经按照这样的思路写了一个不需要人为关心传输方向,可以自动切换en_1 en_2值的传输门。原理是把a,b端口的值做异或,为0时说明导通方向正常不需要改变2个使能值,为1时说明导通方向错误交换使能端值。但是这样的设计在电路上不工作,原因可能是当线上处于高阻态时扇出为0,无法驱动异或门。
小弟为此困扰多日,如有高见,恳请不吝赐教!!谢谢!!
en_1 en_2肯定要用外电路控制。
否则这个IC也太智能了吧。
你先研究CD4066如何使用再来考虑如何写这个CPLD。
陈石亮
CD4066是双向开关,原理是用mos管组合逻辑,这个原理很简单。如果任何的综合器支持Verilog里面nmos pmos这样的原语,问题也就解决了,但是同tranif0 tranif1一样几乎没有综合器支持这些原语。
楼主~~~~~
我了碰到和你一样的问题~~~使用的CPLD是XC9572,请问问题解决没有~~~~有好的方案给你一个EMAIL,ymwuhao@126.com,谢谢了~~~~~~
你好~~~加个好友。见面一起睡觉哈~~~
不好意思,到现在还没有好办法呢,都要关心传输的方向。
我验证了多次就是不能实现,双向传输必须要控制方向,我现在在改电路,要使模拟开关才能实现,不过不是谢谢楼主~~~~~~~
你好~~~加个好友。见面一起睡觉哈~~~
错~~是还是要谢谢楼主~~~~~~太不小心了打错字
你好~~~加个好友。见面一起睡觉哈~~~
返回列表