在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端在时钟沿到来之后较长一段时间内都处于不确定的状态。
结论:
对于输入信号,尽量对数据进行同步处理,避免出现亚稳态现象。
由于我知识有限,如果在表达或理解上存在一些错误或不足之处,我诚挚地希望大家能够不吝指出,让我们共同学习、共同进步。