科学设计复位信号
-
两种复位方式
-
异步低复位:reset_n拉低时,不等待clk,直接复位
always @(posedge clk or negedge reset_n)begin if(~reset_n)begin led <= 1'b0; end else begin end end
-
同步高复位:reset拉高以后,等到下一个clk上升沿复位
always @(posedge clk)begin if(reset)begin led <= 1'b0; end else begin end end
-
-
Xilinx复位策略:
- 同步高复位
- 计数器和状态机必须复位
- 能不使用复位尽量不使用。过多复位引起扇出过大(一个reset信号驱动过多信号)
面试问题
-
如何设计复位?
- 弄一个时钟和复位管理模块,管理不同的时钟和复位信号
- 同步高有效(Xilinx)
- 复位信号由PLL的locked信号产生
时序优化技巧
-
时序问题:
-
代码出现问题:8分代码,2分约束问题
-
注意事项:
-
先画时序图,根据时序图写代码(与c语言不一样)
-
if嵌套层级不要太多
-
写/读FIFO/RAM时,最好使用时序逻辑,打一拍写/读数据,更稳定
//组合逻辑 wire wr_en; wire din; reg valid; reg [7:0] data; assign wr_en= valid; assign data=din; //时序逻辑(打一拍) always(posedge clk)begin wr_en <= valid; din <= data; end always(posedge clk)begin valid <= rd_en; end
-
一个clk内不要做太多事
reg a1,a2,a3,a4,a5,a6,a7,a8; //写法1:一个clk内加了太多 always(posedge clk)begin result = a1+...+a8; end //写法2:拆开再加 always(posedge clk)begin result1 = a1+a2+a3; end always(posedge clk)begin result2 = a4+a5+a6; end always(posedge clk)begin result3 = a7+a8; end always(posedge clk)begin result = result1+result2+result3; end
-
-