FPGA基础知识(一):FPGA的并行世界always/assign

《FPGA基础知识》系列导航

         本专栏专为FPGA新手打造的Xilinx平台入门指南。旨在手把手带你走通从代码、仿真、约束到生成比特流并烧录的全过程。

       本篇是该系列的第一篇内容

       下一篇:FPGA基础知识(二):深入理解时钟与复位
————————————————

一 引言       

       在数字电路设计领域,FPGA(现场可编程门阵列)之所以能够实现惊人的性能突破,其核心奥秘就在于并行执行模式。这种模式彻底颠覆了传统处理器的顺序执行思维,为高性能计算打开了全新的大门。

二 顺序执行 vs 并行执行:根本性的思维转变

传统处理器(如CPU、MCU)的顺序执行模式:

  • 指令逐条执行,形成指令流水线

  • 共享计算资源(ALU、寄存器等)

  • 依赖程序计数器控制执行流程

  • 性能受限于时钟频率和指令级并行

FPGA的并行执行模式:

  • 所有逻辑单元同时工作

  • 每个功能都有专属的硬件资源

  • 数据流驱动,无集中控制

  • 性能与资源规模正相关

三  硬件描述语言中的并行性体现

在Verilog或VHDL中,这种并行性通过几种基本结构得以实现:

// 示例1:多个always块的并行执行
module parallel_example(
    input clk,
    input [7:0] data_in,
    output reg [7:0] result1,
    output reg [7:0] result2,
    output reg [7:0] result3
);

// 三个always块并行执行
always @(posedge clk) begin
    result1 <= data_in + 1;  // 流水线A:数据加1
end

always @(posedge clk) begin
    result2 <= data_in * 2;  // 流水线B:数据乘2
end

always @(posedge clk) begin
    result3 <= ~data_in;     // 流水线C:数据取反
end

endmodule

在这个例子中,三个处理操作在同一个时钟周期内同时完成,彼此之间没有任何依赖或等待。

四  并行架构的实际应用优势

1. 数据流处理的高效性

在图像处理、信号处理等应用中,FPGA可以构建真正的流水线架构:

// 图像处理流水线示例
module image_pipeline(
    input clk,
    input [23:0] pixel_in,
    output [23:0] pixel_out
);

reg [23:0] stage1, stage2, stage3;

// 三级处理流水线
always @(posedge clk) begin
    // 第一级:颜色空间转换
    stage1 <= rgb_to_grayscale(pixel_in);
    
    // 第二级:高斯滤波
    stage2 <= gaussian_filter(stage1);
    
    // 第三级:边缘检测
    stage3 <= edge_detect(stage2);
end

assign pixel_out = stage3;

endmodule

每个像素在每个时钟周期都会流经整个处理链,实现极高的吞吐量。

2. 多通道并行处理

FPGA可以轻松实现多个相同处理单元的并行工作:

// 8通道并行FIR滤波器
module multi_channel_fir(
    input clk,
    input [7:0][15:0] channels_in,
    output [7:0][15:0] channels_out
);

genvar i;
generate
    for (i = 0; i < 8; i = i + 1) begin : channel_gen
        fir_filter #(.COEFFS('{1,2,3,2,1})) 
        fir_inst (
            .clk(clk),
            .data_in(channels_in[i]),
            .data_out(channels_out[i])
        );
    end
endgenerate

endmodule

五 并行设计的挑战与考量

1. 资源权衡

  • 更多并行单元 → 更高性能

  • 更多并行单元 → 更大资源消耗

  • 需要在性能与资源间找到平衡点

2. 时序收敛

  • 并行路径必须满足时序约束

  • 关键路径决定最大工作频率

  • 需要合理的流水线设计

3. 数据同步

  • 并行单元间的数据交换需要同步机制

  • 跨时钟域处理需要特殊设计

  • 避免竞争条件和数据冲突

六  实际应用场景分析

案例:实时视频处理系统

  • 1080p@60fps视频流:每帧约200万像素

  • 处理要求:色彩转换、降噪、锐化、目标识别

  • FPGA方案:四级流水线 + 四个并行处理引擎

  • 性能结果:处理延迟 < 1ms,完全实时

相比之下,同等成本的CPU方案难以满足实时性要求。

七  最佳实践指南

  1. 模块化设计:将系统分解为独立的并行单元

  2. 合理流水:通过流水线提高时序性能

  3. 资源复用:在资源紧张时适时复用硬件

  4. 接口标准化:使用标准接口(如AXI-Stream)连接模块

总结

FPGA的并行执行模式不仅是技术特性,更是一种设计哲学的革新。它让工程师能够:

  • 用空间换时间,突破频率瓶颈

  • 为特定应用定制最优架构

  • 在功耗、性能、成本间找到最佳平衡

       掌握并行设计思维,是释放FPGA真正潜力的关键。随着人工智能、5G通信、自动驾驶等领域的快速发展,这种能够提供确定性和高效率的并行处理能力,正变得越来越重要。

这个verilog出现h_cnt 直是0为什么 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2025/03/10 11:13:14 // Design Name: // Module Name: ax630_fpga // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module ax630_fpga( output SDI_TX_PCLK, output [19:0] SDI_TX_DAT, output SDI_TX_RATE_SEL0, output SDI_TX_RATE_SEL1, output SDI_TX_EN, output SDI_TX_XRST, output wire LED0, output wire LED1, input wire SDI_IN_27M_PCLK, input wire SDI_IN_BT1120_PCLK, input wire [18:0] SDI_IN_BT1120_DATA ); assign SDI_TX_XRST = 1'b1 ; assign SDI_TX_EN = 1'b1 ; assign SDI_TX_RATE_SEL0 = 1'b0 ; assign SDI_TX_RATE_SEL1 = 1'b0 ; wire SDI_IN_BT1120_PCLK_CLK; reg [18:0] bt1120_data; IBUFG #( .IBUF_LOW_PWR("TRUE"), // Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards .IOSTANDARD("LVCMOS33") // Specify the input I/O standard ) IBUFG_inst ( .O(SDI_IN_BT1120_PCLK_CLK), // Clock buffer output .I(SDI_IN_BT1120_PCLK) // Clock buffer input (connect directly to top-level port) ); reg [15:0] h_cnt; always@(posedge SDI_IN_BT1120_PCLK_CLK )begin bt1120_data = SDI_IN_BT1120_DATA[18:0]; end always@(posedge SDI_IN_BT1120_PCLK_CLK )begin if( bt1120_data[16] =='d1) h_cnt <='d0; else h_cnt <= h_cnt; end always@(posedge SDI_IN_BT1120_PCLK_CLK )begin if(( bt1120_data[17] == 'd1)&&( bt1120_data[16] == 'd0))begin h_cnt <= h_cnt + 'd1; end end reg led0_reg; reg led1_reg; assign LED0 = led0_reg; assign LED1 = led1_reg; always@(posedge SDI_IN_BT1120_PCLK_CLK )begin if(h_cnt =='d1120 )begin led0_reg<='d1; end else begin led0_reg<='d0; end if(bt1120_data =='h7fff )begin led1_reg<='d1; end else begin led1_reg<='d0; end end assign SDI_TX_PCLK = SDI_IN_BT1120_PCLK_CLK; assign SDI_TX_DAT = {bt1120_data[7:0],2'b0,bt1120_data[15:8],2'b0}; ila_0 ila_0_INST( .clk(SDI_IN_BT1120_PCLK_CLK), .probe0(bt1120_data[7:0]), .probe1(bt1120_data[15:8]), .probe2(bt1120_data[16]), .probe3(bt1120_data[17]), .probe4(bt1120_data[18]) ); ila_1 ila_1_INST( .clk(SDI_IN_BT1120_PCLK_CLK), .probe0(h_cnt[15:0]) ); endmodule
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA_小田老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值