- 博客(104)
- 资源 (1)
- 收藏
- 关注
原创 Verilog基础语法——阻塞赋值与非阻塞赋值、组合逻辑与时序逻辑
本文介绍了阻塞赋值与非阻塞赋值、组合逻辑与时序逻辑的基本概念和用法,以及两两组合得到4种不同的电路描述风格。
2024-05-20 17:22:52
3183
4
原创 Verilog基础语法——条件语句if-else与case
在Verilog语法中,常用的条件语句有if-else语句和case语句,用于判断条件是否为真,并执行判断条件后面的表达式。
2024-05-16 09:18:17
5994
原创 Verilog基础语法——状态机(类型、写法、状态编码方式)
在FPGA设计过程,经常会设计状态机用于控制整个硬件电路的工作进程,也称为有限状态机(Finite State Machine,FSM)。本文中对状态机的类型、写法以及状态编码方式进行介绍。
2024-04-30 16:25:56
11107
原创 Verilog基础语法——parameter、localparam与`define
在本文中,我们学习了Verilog基础语法中三种不同的参数定义方式——localparam、parameter与`define,其中,`define定义的参数作用范围最广,且支持用于模块之间的参数传递;localparam作用范围仅为模块内部,且不支持参数传递;而parameter是两者的折中,作用范围为模块内部,但是支持参数传递。
2024-04-25 17:17:05
6805
原创 FPGA设计篇——波形绘制软件
在FPGA设计过程中,经常需要编写设计文档,其中,不可缺少的就是仿真波形的绘制,可以直接截取Vivado或者Modelsim平台实际仿真波形,但是往往由于信号杂乱无法凸显重点。因此,通过相应软件绘制波形,并予以标注,会更加直观。目前,常用的波形绘制软件有:Visio、TimeGen、WaveDrom等,本文主要介绍这三款软件波形图的绘制。
2024-04-25 15:32:37
5844
2
原创 CRC校验原理与FPGA实现(含推导过程)
本文介绍了CRC校验中的基本概念,包括CRC校验模型、生成多项式、校验码宽度、数据宽度、寄存器初始值等。同时推导了串行CRC校验与并行CRC校验的公式与相应的电路,包括长除法、线性移位寄存器法设计的串行CRC校验电路与由线性移位寄存器法校验电路推导得到的并行CRC校验电路,我们还给出了相应的电路对应的RTL代码,并进行功能验证,验证通过。
2023-09-22 15:07:14
6585
15
原创 牛客网Verilog刷题——VL54
当写数据指示信号write_en有效时,通过写地址信号write_addr 和写数据write_data,向对应位置写入相应的数据。在题目中,并未指出数据的读写操作是同步的还是异步的,从题目中给出的时序图看,题目要求在读使能有效的该时钟内读出数据,比如在读使能read_en有效时,地址为0,立刻读出地址0中的数据1,地址为1,则立刻读出地址1中的数据2,可见时序图要求的是异步读,但是在程序中,我们设置为同步读,仿真也是通过的(个人觉得题目有问题,没有指出读写是同步还是异步,仿真也有问题)。
2023-08-01 08:46:29
917
原创 牛客网Verilog刷题——VL53
根据读地址的位宽(为7),我们可以知道该单端口RAM的深度为128,所以该RAM是一个宽度为4,深度为128的单端口RAM。需要注意的是:该RAM非写即读,即enb=1,则为写操作;enb=0,则为读操作。设计一个单端口RAM,它有: 写接口,读接口,地址接口,时钟接口和复位;存储宽度是4位,深度128。注意rst为低电平复位。模块的接口示意图如下。
2023-08-01 08:45:55
1035
原创 牛客网Verilog刷题——VL52
请编写一个十进制计数器模块,当mode信号为1,计数器输出信号递增,当mode信号为0,计数器输出信号递减。每次到达0,给出指示信号zero。
2023-08-01 08:45:08
1074
原创 牛客网Verilog刷题——VL51
请编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号zero,当置位信号set 有效时,将当前输出置为输入的数值set_num。
2023-08-01 08:44:41
1695
原创 牛客网Verilog刷题——VL50
请编写一个模块,实现简易秒表的功能:具有两个输出,当输出端口second从1-60循环计数,每当second计数到60,输出端口minute加一,一直到minute=60,暂停计数。在这里需要注意的是:second在复位时是0,也就是说第一个minute的计数是从0计数到60,而后面second计数到60后,再进行计数时,是从1计数到60。
2023-07-31 10:47:17
496
原创 牛客网Verilog刷题——VL49
由于快时钟域clk_fast的时钟频率大于慢时钟域clk_slow的时钟频率,快时钟域的脉冲信号可能无法被慢时钟域采样到,因此需要把快时钟域clk_fast的脉冲信号进行展宽,然后再将展宽后的快时钟域下的脉冲信号用“打两拍”的方法同步到慢时钟域,这里存在一个问题:快时钟域的脉冲信号展宽要展宽为几个时钟宽度?(2)将展宽后的快时钟域脉冲信号signal_pulse_fast_extend同步到慢时钟域clk_slow(打两拍),得到signal_pulse_fast_extend_f2s_2;
2023-07-31 10:45:05
671
原创 牛客网Verilog刷题——VL48
本题考察的就是多比特跨时钟域处理,但是题目中没有指出是快时钟域到慢时钟域还是慢时钟域到快时钟域,只是明确指出data_en至少保持3个clk_b时钟周期,data_in至少保持10个clk_b时钟周期,也就是说,时钟域clk_a下的信号同步到时钟域clk_b下,在clk_b的上升沿处,肯定能被采集到,不会出现像我们常见的快时钟域到慢时钟域处理中,出现的慢时钟域采集不到快时钟域信号的情况,所以本题只需要简单的将单比特的使能信号进行跨时钟域处理后,再作为多比特跨时钟域处理打拍中的使能信号即可。
2023-07-31 10:43:50
916
原创 牛客网Verilog刷题——VL47
注意:牛客中很多题目与答案不符,本题要求设计一个格雷码计数器,没有说明具体设计要求。实际上本题的设计要求是:初始化格雷码计数器输出为0值,然后将格雷码转为二进制码,然后二进制码计数器加以后再转为格雷码进行输出,要求格雷码计数器输出两个时钟周期发生一次变化。所以格雷码计数器设计中应该包含三个部分:格雷码转二进制、二进制计数器、二进制转格雷码。实现4bit位宽的格雷码计数器。
2023-07-31 10:01:44
901
原创 牛客网Verilog刷题——VL46
同步FIFO中,读操作与写操作均在同一时钟域下进行,不涉及跨时钟域操作,所以只需要用一个计数器来计数当前FIFO中存储的实际数据个数(写入数据个数减去读出数据个数),再用于判断产生空满信号即可。根据题目提供的双口RAM代码和接口描述,实现同步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。双口RAM代码如下,可在本题答案中添加并例化此代码。
2023-07-31 08:52:38
864
原创 牛客网Verilog刷题——VL45
异步FIFO设计中,一般分别设计一个读地址指针与写地址指针,用于判断当前FIFO的空满。由于读操作与写操作不再同一时钟域下,所以需要做跨时钟域处理,而读地址指针与写地址指针是多比特信号,跨时钟域处理一般转为格雷码后再进行跨时钟域传输,这是由于格雷码形式的地址指针每次加1时,只有1比特发生改变,这样就转换为单比特跨时钟域处理的问题,单比特跨时钟域处理可以用打两拍的方式进行处理。请根据题目中给出的双口RAM代码和接口描述,实现异步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。
2023-07-31 08:18:05
642
原创 牛客网Verilog刷题——VL44
如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值。两段式状态机中,现态curr_state与次态next_state均为寄存器类型变量,现态curr_state()用组合逻辑,表示下一个状态;而数据的输出也是使用组合逻辑,这也是和三段式状态机的区别之处。)用时序逻辑,表示当前状态;次态next_state(1、 必须使用对应类型的状态机。2、 使用二段式描述方法。注意rst为低电平复位。
2023-07-31 08:14:18
549
原创 牛客网Verilog刷题——VL43
如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值。三段式状态机中,现态curr_state与次态next_state均为寄存器类型变量,现态curr_state(2、 使用三段式描述方法,输出判断要求要用到对现态的判断。)用时序逻辑,表示当前状态;次态next_state(用时序逻辑,输出一些使用状态机控制的数据等。1、 必须使用对应类型的状态机。)用组合逻辑,表示下一个状态;注意rst为低电平复位。
2023-07-31 08:12:55
498
原创 牛客网Verilog刷题——VL42
请设计一个可以实现任意小数分频的时钟分频器,比如说8.7分频的时钟信号,注意rst为低电平复位。提示:其实本质上是一个简单的数学问题,即如何使用最小公倍数得到时钟周期的分别频比。设小数为n,此处以8.7倍分频的时钟周期为例。首先,由于不能在硬件上进行小数的运算(比如2.1个时钟这种是不现实的,也不存在3.3个寄存器),小数分频不能做到分频后每个时钟周期都是源时钟的n倍,也无法实现占空比为1/2,因此,考虑小数分频,其实现方式应当为53个clk——out时钟周期是10个clkin时钟周期的8.7倍。
2023-07-31 08:11:40
1052
原创 牛客网Verilog刷题——VL41
请设计一个可以实现任意小数分频的时钟分频器,比如说8.7分频的时钟信号,注意rst为低电平复位。提示:其实本质上是一个简单的数学问题,即如何使用最小公倍数得到时钟周期的分别频比。设小数为n,此处以8.7倍分频的时钟周期为例。首先,由于不能在硬件上进行小数的运算(比如2.1个时钟这种是不现实的,也不存在3.3个寄存器),小数分频不能做到分频后每个时钟周期都是源时钟的n倍,也无法实现占空比为1/2,因此,考虑小数分频,其实现方式应当为53个clk——out时钟周期是10个clkin时钟周期的8.7倍。
2023-07-31 07:40:25
804
原创 牛客网Verilog刷题——VL39
设计一个自动贩售机,输入货币有两种,为0.5/1元,饮料价格是1.5/2.5元,要求进行找零,找零只会支付0.5元。1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号。2、此题忽略出饮料后才能切换饮料的问题。注意rst为低电平复位。
2023-07-04 17:02:08
1041
原创 Xilinx原语——IDDR与ODDR的使用(Ultrascale系列)
对于各个系列的器件,IDDR与ODDR都存在一定的差别,在使用前需要根据自己的器件型号选择相应的IDDR与ODDR,本文以kintex ultrascale系列器件为例。
2023-06-06 09:59:14
5786
2
原创 手撕代码——异步FIFO
异步FIFO(Asynchronous First-In First-Out)是一种常见的数据存储器,用于在异步时钟域之间进行数据传输和缓冲。与同步FIFO相比,异步FIFO不依赖于时钟信号的同步,而是使用异步握手信号来管理数据的读写操作。异步FIFO通常由以下几个关键部分组成:读取指针(Read Pointer)、写入指针(Write Pointer)、存储单元(Storage Element)等。
2023-05-21 16:58:25
2637
原创 手撕代码——同步FIFO
在FPGA设计中,FIFO(First-In, First-Out)是一种用于数据存储和传输的重要组件。它是一种带有读取和写入指针的存储器,可按照先进先出的顺序存储和检索数据。FPGA中的FIFO通常用于解决数据流处理中的数据缓冲和流量控制问题。它可以暂时存储数据,允许数据在不同的时钟域之间进行传输和同步。FIFO在FPGA设计中广泛应用于许多领域,包括数字信号处理、图像处理、通信协议和数据通路设计等。在本文中,我们自己用Verilog编写了一个简单的同步FIFO。
2023-05-17 10:40:04
2619
原创 牛客网Verilog刷题——VL38
设计一个自动贩售机,输入货币有三种,为0.5/1/2元,饮料价格是1.5元,要求进行找零,找零只会支付0.5元。需要注意的是,投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号,其中rst为低电平复位。
2023-04-26 21:04:53
388
原创 牛客网Verilog刷题——VL36
在题目中,要求使用状态机设计,也可以使用移位寄存器设计,下面我们分别给出了使用状态机进行序列检测与使用移位寄存器进行序列检测的代码。1、进行重叠检测 即10110111 会被检测通过2次。2、寄存器输出,在序列检测完成下一拍输出检测有效。注意rst为低电平复位。
2023-04-26 20:51:13
335
原创 牛客网Verilog刷题——VL35
(1)进行非重叠检测 即101110111 只会被检测通过一次;注意rst为低电平复位,信号示意图如下。(2)寄存器输出且同步输出结果;
2023-04-26 16:29:41
339
原创 牛客网Verilog刷题——VL34
电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;rst_n是异步复位信号。实现数据位宽转换电路,实现8bit数据输入转换为16bit数据输出。其中,先到的8bit数据应置于输出16bit的高8位。接口时序示意图如下。
2023-04-26 16:23:03
314
原创 牛客网Verilog刷题——VL33
在这里,输入数据的位宽是24比特,而输出数据的位宽是128比特,不是输入数据的整数倍,那么就需要计算输入数据位宽和输出数据位宽的最小公倍数,24与128的最小公倍数为384,也就是说每输入16个数据,为一轮,就可以产生3个完整的128比特输出,如下图所示。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;实现数据位宽转换电路,实现8bit数据输入转换为12bit数据输出。其中,先到的数据应置于输出的高bit位。
2023-04-26 16:19:12
371
原创 牛客网Verilog刷题——VL32
在这里,输入数据的位宽是24比特,而输出数据的位宽是128比特,不是输入数据的整数倍,那么就需要计算输入数据位宽和输出数据位宽的最小公倍数,24与128的最小公倍数为384,也就是说每输入16个数据,为一轮,就可以产生3个完整的128比特输出,如下图所示。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;实现数据位宽转换电路,实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高bit位。
2023-04-26 16:16:40
481
原创 牛客网Verilog刷题——VL31
电路的接口如下图所示。valid_a用来指示数据输入data_in的有效性,valid_b用来指示数据输出data_out的有效性;ready_a用来指示本模块是否准备好接收上游数据,ready_b表示下游是否准备好接收本模块的输出数据;实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时,数据传输无气泡,不能由于本模块的设计原因产生额外的性能损失。
2023-04-26 16:15:50
436
原创 牛客网Verilog刷题——VL30
实现串并转换电路,输入端输入单bit数据,每当本模块接收到6个输入数据后,输出端输出拼接后的6bit数据。本模块输入端与上游的采用valid-ready双向握手机制,输出端与下游采用valid-only握手机制。数据拼接时先接收到的数据放到data_b的低位。电路的接口如下图所示。valid_a用来指示数据输入data_a的有效性,valid_b用来指示数据输出data_b的有效性;ready_a用来指示本模块是否准备好接收上游数据,本模块中一直拉高;rst_n是异步复位信号。
2023-04-26 13:55:23
460
原创 牛客网Verilog刷题——VL29
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。请使用Verilog HDL实现以上功能。
2023-04-26 13:53:58
429
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人