reg和wire+fsdb转文本+FIQ和IRQ+桶形移位+数据转换+数据同步+NRZ和NRZI+加法器有效使用

发布时间 2023-08-06 18:09:41作者: 大浪淘沙、

reg和wire

https://mp.weixin.qq.com/s?__biz=MzUyNzA2MDA0OQ==&mid=2247531642&idx=1&sn=be10436fa547d894cf58bbffac48a0fd&chksm=fa076144cd70e8524cbc108db18e5fdf9472a0ea9e2b14f4b55d3d3d936136bc50b7b4c30589&scene=27

wire可以作为模块的输入和输出,但是reg只能作为模块的输出。

wire可以作为外部的连接链接到输入和输出,reg只能作为外部模块的输入。

reg可以综合成register,latch,甚至wire(当其只是中间变量的时候),可以用于组合逻辑或者时序逻辑,能存储数据

默认的wire是z态,reg是x态。

fsdb转文本(csv文件)

使用fsdbreport工具
https://codeantenna.com/a/LJfe6286bv

FIQ和IRQ中断

在ARM的处理器中断中,有FIQ:Fast Interrupt Request, IRQ: Interrupt ReQuest。
FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理。
FIQ的中断向量地址在0x0000001C,而IRQ的在0x00000018。(也有的在FFFF001C以及FFFF0018)
IRQ位置只能存储一条指令,否则会把FIQ覆盖掉。因此IRQ中断的位置存储的是跳转指令,进入中断后还需要一次跳转指令才能真正的执行中断服务程序。
而FIQ直接执行中断服务程序,理论上更快。
FIQ和IRQ可以类比到riscv的中断MODE,普通MODE下是FIQ,跳转的位置是0号中断。Vector模式下跳转的地址也是4byte对其的,是IRQ的形式,也是只能存储一个跳转指令。

桶形移位器

https://www.cnblogs.com/doincli/p/15803313.html
如何在单个时钟周期内作出指定位数(如位宽是8位)的移位方法?事先并不知道要移动的位数,那么就把所有的可能性都做出来,通过case语句选择即可。
本质上就是把8个移位器做出来,然后再进行片选使用:单个周期进行多个移位。

数据转换器

由宽到窄

https://www.cnblogs.com/family5love/p/16184645.html
image
基本原理:
data_in_r是在clk2x时钟驱动下读入数据,因此会读两次相同的结果;

data_out是16bit数据输出。在clk2x时钟驱动下,
当clk1x为0时输出data_in_r的低16位
当clk1x为1时输出data_in_r的高16位

由窄到宽

https://www.bilibili.com/read/cv15677724/
仍然使用clk2x采样数据(频率高才能采样到)临时存储半个数据和1个数据,然后使用clk1x输出完整数据。
下图示意,链接处图题不对。
image

数据同步

https://cloud.tencent.com/developer/article/1890021

  1. 使用异步FIFO(占资源过多)
  2. 使用握手机制(耗时,速度慢)
  3. 使用脉冲同步器(相当于引入了一个module吧,没怎么看)
  4. 准时钟同步(PCIe、SATA、USB等,数据内部混入时钟和控制)
    剩下的其它资源,也许数据同步还有很多其它方法,但是我不是做这部分的,看了就忘,先放这里
    https://www.cnblogs.com/lyc-seu/p/12441366.html

NRZ NRZI编码

https://www.jianshu.com/p/c607794ea928

NRZI编码一般用在USB设备中。
最早时候有RZ编码,如果是输出0101010信号,则完整的可以计算出时钟信息,并在后续传输过程中可以实现时钟的同步校准、,但是对带宽资源形成了浪费。
RZ编码以每次信号结束都等待一个时钟周期归零而著称。
image

NRZ编码,失去了同步的校准,回归了带宽资源的使用:
image

NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑:
image

在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI 编码之后,就是一串方波(复习下前面:NRZI 遇 0 翻转遇 1 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。
此外,因为在 USB 的 NRZI 编码下,逻辑 0 会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。
如果要传输的数据中有 7 个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。

加法器的有效使用

https://mp.weixin.qq.com/s?__biz=MzUyNzA2MDA0OQ==&mid=2247544607&idx=1&sn=ec6b652bc72dc917ea3356a086739038&chksm=fa073221cd70bb37727d3299c5c029c3dffad6a54ccdd0bd3aba31c46bedd09b0fd70e794ebc&scene=27

image
综合得到了不同的结果(但是综合工具如果足够给力,对编码直接优化的话,其实怎样编写都无所谓)
image