目录
一、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
仿真结果:)