|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 H- e. ?& _2 O# x+ G+ I
各位大神好,小弟最近刚刚入手Verilog,最近写了小程序。要实现的功能就是在单位时间500ms内数st信号的边沿数目,类似M法测电机转速。* [" O; Q j7 N: _9 j
添加到工程中起初会把,SYS_ret信号锁到CLKBUF,会报错。
; Z6 \3 V6 \: L- ]7 {' ] 网上 查找,加限制条件 /* synthesis syn_noclockbuf = 1 */,会通过,但是程序烧进去之后运行一段时间会出现异常,输出I/O会乱跳边。5 G; i' N( D3 H, M$ b( ?
以下是我写的程序,请各位大神指导
' {, o" {) e& s; ?7 Pmodule MIP_WD(sys_rst,clk,st,en,status,rst);. d; {% I9 J. L
. A$ c4 ?$ `0 J4 r2 c. U input sys_rst;- A, P2 T3 I( R- P4 o: _" d; @( ^" E
input clk; //10k
0 [. e; V c8 j input st; //喂狗
) |1 `# r+ ^% h2 ~ Z input en; //1=Enable;0=Disable
, {9 F! m: [5 I9 y* a+ @, N$ a input status;% G1 W I& W! U9 f/ C& J1 P* c( j" y
output rst; //0=Active
( ?# y, D4 F+ G Z% j2 @ & ^% I! X+ m" l) d
parameter TIME_ACTIVE =13'd5000; //单位100us, e. Q" o2 P1 K2 f% \1 q
parameter CNT_FEEDOG =13'd10; //单位100us
$ z, {" h3 I4 ]
* [; t3 d2 N1 b) p reg [13:0]Cnt_Timer; //500ms定时器计数器. Q2 s% T/ U, T/ B7 I; z& t
reg [13:0]Cnt_Feedog; //喂狗次数计数器
, \0 g/ N& m& z4 h reg wdo;
& X$ @8 ^3 W3 v7 H reg sig_r0;% V+ m7 w: I! H' E+ O) b
reg sig_r1;6 ?; q$ f& e$ H, W
wire both_edge;2 q ]! t& \8 _ O6 q
7 C) ^3 K& @6 C' [, j+ _ //检测DSP喂狗时,发送过来信号的边沿
. I6 I% ~6 q N& k1 ^ always @ (negedge sys_rst or posedge clk)
! N* L! [ }# F if (!sys_rst) begin l( N0 d6 E8 Z, c7 [
sig_r0 <= 1'b0;- C5 l3 c* s8 m% E l% ^* ^
sig_r1 <= 1'b0;" O C' H4 q, \- M' E
end else begin 5 d" w! E& ^ o0 m) R0 ]
sig_r0 <= st;. P7 a) K, s7 i: x6 j
sig_r1 <= sig_r0;! \; x- [, L6 u% |
end
3 R- T- u6 P# w assign both_edge = sig_r1 ^ sig_r0; //(~sig_r1) & (sig_r0);//sig_r1 ^ sig_r0; " S3 X- g7 e* m% N$ x
1 L; h p5 I% c7 C# B
//500ms内对DSP喂狗次数进行检测,如果小于等于CNT_FEEDOG,则认为DSP死机+ e+ }3 f' `( P+ O c
//判定死机后发送周期为1的方波,复位DSP0 v4 @( L- w1 _
always@(negedge sys_rst or posedge clk) E. P# M2 @+ Y0 M
begin" V* W/ A8 N0 @8 k; @
if(!sys_rst)* C2 _; {1 Z& p4 o; l: h
begin7 T0 d- M" J4 }6 H4 v
wdo<=1;( U( Q1 @ v) W
Cnt_Timer<=0; 0 n' N. u/ `$ k, h: l- n# K
Cnt_Feedog<=0;
: l( v1 U: x6 e7 ?7 a" f3 G end, |9 i, I; j8 b ?
else * N/ L' R" ~. z* W9 s
begin
( `. a+ J# p1 ^1 D if(Cnt_Timer>=TIME_ACTIVE) //定时器溢出
. b; K/ l r) {& z! d' @: u) ^5 c begin
* K9 Y$ K( Q" P* |& V& ` Cnt_Timer<=0;8 p1 R5 @7 s5 `( ` o+ ?5 Y& ]
Cnt_Feedog<=0;
$ q2 e; L* a3 A: V( C$ t3 _ if(Cnt_Feedog<=CNT_FEEDOG && status) //定时器溢出时,判断喂狗次数,如果小于预 0 i; K/ z" D1 G
wdo<=~wdo; //wdo的初值初始化为了1,通过取反即可产生周期为1的方波信号 J3 q, U& y" w2 b* ]3 w
end //end of 定时器溢出 : L8 {9 A! T1 [3 K+ V( e
else ! Z% A+ F/ ~: J7 \- o& }
begin1 I" E; N! h+ T! V+ e, u, M a
Cnt_Timer<=Cnt_Timer+1; //定时器没有溢出的情况下,定时计数器自加
# F& j1 S7 s6 Y$ ~ if(both_edge) //检测到DSP发送过来喂狗的边沿信号时, Z1 C7 J' J( }
Cnt_Feedog<=Cnt_Feedog+1; //喂狗计数器自加7 e) X9 f$ E9 P# }' r5 O7 d) M
end
+ ?# B2 y9 c' h( ~* ~* q end
, D: S( J& E! Q4 g' z2 |, c end
" i* ?( k, O# u5 g+ Y' u/ k& ?7 @$ o5 g+ R, y: N/ o% a
assign rst= (!sys_rst)?0:
/ `/ F0 J& U2 U P (!en)?1:
5 B' U( M0 k9 u" b0 l wdo;
5 ~( j" q+ f, H0 } r1 Y8 f( X1 U0 R3 N# U, V3 ` g& m
endmodule |
|