一、关于有关时钟透传的理解
- TDM(时分多路复用):是不同的信号在不同的时间内进行传输,将整个传输时间分为多个时间间隔(Slot Time,TS,时隙),同时时分复用还分为有两个:同步时分复用以及异步时分复用。前者采用固定时间片的分配方式,将传输信号按照特定的长度划分为特定的时间段,再将每一个时间段划分为等长度的多个时隙,当时出现了无论时隙使用者是否传输数据,都会占用时隙;后者的异步时分复用就克服了这种缺点,只有当某一用户有数据要发送时才分配时隙,暂停发送数据时,就不分配时隙。 参考文档地址.
- 频率同步(时钟同步):信号之间的频率或相位保持严格的特定关系,有效瞬间以同一平均速率出现。频率不一致可能会导致相位漂移,导致在传输的比特流中出现活动损伤。
- 时间同步:按照接受到的时间调控设备内部的时钟和时刻(既调控时钟的频率又调控时钟的相位,且可以接受非连续的时间信息,非连续调控设备时钟)。时间同步有两个最主要的功能,授时和守时,授时就是不定期对表保证本地时间与源时间同步;守时就是频率同步,保证本地时钟与原时钟的偏差很小。
- 频率同步以及时间同步的两者的区别:时间同步是每时每刻时间都保持一致;频率同步是两个时间总是保证一个恒定的差。
- 需求分布:传统固网TDM业务、无线IP RAN、专用时钟同步网
- 时钟透传的实现
- 同步以太网技术:发送侧的CX将高精度时钟注入Internet物理层,再将这个高精度的时钟进行发送,接受侧的CX物理层从数据中提取这个时钟,实现同步Internet。局限是要求时钟路径上的所有链路都具有同步以太网特性。
- 电路仿真包恢复时钟技术(自适应时钟恢复算法):源设备向目标设备发送报文,目标设备使用一个队列缓存这些报文,然后使用自己的本地时钟将报文发送出去,假如说源时钟与目的时钟没有保持一致,那么会导致缓存队列的深度发生变化。若队列深度持续增加,那么说明本地时钟比源时钟慢,需要调高本地时钟;若队列深度持续减少,那么说明本地时钟比源时钟快,需要降低本地时钟。
- TOP(Time Over Packet)方式恢复时钟:源时钟定期发送时间报文到从时钟,后者计算本地时钟与远端时钟的差异,实现“对表”。同样的,若是两者的频率保持一致,那么这个时间差保持不变,
二、FPGA的verilog中常用的相关的书写规范
TIPS:由于新入手FPGA的Verilog编写,遇到了很多书写规范上的问题,因此,对于相对应的问题,进行集中处理,查询了部分资料,将自己常常遇到的不规范的写法进行纠正
- 每个.v文件中只能包含一个module,并且module名称需要与文件名称一致。
- parameter参数的信号量需要进行大写,其余的需要进行小写;连续使用单词命名的时候,两个单词需要使用下划线进行连接。信号名称的长度不能超过20个字符。
- 需要对信号的相关参数进行注释,以方便进行阅读以及后期人员的维护。
- 使用注释的时候需要注意,单行注释使用的是“//”,多于一行的注释使用的是“/* */”。
- 例化名称使用“u+xx子模块名称”标识。前者(“.”后的部分)写的是子模块名以及子模块的端口信号,(括号内的部分)后面的名称表示的是例化模块名称以及例化模块的端口信号。例化名称相当于一个标识,当例化多个相同的模块时,可以通过例化名称来识别是哪一个例化。顶层模块定义模块内参数时,那么子模块内的值跟随顶层模块的参数值变化,无论子模块内有无包含参数;但是当子模块内包含了参数的定义,做模块的例化(顶层模块中)的时候就可以不添加对参数的例化,这样的话模块的参数值就等于模块内实际的值。
- 建议每一个模块中添加timescale。
- 模块中的接口信号定义按照输入->双向->输出的顺序定义。
- 在模块内不能有没有驱动源的信号。
- 三态逻辑可以在顶层模块中使用,子模块中禁止使用三态。但是如果能够确保该信号不会被其他的子模块使用,而是直接通过顶层模块输出到IO口,那么就可以在子模块中使用三态。
- 功能仿真中,非阻塞赋值应该增加单位延迟;阻塞语句不能够使用单位延迟。
- 定义的变量一定需要使用(parameter、wire、reg);不能出现没有使用但是定义的情况。不建议使用integer的类型的寄存器。
- 一行中不能出现多个表达式。使用到的数据采用标准的基数表示法书写(如0,1,z使用的写法是1’b0,1’b1,1’bz)。
- 所有变量(在if-else或者是case语句中)在所有分支中都有赋值。if-else的末尾是else,case语句的末尾是default,同时值得注意的是if-else语句的嵌套不推荐使用5级以上。
- 条件表达式必须是1bit值。(如“reset == 1’b1”或者是 “reset == 1’b0”,如果写成if(!reset)或者是if(reset == 0)就是错误的。
- 异步电路以及同步电路应该区分开,便于后端综合和约束。
- 一个模块(module)中,只能是在时钟信号的一个沿进行操作(上升沿或者是下降沿),如果说必须同时使用时钟上升沿和时钟下降沿,则必须分模块进行设计。
- 代码对齐方式使用的是空格而非TAB。(具体空格数量可以参照前面的文章介绍)