电路设计与状态机

  • FPGA的基础概念
    Cyclone IV器件采用了M9K的嵌入式块RAM,即每个嵌入式存储器块的容量为9216bit。4个PLL,一个PLL可以最多支持5路输出。
    cyclone IV E中,除了EP4CE6和EP4CE10两个容量等级的器件只含有两个PLL单元以外,其它容量的器件均含有4个PLL。
    M9K存储器,见名思意,该存储器每个M9K,存储容量是9Kbit,
    这些存储器可以配置为FIFO,RAM等
    18*18硬件乘法器,这些硬件乘法器的输入位宽都是18位。

  • 序列检测
    功能:实现检测序列:Welcom

    为什么这些资源为0呢,因为我们的输出,还没有被赋予值,这时候资源就是0.

好,下面我们来正式看如何检测序列;

module Sequence_detection
(
input clk,
input rst_n,
input data_valid,//信号输入有效标志信号
input [7:0]data,
output [3:0]num,//计数检测到多少个序列
output reg flag//检测完毕标志信号
);reg [2:0] state=3'b0;
reg [3:0] counter=4'b0;
localparam CHECK_W=3'd0;
localparam CHECK_E=3'd1;
localparam CHECK_L=3'd2;
localparam CHECK_C=3'd3;
localparam CHECK_O=3'd4;
localparam CHECK_M=3'd5;always @(posedge clk or negedge rst_n)
beginif(!rst_n)beginstate<=CHECK_W;counter<=4'b0;flag<=1'b0;endelse if(data_valid)begincase(state)CHECK_W://检测Wbeginif(data=="w")beginstate<=CHECK_E;flag<=0;endelsebeginstate<=CHECK_W;flag<=0;endendCHECK_E://检测ebeginif(data=="e")state<=CHECK_L;else if(data=="w")state<=CHECK_E;elsestate<=CHECK_W;endCHECK_L://检测lbeginif(data=="l")state<=CHECK_C  ;   else if(data=="w")state<=CHECK_E;elsestate<=CHECK_W;endCHECK_C://检测cbeginif(data=="c")state<=CHECK_O;else if(data=="w")state<=CHECK_E;elsestate<=CHECK_W;endCHECK_O://检测obeginif(data=="o")state<=CHECK_M;else if(data=="w")state<=CHECK_E;elsestate<=CHECK_W;endCHECK_M://检测mbeginif(data=="m")begincounter<=counter+1;flag<=1'b1;state<=CHECK_W;endelse if(data=="w")state<=CHECK_E;elsestate<=CHECK_W;enddefault:  state<=CHECK_W;endcaseendelse beginstate<=CHECK_W;endend
assign num=counter;
endmodule

测试文件testbench:


`timescale 1 ns/ 1 ns
`define clk_period 20
module Sequence_detection_vlg_tst();
reg clk;
wire [7:0] data;
reg data_valid;
reg [511:0] reg_shift;
reg rst_n;
// wires
wire flag;
wire [3:0]num;// assign statements (if any)
Sequence_detection i1 (.clk(clk),.data(data),.data_valid(data_valid),.flag(flag),.num(num),.rst_n(rst_n)
);
initial
begin
clk=1;
end
always #(`clk_period/2)  clk=~clk;       wire [511:0] data_to_send ;
assign data_to_send="whwecomdwhusardwhuwelcomwhusdardwwelcomdwhusdardwhusdardwhusdard";always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
reg_shift<=512'd0;
else if (data_valid)
reg_shift<=reg_shift<<8;
elsereg_shift<=data_to_send;
endassign data=(data_valid==1)?reg_shift[511:504]:8'bz;initial
begin
rst_n=0;
data_valid=0;
#(`clk_period*20);
rst_n=1;
#(`clk_period*20);
data_valid=1;
#(`clk_period*64);
data_valid=0;
#(`clk_period*10);
$stop;
end
endmodule


  1. 解说部分
  2. 设计实例部分

首先,代码不用解释了,入了门的,都看得懂,下面说说一些注意的地方:
3. 快捷键的使用:ctrl+F查找
ctrl+H替换
4. 报告没有消耗逻辑资源,说明输出端口没有被赋予值。
5.
状态机每一个都返回W状态和E状态,为什么会返回E状态呢?
因为,比如WELWELCOM,如果在L状态了,发现下一个状态是W,不是我们要的C,于是,下个时钟,跳转到W状态,但此时,在W状态,就会检测是否此状态是否是E,发现不符合,就会出现漏检,因为出现一个跳转时钟,耽误了,所以导致出现漏检。(因为我们送来检测的时序是,一个时钟,检测一次)
所以,我们在每个状态,我们还要检测一下是否此字母是W,如果是W,就跳转到E,避免出现漏检。

  1. 状态机跳转条件


    我们可以看到L跳转到E的状态是1110111==h77
    我们查一下ASCII ,正是我们小写的w

另外字也可以赋予到寄存器中,这也是我以前不太知道的,我以为只有数能赋予到寄存器中,字符根据ASCII码表。

我们对其是打双引号。data定义为8个位。

  1. Testbench写法
    宏定义
    在module外定义宏 `define a 8 //无等号无分号

    使用时 (1) b<=`a +3; //用`a,不是a(2) `define b (`a+3)  //用`a,不是a
    

此处我们宏定义时钟周期20ns
`define clk_period 20
我们在tb里面写的clk_period都写的是‘clk_period

输入都是reg???!!

对于我们这个也不是输入就是定死的reg类型,这也是一般初学者的误区。
其实我们写TB就是给输入写值,把它当成寄存器来写,所以我们都是把实例中的input,在TB里面写成reg,这样我们就能对其赋值。
但是,如果我们在TB里面,自己定义个别的寄存器,然后,assign到如上图所示的data,我们就不需要非得把data变成reg

initial的写法


其他就按照always@(posedge or negedge)来写即可

wire也可赋予初值

modisim遇见no design不要怕

选中simulate就可以查看到TB的语法错误了。
另外最后提醒一点,更改了顶层文件的输入输出端口过后,一定要记得更改TB的输入输出端口。

FPGA实现序列检测(训练testbench写法)相关推荐

  1. Verilog训练笔记(1)——非重叠序列检测

    非重叠序列检测器 1.要求: (1)检测非重叠的4位1101序列,当检测到一次该序列时o_en信号拉高一个时钟周期,o_cnt信号加一: (2)o_cnt信号最大值为7 (3)当i_valid拉高时为 ...

  2. 【Verilog HDL 训练】第 05 天(序列检测)

    1. dff和latch有什么区别. 锁存器是一种对脉冲电平(也就是0或者1)敏感的存储单元电路,而触发器是一种对脉冲边沿(即上升沿或者下降沿)敏感的存储电路. "触发器" 泛指一 ...

  3. 三段式状态机_FPGA笔试题——序列检测(FSM状态机)

    FSM有限状态机,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见. (1)了解状态机:什么是摩尔型状态机,什么是米利型状态机,两者的区别是什么?一段式.二段式.三段式状态机的 ...

  4. 有重叠与无重叠序列之序列检测与序列产生

    目录 前言 无重叠序列产生 移位寄存器实现 状态机实现 有重叠序列产生 移位寄存器方式实现 状态机方式实现 博文推荐 前言 序列检测与序列产生是一对对称的设计,就像有微分就有积分一样. 序列检测分为有 ...

  5. 基于FPGA的边沿检测

    一.定义 边沿检测,即信号上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲. 使用高频的时钟对信号进行采样,时钟频率至少要在信号最高频率的2倍以上. 二.原理 data_i tri_ ...

  6. 序列检测(FSM状态机)

    序列产生和检测(FSM状态机) 提示:FSM有限状态机,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见. 文章目录 序列产生和检测(FSM状态机) 前言 一.状态机基本概念 ...

  7. FPGA实现边沿检测电路(上升沿、下降沿)

    1.什么是边沿检测 边沿检测用于检测信号的上升沿或下降沿,通常用于使能信号的捕捉等场景. 2.采用1级触发器的边沿检测电路设计(以下降沿为例) 2.1.设计方法 设计波形图如下所示: 各信号说明如下: ...

  8. NeurIPS 2021 | 寻MixTraining: 一种全新的物体检测训练范式

    来源:专知 本文附论文,建议阅读5分钟物体检测是计算机视觉中的基础课题. MixTraining: 一种全新的物体检测训练范式 论文链接: https://www.zhuanzhi.ai/paper/ ...

  9. HDLBits 系列(32)Sequence recognition(序列检测)

    目录 原题复现 审题 状态转移图 我的设计 原题复现 原题复现: Synchronous HDLC framing involves decoding a continuous bit stream ...

最新文章

  1. kosaraju算法
  2. [置顶]       安全-用户身份验证
  3. 获取汉字的首字母(转)
  4. HALCON No finder pattern could be found错误解决
  5. Linux 系统启动流程及其介绍
  6. 学习Windows Phone手机开发:Tile的使用
  7. hibernate入门
  8. 国内最大最全的交换技术专区上线
  9. Symbian手记【三】 —— Symbian的描述符
  10. Ubuntu环境搭建零:安装Linux虚拟机
  11. 计算机毕业设计中用python神经网络编程实现手写数字识别
  12. exchange 2010高可用平台的搭建和配置
  13. 华为那些手机有鸿蒙系统,华为鸿蒙系统支持哪些手机 鸿蒙系统支持哪些手机型号...
  14. 中国十大调查研究报告排名数据
  15. 第三课 排序算法LowB三人组
  16. 前端实践小项目(一)五星好评与暂停取值
  17. 关于加快INSERT语句执行速度和 HINT /*+ append*/及nologging的使用
  18. Linux 下如何压缩/解压缩文件
  19. 超级推荐:网工必备模拟器PNETLab,附下载链接,全球第一篇最优质的帖子
  20. 人生的财富不只限于金钱

热门文章

  1. 【代码笔记】iOS-评分,支持我们
  2. insertion Sort List (链表的插入排序) leecode java
  3. Excel操作:导出到Excel并下载到web客户端
  4. Windows 7 SP1确实将有性能改进
  5. 选择排序和Java实现、C++ vector 模板类实现
  6. 【敏捷个人俱乐部-北京】及【免费敏捷结果线下练习】报名帖
  7. Day16 os模块、time模块、random模、math模块
  8. 在cmd中使用python使用pip报错invalid syntax
  9. 使用UML描述需求都实现的过程
  10. Oracle 行转列