|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 [. x6 P9 N% c% R% v4 G$ D 各位大神好,小弟最近刚刚入手Verilog,最近写了小程序。要实现的功能就是在单位时间500ms内数st信号的边沿数目,类似M法测电机转速。
( a C: t! v; B* K3 d 添加到工程中起初会把,SYS_ret信号锁到CLKBUF,会报错。
+ _; f0 R3 o) ~) S7 q! F 网上 查找,加限制条件 /* synthesis syn_noclockbuf = 1 */,会通过,但是程序烧进去之后运行一段时间会出现异常,输出I/O会乱跳边。
% s8 x. k) ?+ B9 b3 y/ M4 h 以下是我写的程序,请各位大神指导3 S. Q( V6 C3 A( j' P2 S' c& h* V
module MIP_WD(sys_rst,clk,st,en,status,rst);
( L1 g! [0 R5 ^5 a( E+ x& ?& O0 O+ h4 Q! F: e N! Y
input sys_rst;6 n- |8 b& h" m1 ~+ ]
input clk; //10k
& ~9 J2 B, O4 G: a/ i* h' }6 \ input st; //喂狗: `/ Q; n4 y+ E! P; Y5 y
input en; //1=Enable;0=Disable
. U; J. V, e. Y& m: C+ x1 p- t input status;$ v* n9 F5 y3 n) e' P9 o
output rst; //0=Active& m. M! p. N% M U( t( A6 i7 {
& Y6 E. c. @% b: _7 I2 n parameter TIME_ACTIVE =13'd5000; //单位100us7 |/ U1 ]7 w$ r9 U0 A
parameter CNT_FEEDOG =13'd10; //单位100us
4 U0 f! H( y7 b. ^% B1 [* e" I1 T
6 v3 ^( G6 K' S; U9 q. o) S- ^0 n, c reg [13:0]Cnt_Timer; //500ms定时器计数器+ \, i/ U5 q) Y: c$ c1 E
reg [13:0]Cnt_Feedog; //喂狗次数计数器$ c) i2 D+ C& Q0 G* b) k1 i
reg wdo;% g Q0 o& D/ }: U
reg sig_r0;( u; {) f% o$ I3 l- I4 X: P, z1 @
reg sig_r1;$ V7 c1 Y. L" ^3 s; o8 e" f ]9 J
wire both_edge;
6 H* X) d# H% v# F
1 s2 o5 U: R; U //检测DSP喂狗时,发送过来信号的边沿
# ~8 X9 N3 c1 B always @ (negedge sys_rst or posedge clk)
, ~% `" y3 B5 X% v) v if (!sys_rst) begin r/ h2 m/ H2 A" P9 _! M0 O+ ~, C
sig_r0 <= 1'b0;
& d: H3 V5 {* r8 i! n sig_r1 <= 1'b0;! D, D7 l/ M5 X- @
end else begin
+ y: S6 @! f; K- h( Q7 v2 q* r2 a1 q sig_r0 <= st;8 r1 \4 O* l0 @( B( M
sig_r1 <= sig_r0;
9 X- C$ X% `2 b8 c# H" l2 M end ' R2 E; I! {/ Q1 B' z; y8 k
assign both_edge = sig_r1 ^ sig_r0; //(~sig_r1) & (sig_r0);//sig_r1 ^ sig_r0;
' g# s2 l' ?8 X. d2 O5 f4 _2 E
: S. y. ^% d- p r( x4 L1 i //500ms内对DSP喂狗次数进行检测,如果小于等于CNT_FEEDOG,则认为DSP死机8 \& r7 n* y) N- H9 ^+ z6 h
//判定死机后发送周期为1的方波,复位DSP
. f# L6 T( \5 Q! p- r always@(negedge sys_rst or posedge clk)% C# X n6 b' I2 A( p) _
begin
) R8 p3 I/ O* H# r if(!sys_rst)0 E' _9 w3 I& J B" } f
begin
# h8 C% S" W* n0 R* e/ H2 T4 Y3 f3 y; } wdo<=1;
% X8 b. H& _5 H& o, Z Cnt_Timer<=0;
5 u; N x8 k1 H' b Cnt_Feedog<=0; # q9 J* Y( J! c+ P2 Y6 x6 P4 c
end
/ J+ d2 m" M" d1 q# A else
: h8 U1 W7 a- C' z3 H, N! W$ v7 r begin
7 b {9 [* C& ~5 P! C; @3 L# u3 D if(Cnt_Timer>=TIME_ACTIVE) //定时器溢出 2 j" j7 ?: C3 \0 D. v \8 u: B2 V
begin1 c3 r. ?) \1 t0 M
Cnt_Timer<=0;
7 l# R, q: y4 U Cnt_Feedog<=0;
) Y$ U |7 a: m* V/ H if(Cnt_Feedog<=CNT_FEEDOG && status) //定时器溢出时,判断喂狗次数,如果小于预
( g& ?# {- @4 o4 a8 \* u wdo<=~wdo; //wdo的初值初始化为了1,通过取反即可产生周期为1的方波信号 2 `+ _, @* y; N& W& g/ A& `* A
end //end of 定时器溢出 ( o" o/ M: B# r3 M+ K! K, ^9 m
else
3 H- D7 N1 J% ~% A+ x1 X7 I begin( {% J4 }' W: u5 ~
Cnt_Timer<=Cnt_Timer+1; //定时器没有溢出的情况下,定时计数器自加
- a' L; L. E; m* w+ R if(both_edge) //检测到DSP发送过来喂狗的边沿信号时0 }/ J+ V: X$ U2 ]+ b
Cnt_Feedog<=Cnt_Feedog+1; //喂狗计数器自加4 W7 H+ o: @5 P6 U& u
end
% B* b$ C3 v1 A, z. z3 k! ? end - Q/ ?( j4 p3 K; a
end ) g2 w) d. d" P P* `! O
/ F/ p) H& t* W+ W
assign rst= (!sys_rst)?0:
7 K9 s# C' O8 k" _# ` (!en)?1:& {: O2 j/ K% g& E& e1 w0 Q
wdo;/ `9 S1 A Y- L
. N+ h: ^/ \& b5 Sendmodule |
|