Verilog训练笔记(1)——非重叠序列检测
非重叠序列检测器
1.要求:
(1)检测非重叠的4位1101序列,当检测到一次该序列时o_en信号拉高一个时钟周期,o_cnt信号加一;
(2)o_cnt信号最大值为7
(3)当i_valid拉高时为信号到来的标志
2.TestBench要求:
(1)生成序列11101-101101-1011101
(2)结果可以检测出3个1101非重叠序列
3.模块接口:
module sequencer(
//System Signal
input clk, //系统时钟
input rst_n, //系统复位(低电平)
//Interface====
input i_valid, //信号有效位
input i_data, //信号位
output o_en, //序列检测有效位
output[2:0] o_cnt //序列有效数计数器
);
4.训练意义:
(1)FSM的设计
(2)三段式FSM语法练习
训练总结:
1、if-else语句有先后顺序之分,在此设计中没有需要明确先后顺序的需求,因此能用case写法的都写成case
2、三段式状态机的第二段(状态转移)要写成组合逻辑
3、三段式状态机的第二段case前加入一行state_next = state_cur可以有效避免因为状态转移情况没有列写完全而导致系统综合出锁存器的情况
Verilog Code
// *********************************************************************************
// Project Name : Sequencer
// Email : 277808516@qq.com
// Create Time : 2020/8/21
// File Name : sequencer.v
// Module Name : sequencer
// Abstract : Yang Cheng Yu
// editor : Notepad++
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// 2020/8/21 杨成煜 1.0 Original
//
// *********************************************************************************
//`timescale 1ns/1ns//==================defines=====================
`define SIM
module sequencer(//================System Signal================input clk, //系统时钟input rst_n, //系统复位(低电平)//================Interface====================input i_valid, //信号有效位input i_data, //信号位output o_en, //序列检测有效位output[2:0] o_cnt //序列有效数计数器
);//================parameters===================`ifndef SIM`else`endif//================System regs==================//=====================缓存寄存器列表=====================reg i_valid_reg;reg i_data_reg; //================Main Codes===================//输入信号打一拍always @(posedge clk)begini_data_reg <= i_data;i_valid_reg <= i_valid;end//FSM 定义localparam S_IDLE = 4'b0000;localparam S_D0 = 4'b0001;localparam S_D1 = 4'b0010;localparam S_D2 = 4'b0100;
// localparam S_SES = 4'b1000;reg [3:0] state_cur ;reg [3:0] state_next ;//===========================FSM 第一段=================================always @(posedge clk)beginif(rst_n==1'b0)state_cur <= S_IDLE;elsestate_cur <= state_next;end//===========================FSM 第二段=================================always @(*)beginstate_next = state_cur;case(state_cur)S_IDLE:beginif(i_valid_reg)case(i_data_reg)1'b1:state_next = S_D0;//检测到第一位11'b0:state_next = S_IDLE;//检测到第一位0default:state_next = state_cur;endcase elsestate_next = S_IDLE;//数据没来endS_D0:beginif(i_valid_reg)case(i_data_reg)1'b1:state_next = S_D1;//检测到第二位11'b0:state_next = S_IDLE;//检测到第二位0,非所需序列,重新一次检测default:state_next = state_cur;endcaseelsestate_next = state_cur;endS_D1:beginif(i_valid_reg)case(i_data_reg)1'b1:state_next = S_D1;//检测到第三位1,仍保持状态1'b0:state_next = S_D2;//检测到第三位0,为所需序列default:state_next = state_cur;endcaseelsestate_next = state_cur;endS_D2:beginif(i_valid_reg)case(i_data_reg)1'b1:state_next = S_IDLE;//成功检测到一次序列1'b0:state_next = S_IDLE;//非所需序列,重新一次检测default:state_next = state_cur;endcaseelsestate_next = state_cur;enddefault:state_next = state_cur;endcaseend//===========================FSM 第三段=================================reg o_en_reg;reg [2:0] o_cnt_reg;assign o_cnt = o_cnt_reg;assign o_en = o_en_reg;always @(posedge clk)beginif(rst_n==1'b0)o_en_reg <= 1'b0;else case(state_cur)S_D2:beginif(i_valid_reg&i_data_reg)o_en_reg <= 1'b1;elseo_en_reg <= 1'b0;enddefault:o_en_reg <= 1'b0;endcase endalways @(posedge clk)beginif(rst_n==1'b0)o_cnt_reg <= 3'd0;else if(o_cnt_reg==3'd7)o_cnt_reg <= 3'd7;else case(state_cur)S_D2:beginif(i_valid_reg&i_data_reg)o_cnt_reg <= o_cnt_reg + 1'b1;elseo_cnt_reg <= o_cnt_reg;enddefault:o_cnt_reg <= o_cnt_reg;endcase endendmodule
TestBench Verilog Code
// *********************************************************************************
// Project Name : Sequencer
// Email : 277808516@qq.com
// Create Time : 2020/8/21
// File Name : tb_sequencer.v
// Module Name : tb_sequencer
// Abstract : Yang Cheng Yu
// editor : Notepad++
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// 2020/8/21 杨成煜 1.0 Original
//
// *********************************************************************************`timescale 1ns/1ns //时间精度
`define clock_period 20 //时钟周期
module tb_sequencer; //实体名称//=====================<系统端口>=============================
reg clk;
reg rst_n;//=====================<外设端口>=============================
reg i_valid;
reg i_data;
wire o_en;
wire [2:0] o_cnt;sequencer sequencer_inst(//================System Signal================.clk (clk),.rst_n (rst_n),//================Interface====================.i_valid (i_valid),.i_data (i_data),.o_en (o_en),.o_cnt (o_cnt)
);//=====================<时钟信号>=============================
initial beginclk = 1;forever#(`clock_period/2) clk = ~clk;
end//=====================<复位信号>=============================
initial beginrst_n = 0;#(`clock_period*20+1);rst_n = 1;
end//=====================<激励信号>=============================
initial begini_data = 0;i_valid = 0;#(`clock_period*20+1);//初始化//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================0===================i_valid = 1;i_data = 0;#(`clock_period);i_valid = 0;#(`clock_period);//===================0===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================0===================i_valid = 1;i_data = 0;#(`clock_period);i_valid = 0;#(`clock_period);//===================0===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================0===================i_valid = 1;i_data = 0;#(`clock_period);i_valid = 0;#(`clock_period);//===================0===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================0===================i_valid = 1;i_data = 0;#(`clock_period);i_valid = 0;#(`clock_period);//===================0===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================//===================0===================i_valid = 1;i_data = 0;#(`clock_period);i_valid = 0;#(`clock_period);//===================0===================//===================1===================i_valid = 1;i_data = 1;#(`clock_period);i_valid = 0;#(`clock_period);//===================1===================
end endmodule
ModelSim Wave
Verilog训练笔记(1)——非重叠序列检测相关推荐
- 状态机-重叠序列检测
状态机-重叠序列检测 题目描述 设计一个状态机,用来检测序列 1011,要求: 1.进行重叠检测 即10110111 会被检测通过2次 2.寄存器输出,在序列检测完成下一拍输出检测有效 注意rst为低 ...
- Verilog训练笔记(2)——数据降速增宽
数据降速增宽 1.要求 (1)对一路8bit信号进行1/2倍降速,并将8bit转换为16bit输出. (2)输出信号有效位在完成一次8bit转16bit时拉高,其余时间拉低 (3)不使用FIFO IP ...
- 【Verilog HDL 训练】第 05 天(序列检测)
1. dff和latch有什么区别. 锁存器是一种对脉冲电平(也就是0或者1)敏感的存储单元电路,而触发器是一种对脉冲边沿(即上升沿或者下降沿)敏感的存储电路. "触发器" 泛指一 ...
- 有重叠与无重叠序列之序列检测与序列产生
目录 前言 无重叠序列产生 移位寄存器实现 状态机实现 有重叠序列产生 移位寄存器方式实现 状态机方式实现 博文推荐 前言 序列检测与序列产生是一对对称的设计,就像有微分就有积分一样. 序列检测分为有 ...
- 【机器学习笔记39】时序分析(非平稳序列建模)
[参考资料] [1]应用时序分析 [2]https://blog.csdn.net/u010414589/article/details/49622625 [3]http://www.statsmod ...
- FPGA实现序列检测(训练testbench写法)
电路设计与状态机 FPGA的基础概念 Cyclone IV器件采用了M9K的嵌入式块RAM,即每个嵌入式存储器块的容量为9216bit.4个PLL,一个PLL可以最多支持5路输出. cyclone I ...
- Coursera吴恩达《卷积神经网络》课程笔记(3)-- 目标检测
红色石头的个人网站:redstonewill.com <Convolutional Neural Networks>是Andrw Ng深度学习专项课程中的第四门课.这门课主要介绍卷积神经网 ...
- 可由一个尾指针唯一确定的链表有_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...
目录 缓存引爆链表 链表单链表双向链表循环链表双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存储结构 ...
- 严蔚敏算法约瑟夫环_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...
目录 缓存引爆链表 链表 单链表 双向链表 循环链表 双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存 ...
最新文章
- Homebrew安装(MacOS)
- 海量数据下如何使用多线程的导出 Excel
- windows 2008 开机启动 Docker Toolbox 并运行容器
- Java GUI 开发专题
- 解决思科认证学员与高校网络及信息安全专业实验限制的解决方案
- 微信 html关闭当前页
- 怎么在Linux上抓包分析
- pe中怎么卸载服务器系统更新,方法四: 使用专用工具卸载系统更新补丁(和方法三类同...
- 如何从零创建一个机器人模型
- 30分钟读懂Linux五大模块内核源码,内核整体架构设计
- [初级理论]给老婆做测试培训-02
- 键盘属于计算机主机吗,这是键盘?不,这是一台电脑主机
- wc -m命令在统计字符数的时候为什么总是多一个?
- vue+elementUi在点js.js文件中使用Message消息提示、Notification、MessageBox、succes、import、from
- win10远程桌面连接都有哪些工具
- prim algorithm
- win10可以上网但显示无网络连接
- python商业数据分析_Python数据分析案例—商圈客流量特征分析
- Linux sdk工作的前景,环信Linux SDK测试版简直逆天 高端大气上档次
- 数据恢复顾问(DRA)
热门文章
- 北京天宇联科技有限责任公司-T语言中html页面keys键值的设置
- python:二.Python教程
- Linux下 安装白鹭(egret)引擎指南
- 关于大数据技术的演讲_大数据核心技术介绍:大数据处理技术
- gta5怎么设置画质最好_GTA5:如何让你的游戏画质更好,游戏更顺手,一波设置教给大家!...
- 解决python安装依赖包出现 Microsoft Visual C++ 14.0 or greater is required问题
- 伦敦大学学院计算机科学世界排名,伦敦大学学院世界排名及专业排名汇总(QS世界大学排名版)...
- 2018-2019年世界将会出现一场经济危机,危机过后中国将会崛起!
- 物理学与计算机相关参考文献,中国科学技术大学 计算物理学 教材与参考文献...
- Lynda课程中文字幕 Network Automation Quick Start 网络自动化快速入门