1.1 目录
(1)目录
(2)FPGA介绍
(3)Verilog HDL Bits:设计电路实现Thermostat(温度调节器)
(4)原理和代码讲解
1.2 FPGA简介
FPGA是在PAL、GAL、EPLD、CPLD等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
1.3 Gatesv100/Gatesv
在[99:0]中,您将获得一个 100 位输入向量。我们想知道每个位与其邻居之间的一些关系:
out_both:此输出向量的每个位都应指示相应的输入位及其左侧的邻居是否为“1”。例如,out_both[98]应该指示in[98]和in[99]是否都是1。由于in[99]左边没有邻居,答案是显而易见的,所以我们不需要知道out_both[99]。
out_any:此输出向量的每个位都应指示任何相应的输入位及其右侧的邻居是否为“1”。例如,out_any[2]应该指示in[2]或in[1]是否为1。由于 in[0] 右侧没有邻居,答案是显而易见的,所以我们不需要知道out_any[0]。
out_different:此输出矢量的每个位都应指示相应的输入位是否与其左侧的邻居不同。例如,out_different[98]应该指出in[98]是否与in[99]不同。对于这一部分,将向量视为环绕,因此 in[99] 左侧的邻居在in [0]中。
1.4 代码
第一种方法
module top_module(
input [99:0] in,
output [98:0] out_both,
output [99:1] out_any,
output [99:0] out_different );
integer i;
always@(*)
begin
for(i=0;i<99;i=i+1)
begin
out_both[i]=in[i]&in[i+1];
out_any[i+1]=in[i+1]|in[i];
out_different[i]=in[i]^in[i+1];
end
end
assign out_different[99]=in[99]^in[0];
endmodule
第二种方法
module top_module(
input [99:0] in,
output [98:0] out_both,
output [99:1] out_any,
output [99:0] out_different );
assign out_both = in[99:1] & in[98:0];
assign out_any = in[99:1] | in[98:0];
assign out_different = in[99:0] ^ {in[0], in[99:1]};
endmodule