FPGA学习记录(3)<序列检测器的FPGA实现>

一、FIFO

FIFO(First In First Out),是一种先进先出的数据存储,FIFO的读写数据的方式为顺序读写。

名称特点
同步FIFO读、写在同一个时钟信号下进行;常用作交互数据的一个缓冲
异步FIFO读、写在不同时钟信号下进行;能够实现数据在不同时钟域传递,实现不同数据宽度的数据接口

二、锁存器和触发器之间的区别

名称特点
锁存器(latch)电平敏感的存储器称为锁存器,可以分为高/低电平锁存器
触发器(filp-flop)交叉耦合的门构成双稳态存储原件称为触发器,可以分为上升沿/下降沿触发,前一个锁存器决定了触发器的建立时间,后一个锁存器决定了保持时间

三、FPGA的两种存储器资源:BRAM&DRAM

存储器资源名称特点
BRAM(block ram)由一定数量固定大小的存储块构成,有较大的存储空间;是FPGA中定制的RAM资源;使用BRAM需要时钟信号;BRAM使用的过程中,即使使用的很少,那么一整块的BRAM也不能再供给其他用处使用 ;
DRAM(distributed ram)由FPGA中的查找表中拼凑形成,相对于LUT资源来说比较浪费;属于组合逻辑,不需要时钟信号,给出地址之后就可以输出数据;

因此,再两种内部RAM资源的使用中,我们应该注意一下的问题:
1、BRAM适用于 RAM空间需求量大、且时序要求严格的场景;DRAM适用于RAM空间要求不大、时序要求不高的场景。
2、BRAM必使用时钟信号;DRAM使用一般不适用,但是可以加上寄存器变成时钟RAM。

四、FPGA中对时钟的管理

对时钟进行相位移动或者是变频时,一般不会对于时钟进行逻辑操作(可能会增加时钟信号抖动)。因此,FPGA中一般是使用的是如PLL(锁相环,由鉴相器PD、低通滤波器LPF以及压控振荡器VCO构成)、DLL(Delay Locked Loop,使用的是可变延迟线实现控制时钟信号的延迟量)或者是DCM(数字时钟管理模块、Digital ClockManager,DCM)

五、实现一个序列检测器

1、序列检测器的一般实现方法

FPGA实现:)

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/09/28 14:58:54
// Design Name: 
// Module Name: xulie
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module xulie(
    input in,
    input clk,
    input reset,

    output reg out
    );


    reg r1;
    reg r2;
    reg r3;
    reg r4;
    reg r5;
    reg r6;
    reg r7;
    reg r8;
    reg [7:0]buffer;

    always@(posedge clk or negedge reset) begin
    if (~reset)
    begin
        r1 <= 0;
        r2 <= 0;
        r3 <= 0;
        r4 <= 0;
        r5 <= 0;
        r6 <= 0;
        r7 <= 0;
        r8 <= 0;
    end
    else 
    begin
        r1 <= in;
        r2 <= r1;
        r3 <= r2;
        r4 <= r3;
        r5 <= r4;
        r6 <= r5;
        r7 <= r6;
        r8 <= r7;
    end
    end

    always@(*)begin
    if(~reset)
       buffer = 0;
    else 
    begin
       buffer[0] <= r1;
       buffer[1] <= r2;
       buffer[2] <= r3;
       buffer[3] <= r4;
       buffer[4] <= r5;
       buffer[5] <= r6;
       buffer[6] <= r7;
       buffer[7] <= r8;
    end
    end

    always@(posedge clk or negedge reset) begin
        if(~reset)
            out <= 0;
        else if(buffer == 8'b11001101)
            out <= 1;
        else;
    end
endmodule

仿真文件:)

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/09/28 15:30:37
// Design Name: 
// Module Name: tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


//~ `New testbench

module tb_xulie();

// xulie Parameters
parameter PERIOD  = 10;


// xulie Inputs
reg   in                                   ;
reg   clk                                  ;
reg   reset                                ;

// xulie Outputs
wire  out                                  ;


initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin
    #(PERIOD*2) reset  =  1;
end

initial
begin
    reset = 0;
    clk = 1;
    in = 0;

    #(10*PERIOD)
    #(PERIOD) in <= 1;
    #(PERIOD) in <= 1;
    #(PERIOD) in <= 0;
    #(PERIOD) in <= 0;
    #(PERIOD) in <= 1;
    #(PERIOD) in <= 1;
    #(PERIOD) in <= 0;
    #(PERIOD) in <= 1;
    #(PERIOD) in <= 0;
    #(PERIOD) in <= 0;
    #(PERIOD) in <= 0;

end

xulie  u_xulie (
   .in                      ( in      ),
   .clk                     ( clk     ),
   .reset                   ( reset   ),

   .out                     ( out     )
);


endmodule

仿真结果:)
检测到了11001101序列之后,在下一个clk的上升沿就会产生out变化信号。
在这里插入图片描述

2、序列检测器的状态机实现方法

FPGA实现:)
在这里插入图片描述在这里插入图片描述在这里插入图片描述
仿真文件:)

//~ `New testbench
`timescale  1ns / 1ps

module tb_machine_test2;

// machine_test2 Parameters
parameter PERIOD = 10;
parameter idle  = 0;

// machine_test2 Inputs
reg   clk   = 0 ;
reg   rst   = 0 ;
reg   din   = 0 ;

// machine_test2 Outputs
wire  dout;    


initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin

    #(4*PERIOD)  din = 1;
    #(PERIOD)  din = 1;
    #(PERIOD)  din = 0;
    #(PERIOD)  din = 0;
    #(PERIOD)  din = 1;
    #(PERIOD)  din = 1;
    #(PERIOD)  din = 0;
    #(PERIOD)  din = 1;
    #(PERIOD)  din = 0;

end



initial
begin
    #(PERIOD*2) rst  =  1;
end


machine_test2 #(
    .idle ( idle ))
 u_machine_test2 (
    .clk                     ( clk    ),        
    .rst                     ( rst    ),        
    .din                     ( din    ),        

    .dout                    ( dout   )
);



endmodule

仿真结果:)
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值