0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何实现一套FPGA工程无缝兼容两款管脚不同的板卡?

电子电路开发学习 来源:电子电路开发学习 2023-11-08 14:21 次阅读

试想这样一种场景,有两款不同的FPGA板卡,它们的功能代码90%都是一样的,但是两个板卡的管脚分配完全不同,一般情况下,我们需要设计两个工程,两套代码,之后还需要一直维护两个版本。 那么有没有一种自动化的方式,实现一个工程,编译出一个程序文件,下载到这两个不同的板卡上,都可以正常运行呢?

本文以开发板A和开发板B为例,介绍如何实现一套FPGA工程无缝兼容两款管脚不同的板卡?

两款开发板的时钟信号分别为clk_a和clk_b,分别位于两个不同的芯片管脚,两个开发板的FPGA型号完全一致,外部时钟的频率也一样。

首先需要判断当前是哪款板卡?实现方式是通过两个计数器,分别对时钟信号进行计数,由于两款板子的时钟信号分别位于不同的管脚,所以只有一个计数器会累加,并达到目标值,这样就实现了板卡型号的自动区分。

具体代码如下:

/*********************************************************************
* Copyright © blog.csdn.net/whik1194
* ModuleName : board_sel.v
* CreateTim : 2023年11月5日 19:16:48
* Author : mcu149
* Function : function
* Version : v1.0
* Version | Modify
* ----------------------------------
* v1.0 | first version
*********************************************************************/

module board_sel(
//Inputs
input clk_a, //100MHz
input clk_b, //100MHz

//Outputs
output reg [1:0] sel = 2'd0,
output reg rst_n = 1'b0
);

//1.parameter
// parameter LATCH_TIME = 10_000_000 / 10; //10ms
// parameter RESET_TIME = 100_000_000 / 10; //100ms
// for simulation
parameter LATCH_TIME = 5_000 / 10; //simulation, 5 us
parameter RESET_TIME = 10_000 / 10; //simulation, 10 us

//2.localparam
localparam BOARD_A = 2'd1;
localparam BOARD_B = 2'd2;

//3.reg
reg [31:0] cnt_a = 0;
reg [31:0] cnt_b = 0;

//4.wire

//5.assign

//6.always
always @ (posedge clk_a) begin
if(cnt_a < LATCH_TIME + RESET_TIME)
cnt_a <= cnt_a + 1;
end

always @ (posedge clk_b) begin
if(cnt_b < LATCH_TIME + RESET_TIME)
cnt_b <= cnt_b + 1;
end

always @ (*) begin
if(cnt_a == LATCH_TIME)
sel <= BOARD_A;
else if(cnt_b == LATCH_TIME)
sel <= BOARD_B;
end

always @ (*) begin
if((cnt_a == LATCH_TIME + RESET_TIME) || (cnt_b == LATCH_TIME + RESET_TIME))
rst_n <= 1;
end

//7.instance

endmodule //board_sel end

这里的代码,使用了寄存器定义时赋初值0的一个小技巧,一般工程不建议这么使用。

板卡区分之后,再根据区分的结果即sel的值对输出、输入分别进行选择。

具体实现如下:

/*********************************************************************
* Copyright © blog.csdn.net/whik1194
* ModuleName : board_sel.v
* CreateTim : 2023年11月5日 19:40:48
* Author : mcu149
* Function : function
* Version : v1.0
* Version | Modify
* ----------------------------------
* v1.0 | first version
*********************************************************************/

module board_dock(
//Inputs
input [1:0] sel,

input clk_a,
input clk_b,
input uart_txd,
input led1,

//Outputs
output clk,
output uart_txd_a,
output uart_txd_b,
output led1_a,
output led1_b
);

//1.parameter

//2.localparam
localparam BOARD_A = 2'd1;
localparam BOARD_B = 2'd2;
localparam DEFAULT_OUT_VALUE = 1'b1;

//3.reg

//4.wire

//5.assign
assign clk = (sel == 2'd0 ) ? DEFAULT_OUT_VALUE : ((sel == BOARD_B) ? clk_b : clk_a );
assign uart_txd_a = (sel == BOARD_A) ? uart_txd : DEFAULT_OUT_VALUE;
assign uart_txd_b = (sel == BOARD_B) ? uart_txd : DEFAULT_OUT_VALUE;
assign led1_a = (sel == BOARD_A) ? led1 : DEFAULT_OUT_VALUE;
assign led1_b = (sel == BOARD_B) ? led1 : DEFAULT_OUT_VALUE;

//6.always

//7.instance

endmodule //board_dock end

仿真文件:

`timescale 1ns/1ps

`define BRD_A
// `define BRD_B

module top_tb;

localparam PERIOD = 10; //10ns
localparam BOARD_A = 2'd1;
localparam BOARD_B = 2'd2;

reg clk_a;
reg clk_b;
reg uart_txd;
reg led1;

wire [1:0] sel;
wire rst_n;

`ifdef BRD_A
always #(PERIOD/2) clk_a <= !clk_a;
`endif

`ifdef BRD_B
always #(PERIOD/2) clk_b <= !clk_b;
`endif

initial begin
$display("testbench: %s", "top_tb");

clk_a = 0;
clk_b = 0;
uart_txd = 0;
led1 = 0;

end

always #(500_000) uart_txd <= !uart_txd;
always #(200_000) led1 <= !led1;

board_sel board_sel_ut0(
//Inputs
.clk_a(clk_a), //100MHz
.clk_b(clk_b), //100MHz

//Outputs
.sel(sel),
.rst_n(rst_n)
);

board_dock board_dock_ut0(
//Inputs
.sel(sel),
.clk_a(clk_a),
.clk_b(clk_b),
.uart_txd(uart_txd),
.led1(led1),

//Outputs
.clk(clk),
.uart_txd_a(uart_txd_a),
.uart_txd_b(uart_txd_b),
.led1_a(led1_a),
.led1_b(led1_b)
);

endmodule //top_tb end

总结

本文所提出的方式,可以在某些应用场景对板卡实现一定的兼容性,比如用来固件在线升级所使用的Golden镜像工程,不同的板子共用此工程,以后只需要维护一套代码即可。

wKgaomVLKRCAXg9WAAMNdQ90RoE468.jpg

当然这种方式也有一定的局限性,比如需要两款板卡的FPGA芯片型号一致、晶振频率一致,比如同样为XC7K325T,外部输入单端50M时钟。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117746
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    82997
  • FPGA芯片
    +关注

    关注

    3

    文章

    241

    浏览量

    39555

原文标题:如何做到一套FPGA工程无缝兼容两款不同的板卡?

文章出处:【微信号:mcu149,微信公众号:电子电路开发学习】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    两款消回音,消噪音的芯片

    两款是消回音,消噪音的芯片资料。大家可以看下。起探讨下。
    发表于 09-16 10:22

    两款u***功放制作

    两款u***功放制作
    发表于 08-20 14:50

    一套已经实现过的NE5532+LM3886 PCB功放

    一套师兄从网上看到的电路图,然后自己做成PCB板,他是个音响发烧友,他很喜欢自己设计不同的PCB图,然后把音响做出来放歌,这一套可以实现大功率音箱使用
    发表于 10-23 11:49

    FPGA板卡如何与非FPGA板卡同步

    我有块IN的FPGA板卡PXI-7854R和非FPGA板卡PXI-6733,请教各位大神,数据输出和采集时如何将这
    发表于 12-06 20:47

    刚拆的帮我看看这两款电机的型号!!!!!!

    帮我看看这两款电机能做什么
    发表于 01-08 01:42

    一套FPGA俄罗斯方块的代码

    `一套FPGA俄罗斯方块的代码`
    发表于 06-21 14:59

    如何用labview通过调用dll的方式控制板卡

    现在我公司有原有的在VC环境下的429板卡控制的一套软件,包括基于wdm的驱动和mfc上层应用。现在由于业务需求,需要在labview环境下开发一套软件,实现429
    发表于 06-29 15:04

    Type-C与USB母座两款母座焊盘放在实现

    Type-C母座焊盘 USB母座焊盘Type-C母座、USB母座两款母座用于充电器上,若现在共用块PCB,Type-C与USB母座焊盘位置如下图请教各位高手两款母座焊盘放在齐,可否
    发表于 06-21 20:18

    请问F28335和F28232这两款芯片的引脚及其引脚上的电气新能是否完全兼容?是否可直接替换?

    本帖最后由 只耳朵怪 于 2018-6-14 11:40 编辑 TI工程师,有个项目想直接从F28232升级到F28335,这两款芯片的引脚及其引脚上的电气新能是否完全兼容?是
    发表于 06-14 09:04

    Exar两款多路输出同步降压型的可编程电源模块

    模块与可编程双控制器结合起来,对于要求更多电压轨和更高电流的FPGAs 和SOCs的系统中都能实现高达30Amps输出。  值得提的是,Exar的XRP9710和XRP9711两款
    发表于 09-28 16:16

    吉时利仪器两款2290系列优化的高压电源

      导读:日前,吉时利仪器(以下简称“吉时利”)宣布推出了两款2290系列优化的高压电源,该全新的2290系列高压电源具有低电压的模拟输出,可实现对高电压和输出电流的安全监控。  吉时利作为先进电气
    发表于 11-30 16:35

    如何采用LabVIEW软件平台构建一套某装备存储器的检测系统?

    采用NI系列PXI板卡及灵活方便的LabVIEW软件平台,构建了一套某装备存储器的检测系统。
    发表于 05-12 06:53

    介绍一套支持语音交互的车载导航系统

    本文在课题组的车载导航系统和国内两款语音引擎的基础上,开发了一套支持语音交互的车载导航系统。
    发表于 05-14 06:28

    在rockchip平台怎样去实现一套兼容多款wifi模块的自适应框架呢

    在rockchip平台怎样去实现一套兼容多款wifi模块的自适应框架呢?rk3399的wifi模组自适应支持多款wifi是什么技术原理?
    发表于 03-07 08:21

    基于FPGA的速度和位置测量板卡设计实现

    电子发烧友网站提供《基于FPGA的速度和位置测量板卡设计实现.pdf》资料免费下载
    发表于 11-08 09:49 0次下载
    基于<b class='flag-5'>FPGA</b>的速度和位置测量<b class='flag-5'>板卡</b>设计<b class='flag-5'>实现</b>