FPGA设计中一些经验

  1 Verilog的技术点
2
3 1. 0-n循环计数器
4 //////////////////////////0-n循环计数器
5 reg [19:0]cnt;
6 always@(posedge clk or negedge rst_n)
7 if(!rst_n)
8 cnt<=20'd0;
9 else if(cnt<20'dn)
10 cnt<=cnt+1'b1;
11 else
12 cnt<=20'd0;
13 或者
14 reg [19:0]cnt;
15 always@(posedge clk or negedge rst_n)
16 if(!rst_n)
17 cnt<=20'd0;
18 else if(cnt==(20'dn-1))
19 cnt<=20'd0;
20 else
21 cnt<=cnt+1'b1;
22
23 2. 复位信号的处理
24 1. 如果没有使用PLL模块,则将rst打两拍,形成“异步复位,同步释放”;
25 2. 如果使用了PLL模块,则:
26 a. 先将rst打两拍,形成“异步复位,同步释放”的同步复位rst1;
27 b. 取pll_rst = ~rst1 和 CLK送入PLL模块,并将locked信号 和 rst相“与”形成 rst2;/*注1_2*/
28 c. 再将rst2打两拍,形成“异步复位,同步释放”的同步复位SYS_Syc_Rst;
29 即(1) 还可以做个上电200us计数器,200us_OK高电平表示上电200us,在b中rst2=rst & locked & 200us_OK
302) 外部复位释放 且
31 PLL输出稳定 且
32 上电已满200us,系统内部电路的复位才释放,开始运行;
33
34 input clk;
35 input rst_n;
36 output rst_nr2;
37 reg rst_nr1,rst_nr2;
38 //异步复位,同步释放
39 always@(posedge clk or negedge rst_n)
40 if(!rst_n)
41 rst_nr1<=1'd0;
42 else
43 rst_nr1<=1'd1;
44 //再用一级寄存器进行同步处理
45 always@(posedge clk or negedge rst_n)
46 if(!rst_n)
47 rst_nr2<=1'd0;
48 else
49 rst_nr2<=rst_nr1;
50 //如下处理后,可以保证系统充分稳定后(复位按键释放 且 PLL输出稳定)才退出复位状态,开始运行
51 wire sys_rst_nr0 = rst_n & pll_locked;
52 //一级同步
53 always@(posedge clk or negedge rst_n)
54 if(!sys_rst_nr0 )
55 sys_rst_nr1<=1'd0;
56 else
57 sys_rst_nr1 <=1'd1;
58 //二级同步
59 always@(posedge clk or negedge rst_n)
60 if(!sys_rst_nr0 )
61 sys_rst_nr2 <=1'd0;
62 else
63 sys_rst_nr2 <=sys_rst_nr1;
64 //生成最终系统复位信号:控制其它电路
65 wire sys_rst_n = sys_rst_nr2;
66
67 3.带使能端的寄存器
68 (输出端口数据在En和CLK控制下进行周期更新,每个数据的维持时间为以时钟周期T的整数倍)
69 reg En_RegOut;
70 always@(posedge clk or negedge rst_n)
71 if(!rst_n)
72 En_RegOut<=1'd0;
73 else if(En==1'd1)
74 En_RegOut<=En_RegIn; //En有效,数据在时钟沿更新;不然,一直保持原值
75 3.1分频时钟:系统时钟+分频使能信号=分频时钟
76 (a)最佳用PLL产生分频时钟
77 (b)没有PLL时,用计数器产生分频时钟,但推荐用“分频使能时钟”
78 即用计数器产生分频单周期脉冲,将之作为使能信号配合原时钟驱动外部reg
79 《===》用原时钟的分频时钟 驱动外部reg
80
81
82
83 4.上升沿和下降沿检测器
84 //input Signal
85 reg Signal_r;
86 always@(posedge clk or negedge rst_n)
87 if(!rst_n)
88 Signal_r<=1'd0;
89 else
90 Signal_r<=Signal;
91
92 wire Rising_Edge_Flag = Signal & (!Signal_r) ; //判断按键动作:按下?释放?
93 wire Faling_Edge_Flag = (!Signal) & Signal_r ;
94
95 5.跨时钟域处理(同步处理)
96 5-0.使用接收域时钟对输入信号进行2级同步处理;
97 5-1.单向控制信号检测
98 (用接收域时钟检测输入控制信号的上升沿、下降沿;
99 利用单周期宽度的上升沿、下降沿标志作为控制使能信号)
100 5-2.专用握手信号
101 5-3.使用Fifo
102
103 6.M4K使用:宽度最大只能到36bit
104
105 7.如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
106 结论:赋全0、全x或者全z可采用'b0、'bx或者'bz的方式;
107 赋全1可采用赋~0或赋-1的方式较为简洁。

 

posted @ 2012-03-13 22:53  fishplj2000  阅读(307)  评论(0编辑  收藏  举报