FPGA设计要点

本文介绍了FPGA设计中Top-down设计方法的优势,包括早期错误检测、提高设计成功率和协作开发效率。同时,详细讨论了状态机设计,特别是三段式状态机结构、编码方式以及如何处理跨时钟域、亚稳态和数据使能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在FPGA设计的起始阶段,明确系统需求,合理运用Top-down 设计

Top-down 设计: 模块化设计,将模块化设计成树状结构,从最顶层开始设计,逐级向下设计。

有利于早期发现结构设计上的错误由于Top-down设计是从整体出发,先设计整体架构,因此可以在设计的早期阶段就发现结构设计上的问题,避免在后期出现重大错误导致设计工作的浪费。
提高设计的一次成功率通过逐步细化每个模块的具体实现,Top-down设计可以减少逻辑功能仿真的工作量,提高设计的一次成功率。
有利于多人协作开发在多人协作开发的项目中,Top-down设计可以帮助团队成员更好地理解整体设计,并在各自的模块上独立进行开发,从而提高开发效率。
便于适应需求变化在需求变化频繁的项目中,Top-down设计可以帮助开发人员快速适应变化,并通过修改整体设计来满足新的需求。

状态机 设计:明确需求和场景,合理的定义状态和触发事件,采用三段式的方法进行状态机代码编写。

结构清晰

三段式状态机可以清晰完整地显示出状态机的结构。它将状态机的设计分为三个主要部分:状态转移、状态转移条件判断和状态输出。这种明确的划分使得状态机的逻辑更加清晰,易于理解和维护。

代码清晰

三段式状态机的设计使得代码更加清晰,降低了编写和维护的复杂度。每个always块负责明确的任务,使得代码更加模块化,易于阅读和修改。

可维护性高

三段式状态机的模块化设计使得其具有较高的可维护性。当需要修改或扩展状态机时,只需要针对特定的always块进行修改,而不需要对整个状态机进行大规模的修改。
降低错误率通过将状态转移、状态转移条件判断和状态输出分别放在不同的always块中进行处理,三段式状态机降低了在设计和实现过程中引入错误的可能性。每个always块都可以单独进行测试和验证,从而提高了整个状态机的可靠性和稳定性。

状态机的状态编码方式:

建议编码方式为:独热码>格雷码>二进制码

        独热码:直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。例如,有3个状态的独热码状态编码为:001,010,100。

        格雷码:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同。例如,000,001,011,010,110,111,101,100。

        二进制码:也称为二进制数,是在数学和数字电路中用于表示数值的一种系统。它以2为基数,即逢2进位,使用两个不同的符号0和1来表示数值。  例如,000,001,010,011,100,101,110,111。

其他 设计:

定义数据位宽 data[3:0]

位拼接{1'b1,data[3:0]}
数据截位data[3:1] 截取data的第3位到第1位 如果是101的数据 变成10

分频计数: F = 1 / T

            50Mhz的输入时钟频率:
                计数得到:(s : ms : us : ns)
                    1s : 26'd49_999_999 (20ns*50_000_000 = 1_000_000_000ns =1s)
                    1ms : 16'd49_999 (20ns*50_000 = 1_000_000ns =1ms)
                    1us : 6'd49 (20ns*50 = 1_000ns =1ns)

            频率得到:(hz : khz : mhz )
                    1hz : 26'd24_999_999 (1s/1hz = 1_000_000_000ns =1s)
                    1khz : 16'd24_999 (1s/1khz = 1_000_000ns =1ms)
                    1mhz : 6'd24 (1s/1mhz = 1_000ns =1us)

                    50mhz : 1'd0 (1s/50mhz = 20ns)

常用运算符:

                &:全1为1(运用:判断信号升降沿):
        如{A_in1先A_in2一个时钟:A_flag = (~A_in1) & A_in2[下降沿]  A_flag = A_in1 & (~A_in2)[上降沿]}

                ^:相同为0,相异为1(运用:数据的奇偶校验):

        如{输入[2:0]bus信号数据:1'b1^bus是奇校验}

                移动运算符:

                        <<:乘法(60 << 2 输出结果 240)

                        >>:除法(60 >> 2 输出结果 15)

跨时钟域处理:(为避免亚稳态,提高系统稳点性,凡是不同时钟域的信号都要做)

        方法1 双触发器(打2拍)该方法只用于慢到快时钟域的1bit信号传递。
        方法2 多个信号的跨时钟处理:用异步FIFO,小数据用握手协议。

时钟上电设计:每个时钟域都应该有自己的复位信号

异步复位同步释放后得到的同步复位信号对system进行同步复位,保证了在节省可能节省资源,时钟信号有问题依然可以有效复位

多时钟域下异步复位同步释放:
    非协调的复位撤销
    顺序协调的复位撤销

        小结
        不同的复位方式有各自的优缺点,但是在工程中,一般都用异步复位的方法,最好是异步复位同步释放的方法。

reg rst_s1;
reg rst_sys_n;

//Asynchronous reset synchronous release
always @(posedge clk_100MHz or negedge rest_n) begin
    if(!rest_n) begin
       rst_s1     <= 1'b0;
       rst_sys_n <= 1'b0;
    end
    else begin
       rst_s1     <= 1'b1;
       rst_sys_n <= rst_s1;
    end
end

//synchronous reset
always@(posedge clk) begin
   if (!rst_sys_n) q <= 8'b0;
   else      q <= d;
end

参考学习链接: 作者-小火子Velsuked深入理解复位---同步复位,异步复位,异步复位同步释放(含多时钟域)_画出支持异步复位dff的电路图-优快云博客

c数据使能信号:使能信号可以帮助控制系统的运行方式和节省功耗。

        使能信号是一种用于启用或禁用特定功能或操作的控制信号。它在各种应用中发挥着重要的作用,如数据存储器、逻辑门和时钟控制等。

亚稳态现象: 是指触发器无法在某个规定时间段内达到一个稳定的状态。
        触发器Q端在时钟沿到来之后较长一段时间内都处于不确定的状态,即在0和1之间振荡。(影响后面信号)
            避免:
                用 两个 <= 对信号同步,避免Q端在时钟沿到来之后较长一段时间内都处于不确定的状态。

            结论:
                对于输入信号,尽量对数据进行同步处理,避免出现亚稳态现象。

       由于我知识有限,如果在表达或理解上存在一些错误或不足之处,我诚挚地希望大家能够不吝指出,让我们共同学习、共同进步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值