Verilog手撕代码
文章平均质量分 82
Verilog设计/手撕代码
FPGA个人练习生
这个作者很懒,什么都没留下…
展开
-
Verilog手撕代码(11)1检测(统计个数、独热码检测、1的位置检测)
那么我们就可以利用一个for循环,把每一位相加,最后再把最终的结果和1比较一下,如果是1,那就是独热码,如果不是1,那就是其他的数。对于一个4位的二进制数,我们对这4位奇偶校验,利用异或门依次进行每一位,最后的结果如果是奇数个1那么4位异或之后结果就是1,如果偶数个1那么结果就是0。独热码是一种二进制编码方式,它的特点是,用来编码这个数的N位bit中,有且只有一位是1,其余位全部为0。因为只有1位是1,所以叫做one-hot (对应的,还有一种编码方式是只有1位是0,其余位都是1,叫做one-cold)原创 2023-06-25 15:42:32 · 4852 阅读 · 1 评论 -
Verilog手撕代码(10)异步复位同步释放
但此时第二级触发器不会立刻变高,它要么复位为0,要么跟随前一级触发器的输出Q1,而前一级触发器的输出Q1为0,因此,无论如何第二级触发器的输出都为0,而触发器1的输出,若稳定后Q1为1,那么rst_sync_n在下一个周期被拉高,实现同步释放;数字电路中的寄存器和RAM上电后的默认状态和数据是不确定的,复位就是将其回到初始状态0,RAM也可由此初始化到0,也可根据设计需要复位到1,此外,当逻辑进入到错误的状态时,用复位将所有逻辑复位到初始状态,如没有复位,则将一直处于错误逻辑状态。原创 2023-06-24 12:52:11 · 1130 阅读 · 0 评论 -
Verilog手撕代码(8)握手机制
valid_a用来指示数据输入data_in的有效性,valid_b用来指示数据输出data_out的有效性;实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。实现串并转换电路,输入端输入单bit数据,每当本模块接收到6个输入数据后,输出端输出拼接后的6bit数据。valid_a用来指示数据输入data_a的有效性,valid_b用来指示数据输出data_b的有效性;握手信号,就是为了模块之间的数据交互正确才衍生出来的信号。原创 2023-06-21 16:23:10 · 1598 阅读 · 0 评论 -
Verilog手撕代码(7)数据位宽转换
数据位宽转换器,一般常用于模块接口处,比如一个电路模块的输出数据位宽大于另一个模块的输入数据位宽,此时就需要进行数据位宽转换。比如SATA控制器中,内部数据位宽为32bit,但外部物理收发器PHY的接口通常为16bit,或者8bit,在不使用FIFO进行缓存的情况下,可以使用数据位宽转换器,通过时钟倍频在实现数据位宽的转换。其中,先到的8bit数据应置于输出16bit的高8位。假设数据从模块A传入到模块B,模块A的输出数据为32位,模块B的输入数据位宽为16位,并把数据从A传入B而不损失数据。原创 2023-06-19 18:45:04 · 5099 阅读 · 0 评论 -
Verilog手撕代码(6)分频器
其中a计数器是由clk_flag控制的,b计数器是由clk_out控制的,而本质上clk_flag是由系统时钟clk进行控制的,因此a由系统时钟clk控制,与其他采用系统时钟clk的模块都保持着相同的时钟关系,b由clk_out控制,与系统时钟clk存在一定的偏差,因此推荐使用脉冲信号的写法。在一些低速系统或模块中,使用分频时钟出现问题的概率较低,但在高速系统和模块中,使用分频时钟就会容易出现问题,导致各模块的时钟到达时间存在较大的偏差,为解决这个问题,分频时生成脉冲时钟。Testbench与上面一样。原创 2023-06-13 14:56:07 · 6417 阅读 · 0 评论 -
Verilog手撕代码(5)串转并、并转串
串转并的使用环境非常多,在接口处用到最多,在某些模块的输入仅允许串行输入时,而总线上的数时并行的,那就需要通过串并转换,把并行的数据转换成串行的数据,包括在输出的时候,需要把串行的数据转换成并行的数据,才能送到总线中,使用方法都是用一个计数器来计数实现。原创 2023-05-29 17:17:11 · 3660 阅读 · 1 评论 -
Verilog手撕代码(4)序列检测
序列检测有两种写法,分别为状态机和移位寄存器,且序列检测也有很多类型,如连续和非连续检测、重叠和非重叠检测、含有无关项检测。原创 2023-05-15 19:25:32 · 523 阅读 · 0 评论 -
Verilog手撕代码(3)状态机
一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出。二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出。应该选择哪一种状态机?原创 2023-05-14 16:56:12 · 1402 阅读 · 1 评论 -
Verilog手撕代码(2)边沿检测
在使用FIFO进行数据读写的时候,我们会用到边沿检测,比如当FIFO内的数据被读空了,这样 empty 信号就会从0→1,产生一个上升沿,当这个上升沿到来的时候代表FIFO内孔,我们就可以对FIFO进行一个写操作(把写使能拉高,往FIFO写数据),所以边沿检测是十分常用的东西,下面我们来讲讲边沿检测的原理、代码以及对应仿真。比如我们要检测信号 signal 的上升沿,我们使用两个寄存器,级联记录 signal 的值,这样由于寄存器延迟一拍的特性,第二个寄存器永远会延迟第一个寄存器。原创 2023-05-13 19:31:06 · 335 阅读 · 0 评论 -
Verilog手撕代码(1)加法器
逻辑电路事先得出每一位全加器的进位输入信号(并行计算各个加法器的进位),而无需再从最低位开始向高位逐位传递进位信号,一种用面积换性能的方法。:N bit的加法器由N个1 bit的全加器组成。从低位开始,逐位相加, 每一bit需要等待前面计算出来得到进位,才能进行下一bit的计算。所谓半加器,就是不考虑进位的加法器,只有两个输入和两个输出;这里只做简单介绍,流水线的相关知识点在这先不详细介绍,后续将详细介绍并分析流水线相关知识点!任意位宽的超前进位加法器的代码:(以4bit为例):电路比较复杂,面积大。原创 2023-05-13 18:01:04 · 1061 阅读 · 0 评论