笔试整理

触发器和锁存器的区别:

  1.面积:触发器由2个锁存器组成,占用面积大;lanch占用面积小,在ASIC设计中可以使用lanch实现一定逻辑,节省资源,FPGA设计中没有单独存在的lanch,一般使用查找表实现组合逻辑,触发器实现时序逻辑,FPGA上的lanch实际上是消耗触发器实现,并不省资源。

  2.稳定性:触发器边沿敏感稳定性好;锁存器电平敏感,容易受到毛刺影响。

  3.触发器可以设置在同一个边沿的驱动下触发,是同步电路设计,如果有lanch产生,则数据寄存不仅仅存在于边沿,打破同步设计,不利于静态时序分析,因为插入lanch后属于异步。但是lanch同样是时序逻辑,有数据存储功能。

  4.lanch在某些场合利用电平触发特性,能够比边沿多出来半个周期的缓存时间,叫作时钟借用(timing borrow)

状态机

  一段式状态机 Moore型输出滞后于Mealy型一个时钟周期;一段式状态机将所有状态转移写在一个always,如果过状态多了就会十分臃肿,不利于维护,一段式状态机写法不够模块化 ,且过于臃肿不利于维护,及布局布线;

  二段式状态机的输出全部组合逻辑,难免产生毛刺;二段式状态机将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。但是其当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。

   三段式状态机与二段式状态机相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出,解决了毛刺问题。实际应用中三段式状态机使用最多,因为三段式状态机将组合逻辑和时序分开,有利于综合器分析优 化以及程序的维护;并且三段式状态机将状态转移与状态输出分开,使代码看上去更加清晰易懂,提高了代码的可读性,推荐大家使用三段式状态机。

状态机的编码方式:

   独热码:和格雷码相比,虽然独热码多用了触发器,但所用组合电路可以省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。因为独热码只有一位的变化,所以更适用于高速系统。

        格雷码:使用了更多的组合逻辑资源,但是比独热码能表示更多的状态。

        2进制:使用了更多的组合逻辑资源,但是比独热码能表示更多的状态,稳定性不如格雷码。
modelsim查看状态机名称的方式

  在Testbench中添加如下语句:实质上就是在测试文件里添加一个变量来代替你要观察的变量;

  在modelsim的波形仿真见面右击波形,选择Radix--ASSIC

状态机状态显示

//------------------------------------------------
//--    状态机名称查看器
//------------------------------------------------
reg [39:0]	state_name_cur;			    //每字符8位宽,这里最多5个字符40位宽(THREE)
reg [39:0]	state_name_next;		    //每字符8位宽,这里最多5个字符40位宽(THREE)
 
always @(*) begin
    case(FSM_Mealy_3_inst.cur_state)    //这里写你例化的状态机模块里你想查看的参数
         4'b0001:    	state_name_cur = "IDLE";    //编码对应你的状态机的编码
         4'b0010:   	state_name_cur = "ONE";
         4'b0100:   	state_name_cur = "TWO";
         4'b1000:		state_name_cur = "THREE"; 
        default:		state_name_cur = "IDLE";
    endcase
end
 
always @(*) begin
    case(FSM_Mealy_3_inst.next_state)
         4'b0001:    	state_name_next = "IDLE";
         4'b0010:   	state_name_next = "ONE";
         4'b0100:   	state_name_next = "TWO";
         4'b1000:		state_name_next = "THREE"; 
		 default:		state_name_next = "IDLE";
    endcase
end

 

posted @ 2023-04-03 09:07  VincentZJ  阅读(30)  评论(0编辑  收藏  举报