FPGA设计中,使用硬件描述语言(HDL)如Verilog和VHDL来描述电路和逻辑。以下是Verilog和VHDL的基本语法和一些示例代码。
Verilog 基本语法
1. 模块定义
verilog
复制代码
module my_module (
input wire clk, // 输入信号
input wire rst_n, // 复位信号(低电平有效)
input wire [7:0] a, // 8位输入信号
output reg [7:0] b // 8位输出信号
);
// 在此处编写逻辑
endmodule
2. 寄存器和线网(reg 和 wire)
wire:表示组合逻辑信号。
reg:表示时序逻辑信号(寄存器)。
verilog
复制代码
wire my_wire;
reg my_reg;
3. 赋值语句
连续赋值(assign):用于组合逻辑信号。
过程赋值:用于时序逻辑信号,在always块中使用。
verilog
复制代码
assign my_wire = a & b; // 组合逻辑赋值
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
my_reg <= 0; // 异步复位
else
my_reg <= a + b; // 时序逻辑赋值
end
4. 条件语句
if-else 语句:用于条件判断。
case 语句:用于多路选择。
verilog
复制代码
always @(posedge clk) begin
if (a == 8'hFF)
b <= 8'h00;
else
b <= a + 1;
end
always @(posedge clk) begin
case (a)
8'h00: b <= 8'h01;
8'h01: b <= 8'h02;
default: b <= 8'hFF;
endcase
end
5. 循环语句
for 语句:用于循环操作。
verilog
复制代码
integer i;
always @(posedge clk) begin
for (i = 0; i < 8; i = i + 1) begin
b[i] <= a[i];
end
end
VHDL 基本语法
1. 实体(Entity)定义
vhdl
复制代码
entity my_entity is
port (
clk : in std_logic;
rst_n : in std_logic;
a : in std_logic_vector(7 downto 0);
b : out std_logic_vector(7 downto 0)
);
end my_entity;
2. 架构(Architecture)定义
vhdl
复制代码
architecture Behavioral of my_entity is
signal my_signal : std_logic_vector(7 downto 0);
begin
-- 在此处编写逻辑
end Behavioral;
3. 信号和变量
signal:表示组合逻辑信号。
variable:表示过程中的临时变量。
vhdl
复制代码
signal my_signal : std_logic;
variable my_variable : integer;
4. 赋值语句
信号赋值:用于组合逻辑信号。
变量赋值:用于过程中的临时变量。
vhdl
复制代码
my_signal <= a and b; -- 组合逻辑赋值
process(clk, rst_n)
begin
if rst_n = '0' then
my_signal <= (others => '0'); -- 异步复位
elsif rising_edge(clk) then
my_signal <= a + b; -- 时序逻辑赋值
end if;
end process;
5. 条件语句
if-else 语句:用于条件判断。
case 语句:用于多路选择。
vhdl
复制代码
process(clk)
begin
if rising_edge(clk) then
if a = "11111111" then
b <= (others => '0');
else
b <= a + 1;
end if;
end if;
end process;
process(a)
begin
case a is
when "00000000" => b <= "00000001";
when "00000001" => b <= "00000010";
when others => b <= "11111111";
end case;
end process;
6. 循环语句
for 语句:用于循环操作。
vhdl
复制代码
process(clk)
begin
if rising_edge(clk) then
for i in 0 to 7 loop
b(i) <= a(i);
end loop;
end if;
end process;
示例:简单的计数器
Verilog 实现
verilog
复制代码
module counter (
input wire clk,
input wire rst_n,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 4'b0000;
else
count <= count + 1;
end
endmodule
VHDL 实现
vhdl
复制代码
entity counter is
port (
clk : in std_logic;
rst_n : in std_logic;
count : out std_logic_vector(3 downto 0)
);
end counter;
architecture Behavioral of counter is
signal cnt : std_logic_vector(3 downto 0);
begin
process(clk, rst_n)
begin
if rst_n = '0' then
cnt <= "0000";
elsif rising_edge(clk) then
cnt <= cnt + 1;
end if;
end process;
count <= cnt;
end Behavioral;
总结
Verilog和VHDL是FPGA设计中广泛使用的硬件描述语言,了解其基本语法和结构对于成功设计和实现数字系统至关重要。本文介绍了Verilog和VHDL的基本语法,包括模块定义、信号和变量、赋值语句、条件语句和循环语句,并通过示例代码展示了如何使用这些语法构建基本的数字电路。通过实践和不断学习,可以掌握更复杂的FPGA设计技术。