作者Baneling (爆炸一哥)
看板Electronics
标题Re: [问题] Verilog 用 data edge 作为讯号输入
时间Mon Jan 4 21:35:59 2016
※ 引述《FTICR (FT-ICR)》之铭言:
: ※ 引述《Baneling (爆炸一哥)》之铭言:
: : 标题: Re: [问题] Verilog 用 data edge 作为讯号输入
: : 时间: Mon Jan 4 02:02:15 2016
: : 看你的想法我大概会有几个疑问吧
: : 1.你这样写或者要实现这样的function想要得到什麽样的好处?
: : 一般来说如果真的要对clock动手脚一定会有甚麽原因
: : 不外乎操作速度要更快或者面积要更小, 或者是逼不得已的情况(介面处理)
: 因为输入讯号(a)类似pulse,且它pulse width 很短没办法用 synchronous
: : 2.clk与a这两个讯号的关系?
: : 如果a是源自於clk的讯号,简单来说就是同步的东西
: : 那就在状态转换的时候写一个条件去判断就好了
: : 如果是不同步的两个讯号, 那状态机为何要用两个不同的clock去驱动?
: : 而且处理不同步的讯号也不是用这种方式去处理的~
: 我知道如果是 synchronous 就好解决,但不清楚处理这样 asynchronous 讯号该怎麽做,
: 所以才想这些做法
如果是这种例子,我建议你pulse先用一种电路放大
我记得叫做pulse amplifier,详细的名字跟电路我有点忘记了
它是用逻辑闸(忘了是nor还是nand)兜出来的电路,功能很简单就是加宽你的pulse width
不过它有logic loop所以无法用合成的方式实现
要用full custom的方式做出来,如果有standard cell lib的话就直接去挑逻辑闸来用
pulse width加宽到比一个clock宽就可以了
在数位IC设计这边把pulse width直接加宽去模拟
这个讯号就当作是一个输入aa
然後你在做一个用clk去驱动的synchronizer(可以用verilog写)去同步aa
这个aa就可以当作状态机里面的控制条件了
: : 如果你真的想要把这种做法实现,我大概会用这种方式去写
: : always@(posedge clk_a or negedge rst) begin
: : if(!rst) state<=state_1;
: : else begin
: : case(state)
: : state_1: begin
: : state<=state_2;
: : end
: : state_2: begin
: : ..
: : ..
: : endcase
: : end
: : end
: : assign clk_a=(state==state_1) ? a : clk;
: : 只是你在synthesis以及APR的时候对clock下的constraint
: : 还是要去思考我上面问的那些问题
: : (考虑clk_a, clk, a等讯号之间的关联性)
: 了解! 感谢 Baneling 大,我研究看看是否可行
如果a是很小的pulse,就算verilog写得出来合成应该还是会gg
因为这样写clk_a的周期等校上只有pulse width的宽度
DFF的clock有最小宽度的限制,详细规格要看你使用的design kit
: : 真心建议你,先把"可合成"的verilog语法弄熟,其实当初教我做数位IC的人讲过一句话
: : 你写的verilog大多是把你想像中的硬体写出来,硬体我们能用的不外乎就是flip flop
: : latch跟logic gate,因此procedural block中的sensitivity list会写成这样
: : 简单来说就是模拟器执行这些可合成语法的方式会类似真实电路的动作
: : 因此这些语法就会被归类为"可合成"
: : 是因为合成软体看到这类型的code会找出相对应的硬体。
: : 如果短时间之内没办法做到这种程度就先了解到
: : "testbench想怎麽写没关系,但设计一定要用可合成的语法"
: 之前是有写过一些很简单的 Verilog 做完合成、APR,也蛮清楚要用硬体的观点去想,
: 只是这个 case 可能有点特殊所以卡住了
其实问题是一样的,如果想要往这方面走你的问题可能像是姆O教主说的一样
缺乏对数位基本元件的理解,同步电路本身就是在躲一些问题所以才会用这种东西
想要理解的话去听听看VLSI吧~ 买书回来念也可以
: : 其实你想像中的情况跟我想表达的情况应该有一段差距 :s
: : 可能我用的standard cell比较单纯,我几乎没写过这种可以被两个clock trigger
: : 的procedural block,一般来说没有DFF可以同时被两种clock触发,所以这种写法
: : 就算能用,在coding style上来说也是很不好
: 还不确定是不是 synthesizable、模拟对不对
: : 要也是像我上面那样写,先把clock处理过後再送到DFF。
: : (当然constraint要怎麽下又是另外一回事了)
: : 另外建议你,写FSM就把comb跟sequ写在一起了,因为大部分写法都把控制讯号
: : 跟FSM的state写在一起,当你状态很多的时候描写state的procedural block会拖很长
: : 你每个控制讯号独立写成单一procedural block,debug的时候你看自己的code
: : 会上上下下拉到很想死。
: 感谢,因为上课的时候都是学到这样的写法,顶多功能不同电路分到不同的 always block
: 或 module来写
: : 其实有经验,code写出来有相对应的synthesis以及APR(CTS)的constraint
: : 要怎麽做大概都可以,问题就在於很多人在下constraint的时候其实都没有弄得很清楚
: : EDA tool解读这些constraint的方式还有处理电路的手法,如果是这种情况
: : 我觉得就先别去把设计搞这麽复杂了,single clock domain的设计先弄清楚吧~
: : 原po写code的方式感觉就是刚出新手村,就不太建议自己去找麻烦 XD
: 确实没有太多经验,只写过一些简单的电路 (像是自动贩卖机@@)
去找本书来K,"advanced digital design",作者是Mano,里面有很多范例
也有很多实用的IP教学,刚开始学数位IC的时候这本书陪我不少时间
不过最快的方式应该还是去读个研究所比较快 XD
: : 嗯呀,真的要对clock动特别的手脚(除频以外的功能),也是使用DFF的输出居多。
: : 不过CTS也要另外处理,通常是吃力不讨好
: : --
: : 推 obov: 把verilog/HDL当C(or其他)写的人 尤其是以前资工转硬体的 01/04 02:41
: : → obov: 最常见的观念错误就是 不懂甚麽叫做DFF 01/04 02:42
: : → obov: DFF最重要的一个特性 就是setup/hold time 01/04 02:42
: : → obov: 这是当代绝大多数数位电路设计的核心 01/04 02:43
: 我非 EE 本科 (也跟资工、软体无关),只是对硬体很有兴趣想多了解,所以才想学这些
: 数位逻辑、IC 设计都修过,setup time/hold time/time borrowing/timing violation
: 这些概念上课也都有学到
: : → Baneling: 他们会觉得那是一种变数~ 01/04 03:04
: : 推 xanter: 原PO写的CODE真的像新手村出来的 01/04 10:16
: : → tonybin: 竟然需要教主出来教电子学 囧 01/04 18:08
: : 推 cebelas: 教主安安 01/04 18:35
: 感谢 B 大和各位前辈的指导 小弟不懂的东西还太多了 QQ
理论要跟Tool的使用结合才会有用..
如果你有钱的话,真心推荐CIC的课程,便宜又大碗
讲师大多都资深工程师,人也都nice
不过我觉得做硬体可以再考虑考虑就是了...
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.234.146.229
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1451914561.A.0EC.html
1F:→ tonybin: ...最後一句话颇有深意,是事实就是了 01/04 22:09
2F:推 FTICR: 感谢 B 大各种 useful 的建议 以後会不会把这当工作还难讲 01/04 23:05
3F:→ FTICR: 底子还是差多了 01/04 23:06