关于FPGA

179 阅读3分钟

FPGA与CPLD的区别?

FPGA和CPLD都属于高密度可编程逻辑器件。

FPGA 以查找表 结构方式构成逻辑行为, 适合完成时序逻辑,即适用于实现触发器丰富的逻辑电路。 程序存储: FPGA大部分基于SRAM编程,系统断电后编程信息丢失,需要外挂EEPROM来存储配置信息,每次上电后,将配置信息重新写入SRAM。

CPLD 以乘积项 结构方式构成逻辑行为, 适合完成各种算法和组合逻辑,即适用于触发器有限而乘积项丰富的逻辑电路。程序存储:内部EEPROM或者FLASH存储器编程。

CPLD比FPGA速度快,保密性好。

FPGA比CPLD集成度高,功耗低,编程灵活性大。

CPLD是逻辑块级编程,通过修改固定内连电路的逻辑功能来编程,而FPGA是门级编程,主要通过改变内部连线来编程。FPGA比CPLD灵活。

下图可参考 但CPLD比FPGA速度快。保密性好。 集成度低。 image.png

锁存器latch和触发器flip-flop的区别?

锁存器:对脉冲电平敏感,在时钟脉冲的电平作用下改变状态。

锁存器是电平触发的存储单元,数据的存储取决于输入时钟信号的电平值,当锁存器处于使能状态,数据才会随着数据输入而变化。两个输入信号,一个有效使能信号,一个输入数据信号。在使能信号有效时,将D的值给Q。

触发器:

触发器对脉冲边沿敏感,其状态只在时钟脉冲的上升沿或下降沿的瞬间变化。

触发器一直保持它们的状态,直到它们收到输入脉冲,当收到输入脉冲时,触发器输出,然后保持这个状态直到收到下一个触发。

寄存器: 用来存放数据的一些小型存储区域。因为一个锁存器或触发器能存储一位二进制数,所以N个锁存器或者触发器可以构成N位寄存器。

寄存器可以完成数据的串并转换,串并转换。

串转并: 移位寄存器。。移位的方式为: 位拼接+计数

采用位拼接技术,移位寄存器,将串行的数据数据先表示出来,然后发送一位数据加1。一般八位数据,每次取低7七位为最高位,新数据为最低位。 (低位先赋值) 然后利用计数器计数,美国一个时钟数据给低一位,8个时钟后,得到并行的八位数据。

timescale 1 ns/ 1 ns
 
module serial2parallel(
	input clk,
	input rst_n,
	input en,
	input data_i,
	output reg [7:0] data_o
);
 
reg [7:0] data;//输出寄存器
reg [2:0] count;//计数器,控制并行数据更新,8位数据
 
//初始化
always@(posedge clk or negedge rst_n)
	begin
		if(rst_n==1'b0)
			count<=3'b0;
		else if(en==1)
			count<=count+3'b1;
	end
 
//移位	
always@(posedge clk or negedge rst_n)
	begin
		if(rst_n==1'b0)
			data<=8'b0;
		else if(en==1'b1)
			data<={data[6:0],data_i};
	end
 
//数据输出
always@(posedge clk or negedge rst_n)
	begin
		if(rst_n==1'b0)
			data_o<=8'b0;
		else if(rst_n==1'b1&&en==1'b1&&count==3'b111)
			data_o<=data;
	end
endmodule
并转串:通过移位寄存器,八位数据,用八位寄存器寄存。

通过<<1,左移操作。每次取最高位数据,第一次赋值数据,通过取最高位。

 
module parallel2serial(
	input clk,
	input rst_n,
	input en,
	input [7:0] data_i,
	output data_o
);
 
reg [7:0] data_buf;
 
always@(posedge clk or negedge rst_n)
begin
	if(rst_n==0)
		data_buf<=0;
	else if(en==1'b1)
		data_buf<=data_i;
	else
		data_buf<=data_buf<<1;
end
 
assign data_o=data_buf[7];
 
endmodule