- 博客(108)
- 资源 (1)
- 收藏
- 关注
原创 累加和校验原理与FPGA实现
在上文《奇偶校验原理与FPGA实现》中,讲解了奇偶校验的基础原理,奇偶校验仅增加1比特的信息冗余,所增加额外开销小,但不可避免存在检错能力有限的问题。本文将讲解另外一种校验码型——累加和校验。
2025-08-07 23:41:40
1050
原创 奇偶校验码原理与FPGA实现
奇偶校验码是一种简单的检错码,主要用于数据传输或存储过程中检测奇数个比特错误或者偶数个比特错误,其实现简单、开销低,但可靠性低、检错能力有限,在UART、RS23等低速串行接口或者早期的存储中会使用到。
2025-08-05 23:30:59
1018
原创 FPGA工具篇——GVim插件管理器Vundle与目录树插件NERDTree的安装与配置(Win11)
Vim(Vi IMproved)是一款跨平台的模态文本编辑器,继承自 Unix 经典编辑器 Vi,以键盘操作为核心,通过模式切换实现高效编辑,是开发者、系统管理员及技术工作者的常用工具。而GVim则是Vim 的图形化外壳,两者共享所有编辑命令和配置。两者选择取决于环境需求——终端环境用 VIM,桌面环境用 GVIM 体验更完整。虽然 Vim/GVim 的插件生态丰富度不及 VS Code 或 Sublime Text,但对习惯 Vim 工作流的开发者而言,合理配置插件仍能显著提升开发效率。
2025-07-23 15:00:00
970
原创 Verilog基础语法——函数function与任务task
本文介绍了Verilog中提升代码复用性的两种封装方法:函数(function)和任务(task)。函数适用于简单的组合逻辑运算,具有单一返回值且不可用时序控制语句;任务则支持时序控制语句,可包含多个输入输出,但可综合性较差。
2025-07-13 21:21:15
725
原创 Verilog基础语法——阻塞赋值与非阻塞赋值、组合逻辑与时序逻辑
本文介绍了阻塞赋值与非阻塞赋值、组合逻辑与时序逻辑的基本概念和用法,以及两两组合得到4种不同的电路描述风格。
2024-05-20 17:22:52
4012
4
原创 Verilog基础语法——条件语句if-else与case
在Verilog语法中,常用的条件语句有if-else语句和case语句,用于判断条件是否为真,并执行判断条件后面的表达式。
2024-05-16 09:18:17
7715
原创 Verilog基础语法——状态机(类型、写法、状态编码方式)
在FPGA设计过程,经常会设计状态机用于控制整个硬件电路的工作进程,也称为有限状态机(Finite State Machine,FSM)。本文中对状态机的类型、写法以及状态编码方式进行介绍。
2024-04-30 16:25:56
17088
1
原创 Verilog基础语法——parameter、localparam与`define
在本文中,我们学习了Verilog基础语法中三种不同的参数定义方式——localparam、parameter与`define,其中,`define定义的参数作用范围最广,且支持用于模块之间的参数传递;localparam作用范围仅为模块内部,且不支持参数传递;而parameter是两者的折中,作用范围为模块内部,但是支持参数传递。
2024-04-25 17:17:05
8857
原创 FPGA工具篇——波形绘制软件
在FPGA设计过程中,经常需要编写设计文档,其中,不可缺少的就是仿真波形的绘制,可以直接截取Vivado或者Modelsim平台实际仿真波形,但是往往由于信号杂乱无法凸显重点。因此,通过相应软件绘制波形,并予以标注,会更加直观。目前,常用的波形绘制软件有:Visio、TimeGen、WaveDrom等,本文主要介绍这三款软件波形图的绘制。
2024-04-25 15:32:37
8906
2
原创 CRC校验原理与FPGA实现(含推导过程)
本文介绍了CRC校验中的基本概念,包括CRC校验模型、生成多项式、校验码宽度、数据宽度、寄存器初始值等。同时推导了串行CRC校验与并行CRC校验的公式与相应的电路,包括长除法、线性移位寄存器法设计的串行CRC校验电路与由线性移位寄存器法校验电路推导得到的并行CRC校验电路,我们还给出了相应的电路对应的RTL代码,并进行功能验证,验证通过。
2023-09-22 15:07:14
8399
16
原创 牛客网Verilog刷题——VL54
当写数据指示信号write_en有效时,通过写地址信号write_addr 和写数据write_data,向对应位置写入相应的数据。在题目中,并未指出数据的读写操作是同步的还是异步的,从题目中给出的时序图看,题目要求在读使能有效的该时钟内读出数据,比如在读使能read_en有效时,地址为0,立刻读出地址0中的数据1,地址为1,则立刻读出地址1中的数据2,可见时序图要求的是异步读,但是在程序中,我们设置为同步读,仿真也是通过的(个人觉得题目有问题,没有指出读写是同步还是异步,仿真也有问题)。
2023-08-01 08:46:29
1019
原创 牛客网Verilog刷题——VL53
根据读地址的位宽(为7),我们可以知道该单端口RAM的深度为128,所以该RAM是一个宽度为4,深度为128的单端口RAM。需要注意的是:该RAM非写即读,即enb=1,则为写操作;enb=0,则为读操作。设计一个单端口RAM,它有: 写接口,读接口,地址接口,时钟接口和复位;存储宽度是4位,深度128。注意rst为低电平复位。
2023-08-01 08:45:55
1149
原创 牛客网Verilog刷题——VL52
请编写一个十进制计数器模块,当mode信号为1,计数器输出信号递增,当mode信号为0,计数器输出信号递减。每次到达0,给出指示信号zero。
2023-08-01 08:45:08
1168
原创 牛客网Verilog刷题——VL51
请编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号zero,当置位信号set 有效时,将当前输出置为输入的数值set_num。
2023-08-01 08:44:41
1800
原创 牛客网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
615
原创 牛客网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
1111
2
原创 牛客网Verilog刷题——VL48
本题考察的就是多比特跨时钟域处理,但是题目中没有指出是快时钟域到慢时钟域还是慢时钟域到快时钟域,只是明确指出data_en至少保持3个clk_b时钟周期,data_in至少保持10个clk_b时钟周期,也就是说,时钟域clk_a下的信号同步到时钟域clk_b下,在clk_b的上升沿处,肯定能被采集到,不会出现像我们常见的快时钟域到慢时钟域处理中,出现的慢时钟域采集不到快时钟域信号的情况,所以本题只需要简单的将单比特的使能信号进行跨时钟域处理后,再作为多比特跨时钟域处理打拍中的使能信号即可。
2023-07-31 10:43:50
1041
原创 牛客网Verilog刷题——VL47
注意:牛客中很多题目与答案不符,本题要求设计一个格雷码计数器,没有说明具体设计要求。实际上本题的设计要求是:初始化格雷码计数器输出为0值,然后将格雷码转为二进制码,然后二进制码计数器加以后再转为格雷码进行输出,要求格雷码计数器输出两个时钟周期发生一次变化。所以格雷码计数器设计中应该包含三个部分:格雷码转二进制、二进制计数器、二进制转格雷码。实现4bit位宽的格雷码计数器。
2023-07-31 10:01:44
1077
原创 牛客网Verilog刷题——VL46
同步FIFO中,读操作与写操作均在同一时钟域下进行,不涉及跨时钟域操作,所以只需要用一个计数器来计数当前FIFO中存储的实际数据个数(写入数据个数减去读出数据个数),再用于判断产生空满信号即可。根据题目提供的双口RAM代码和接口描述,实现同步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。双口RAM代码如下,可在本题答案中添加并例化此代码。
2023-07-31 08:52:38
1002
原创 牛客网Verilog刷题——VL45
异步FIFO设计中,一般分别设计一个读地址指针与写地址指针,用于判断当前FIFO的空满。由于读操作与写操作不再同一时钟域下,所以需要做跨时钟域处理,而读地址指针与写地址指针是多比特信号,跨时钟域处理一般转为格雷码后再进行跨时钟域传输,这是由于格雷码形式的地址指针每次加1时,只有1比特发生改变,这样就转换为单比特跨时钟域处理的问题,单比特跨时钟域处理可以用打两拍的方式进行处理。请根据题目中给出的双口RAM代码和接口描述,实现异步FIFO,要求FIFO位宽和深度参数化可配置,电路的接口如下图所示。
2023-07-31 08:18:05
820
原创 牛客网Verilog刷题——VL44
如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值。两段式状态机中,现态curr_state与次态next_state均为寄存器类型变量,现态curr_state()用组合逻辑,表示下一个状态;而数据的输出也是使用组合逻辑,这也是和三段式状态机的区别之处。)用时序逻辑,表示当前状态;次态next_state((1)必须使用对应类型的状态机。(2) 使用二段式描述方法。注意rst为低电平复位。
2023-07-31 08:14:18
678
原创 牛客网Verilog刷题——VL43
如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值。三段式状态机中,现态curr_state与次态next_state均为寄存器类型变量,现态curr_state((2) 使用三段式描述方法,输出判断要求要用到对现态的判断;)用时序逻辑,表示当前状态;次态next_state(用时序逻辑,输出一些使用状态机控制的数据等。(1)必须使用对应类型的状态机;)用组合逻辑,表示下一个状态;注意rst为低电平复位。
2023-07-31 08:12:55
602
原创 牛客网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
1148
原创 牛客网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
929
原创 牛客网Verilog刷题——VL39
设计一个自动贩售机,输入货币有两种,为0.5/1元,饮料价格是1.5/2.5元,要求进行找零,找零只会支付0.5元。(1)投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号;(2)此题忽略出饮料后才能切换饮料的问题;注意rst为低电平复位。
2023-07-04 17:02:08
1142
原创 Xilinx原语——IDDR与ODDR的使用(Ultrascale系列)
本文介绍了Xilinx Ultrascale系列器件中IDDR与ODDR的使用方法。IDDR有三种工作模式:OPPOSITE_EDGE(Q1/Q2在不同边沿变化)、SAME_EDGE(Q1/Q2在上升沿变化但相差一个周期)、SAME_EDGE_PIPELINED(Q1/Q2在同一上升沿变化)。ODDR仅支持OPPOSITE_EDGE模式,在上升沿输出D1,下降沿输出D2。文中提供了Verilog原语代码和时序图说明各模式特点,并包含仿真测试代码示例,帮助开发者正确使用这些DDR寄存器实现数据双倍速率传输。
2023-06-06 09:59:14
7276
3
原创 手撕代码——异步FIFO
异步FIFO(Asynchronous First-In First-Out)是一种常见的数据存储器,用于在异步时钟域之间进行数据传输和缓冲。与同步FIFO相比,异步FIFO不依赖于时钟信号的同步,而是使用异步握手信号来管理数据的读写操作。异步FIFO通常由以下几个关键部分组成:读取指针(Read Pointer)、写入指针(Write Pointer)、存储单元(Storage Element)等。
2023-05-21 16:58:25
3373
1
原创 手撕代码——同步FIFO
在FPGA设计中,FIFO(First-In, First-Out)是一种用于数据存储和传输的重要组件。它是一种带有读取和写入指针的存储器,可按照先进先出的顺序存储和检索数据。FPGA中的FIFO通常用于解决数据流处理中的数据缓冲和流量控制问题。它可以暂时存储数据,允许数据在不同的时钟域之间进行传输和同步。FIFO在FPGA设计中广泛应用于许多领域,包括数字信号处理、图像处理、通信协议和数据通路设计等。在本文中,我们自己用Verilog编写了一个简单的同步FIFO。
2023-05-17 10:40:04
2879
原创 牛客网Verilog刷题——VL38
设计一个自动贩售机,输入货币有三种,为0.5/1/2元,饮料价格是1.5元,要求进行找零,找零只会支付0.5元。需要注意的是,投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号,其中rst为低电平复位。
2023-04-26 21:04:53
575
原创 牛客网Verilog刷题——VL36
在题目中,要求使用状态机设计,也可以使用移位寄存器设计,下面我们分别给出了使用状态机进行序列检测与使用移位寄存器进行序列检测的代码。(1)进行重叠检测 即10110111 会被检测通过2次;(2)寄存器输出,在序列检测完成下一拍输出检测有效;注意rst为低电平复位。
2023-04-26 20:51:13
434
原创 牛客网Verilog刷题——VL35
(1)进行非重叠检测 即101110111 只会被检测通过一次;注意rst为低电平复位,信号示意图如下。(2)寄存器输出且同步输出结果;
2023-04-26 16:29:41
468
1
原创 牛客网Verilog刷题——VL34
电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;rst_n是异步复位信号。实现数据位宽转换电路,实现8bit数据输入转换为16bit数据输出。其中,先到的8bit数据应置于输出16bit的高8位。接口时序示意图如下。
2023-04-26 16:23:03
429
原创 牛客网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
510
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅