|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
请教大神,8 M9 A# k; a- D2 j" W+ ^
我使用的是黑金AX309开发板,写的一个程序,烧程序在板子里跑的时候,按下复位有时程序直接跳过预热部分进入运行,有时就直接停在预热这里,有时就正常运行。我在Modelsim里面仿真的没有问题,在仿真里,复位后都是正常执行的,求助大神,非常感谢!/ S1 k/ t* G7 r# t& s3 v* I& T9 l
`timescale 1ns / 1ps
& d& f, V1 `# v/ \/ ^2 p# p//////////////////////////////////////////////////////////////////////////////////6 p/ ^! | O" G+ {& v; s1 @ ]( b
// Company: % m" o( c* R+ ^8 x2 S
// Engineer:
8 j" A5 [8 q: F//
% i/ X% Z$ I) f/ ~2 r( q3 W4 \// Create Date: 13:38:11
; U7 z j4 ?" v; a# Z// Design Name: ' b1 n! q V; W: r
// Module Name: auto_lock $ n; b- L, g6 q' S3 d8 F' v
// Project Name:
g4 B( A6 i% m// Target Devices: + K, C- P8 \' @* J2 s5 D
// Tool versions: @9 L, m0 x; i) w
// Description: % ]+ E" P' P [1 H2 ]
//) b& M& c/ C, @# S. j& {
// Dependencies:
4 k. I, ?# U9 v* p1 ^! R7 ]//
: I7 S. N P) _0 v8 @- \* V// Revision:
2 ]- e8 E5 _2 e7 u* @6 Z// Revision 0.01 - File Created% C+ Y; {- E1 p, y
// Additional Comments: " r# v8 p2 ^) a1 m7 F7 G0 ^
//
% `/ B) w7 \; L6 |0 R$ v//////////////////////////////////////////////////////////////////////////////////. X6 I( H% {, S$ y( l( J7 @
module auto_lock() k7 w. r7 }) T/ t. L. P
- d0 D' \7 G t' y input clk, //系统时钟* g) v" S2 j8 }' v0 a+ @
input rst_n, //系统复位
; N. L/ D5 x' s5 T4 M input lock_signal, //失锁锁定输入
& ?4 X0 \2 B+ k$ t. n ! V. y' {& \" X
output reg analog_switch_1, //模拟开关1输出$ T6 [: f2 b, G% g. L/ \: ~ Q
output reg analog_switch_2, //模拟开关2输出) p2 @' r2 K5 `2 a" g# l/ x! l
output reg [13:0] dac_ch1, //温度dac- w! F; X( [- I, H# H
- Q& T) G/ m- E3 \2 t// input sawtooth_frequence, //锯齿波频率4 V; J$ R# q. u2 h
output reg sawtooth_control, //锯齿波控制
. _- z0 S" ]0 {% g4 g3 _
: d2 L5 A I8 F! T7 p input signed [15:0]adc_ch1_data, //adc ch1电压值; S6 O7 t2 z# _2 h- o9 z
2 N. n& y: u0 ~ y4 @- E# x& f
//按键输入
X3 R% ~ }. a1 P$ Y, q# L0 ^ input key1_in,
' A) p" W9 }: m2 ^+ q9 ^& y input key2_in,/ }( l+ R l+ q3 M" S2 F" b3 L
input key3_in, Q+ T1 K9 d5 c2 x4 X u' P9 h- o
input key4_in,* ?: r9 e5 S# k9 R5 G. m
% l- u/ P0 m% [0 u1 k
//系统状态指示# u5 \& c, \! ~7 t; S4 Q& h
output lock_status_led, //led
) k( [4 s/ }* G! O3 x$ `1 p
* A9 k; C) e4 w3 E //DEBUG数据: d& E' z$ Z6 p6 O% l
output [23:0]debug_state_value,
- j7 ~8 ~# c) e+ e output [23:0]debug_pdh_ok_count_value
& [ B9 X2 a! h8 u );' [" [0 j9 _7 o; Q$ e) `# s) `' L
9 k7 ]4 V4 J0 R9 i; Q Y parameter ON = 1'b1,OFF = 1'b0;
0 g4 _* Y. ]6 ^! D! H parameter LOCK = 1'b1,UNLOCK = 1'b0;2 _2 x4 z3 J9 u" p
parameter START = 1'b1,END = 1'b0;
f2 N1 L' |' l4 }+ z) R
% U* G$ e& f7 k" R// parameter T100MS = 32'd49_999_99; : s/ @2 R+ z; ?! ~- t/ o
// parameter T1S = 32'd49_999_999;
# G& D* |% T" R' z/ C0 g7 b3 o& g$ p: a% [$ e+ P
parameter T100MS = 32'd49; 9 n/ J$ A# f* u7 n
parameter T1S = 32'd49_9;
7 ~2 v+ b9 F% d o) V) r k3 o5 f parameter T2S = 8'd2;
, a/ |" Q" I7 v: l( z3 u8 Q6 B% k parameter T5S = 8'd5;
/ z9 k8 f# R& G/ `- u& k parameter T10S = 8'd10;# v' I/ c) h5 J
parameter T20S = 8'd20;
`- y% P' u1 \' \$ a1 V2 S
1 E' f2 K5 C- }# |3 l1 s //temperture search zero point
: W2 n, Y8 f) V# Z //parameter EXPERIENCE = 14'd8540; //经验值
4 C3 ^4 W5 d! `) d: @8 {% Y$ a+ e
) e1 m) l# y8 _& j1 c assign debug_state_value = auto_lock_state;
! |* w( ?: `) G0 q! a/ g" B: T! E assign debug_pdh_ok_count_value = pdh_ok_count;
. {7 ?4 e( ?) H4 N. C: p" u1 X9 ]0 v3 t. R: t3 N. u2 ?
/**********************按键模块*************************/# q" ], Q' w% R# f) x
keys keys_model(
: Q6 I9 i% Z H$ K ( ~% p* Y% H) j J U
.clk (clk), //系统时钟! D1 ^) K# [* I' V' S# V
.rst_n (rst_n), //系统复位; u- j+ g4 v5 M' A e- ~# G) S
/ q6 a9 J: R+ |# l- ] //按键输入% i9 q! b/ v! t. n6 D
.key1_in (key1_in),
! |; A) p8 z& V: K- W% Y .key2_in (key2_in),2 z9 x X, a* [. _+ w- K
.key3_in (key3_in),
* i8 P# }" L5 t1 w- s3 A .key4_in (key4_in),1 ^; M. w' \+ `
, G1 P: L0 w5 M% f9 A //按键输出4 i0 [* V p1 I- i! g5 d1 h9 t
.key1_scan (key1_scan),
. b8 R2 D7 Q; u$ z" Q) F .key2_scan (key2_scan),
& ~& c, ~% v& L8 V; Z4 H. ~8 I$ r) K& M. r .key3_scan (key3_scan),* j: }+ y8 u) @( y
.key4_scan (key4_scan)
1 |1 S5 a* e: n# V5 d2 j+ w );
4 O. c' K7 X( l, W) f8 U0 K; [( a/ a1 \7 M
& R2 b6 U% Y' H
/***********************锁定信号触发边沿检测*************************/
% s! S$ x# ~& O7 B* l7 R+ r lock_signal_edge_check lock_signal_edge_check_model(7 o" j, O$ }2 r4 d
( h* J( S* n' Y" S* A+ O
.clk (clk), //系统时钟1 x9 K* w4 z& O& R/ V/ Y4 c
.rst_n (rst_n), //系统复位
0 J) Z- D& {' Q) e( _ 0 s; X v4 @& O# Y. U. h4 B
.lock_signal(lock_signal),/ _6 E! J# ~+ d6 b& a
.locked (locked),( Y& l7 @1 G, Z5 B1 r" G- K; c
.pdh_ok (pdh_ok),
' j. v- A8 v5 ]8 a8 z$ V .lock_status_led (lock_status_led)
7 U. F/ O7 {/ K1 l );
8 j, q5 ~+ |, H' K( p7 I3 j
- u! y. s$ [$ l; N$ X; z+ ? /***********************系统运行*************************/
4 q6 X$ Y% r( ?- P2 | reg[7:0] pdh_ok_count;4 P. R# A$ r2 i
parameter pdh_ok_count_N_INIT = 8'd3; F b+ |% ^5 L, L3 Q. S, Y6 f
reg[7:0] pdh_ok_count_N;- I, [) \) r, Z- N( a/ [5 A
reg[31:0] pdh_time_count;& l7 v1 r0 I. t
parameter pdh_time_INIT = 32'd999_999;/ H& L, W# P6 A& O. A3 x4 \3 P
reg[31:0] pdh_time; //在锯齿波为1Hz延时为20ms 频率越高锁定时间越短0 F( ]; ^% F7 w
reg pdh_ok_delay_flag; //pdh延时标志* E6 A+ ~! o. L7 } k
. f3 C3 I- X0 S1 P. x reg [7:0]locked_fail_count; //锁定失败计数2 h5 z; T4 r' X: ?& L2 t) X
# D$ V3 g2 ^& n9 @# I reg [13:0]dac_to_temperature_i;, ?5 z! o+ W+ `9 C7 J' N/ c1 G
reg [13:0]dac_to_temperature_spare;//备份值
2 ^3 q5 v7 M& O/ v0 B; n . p( m$ K- B1 j
1 t/ S1 `% c3 A' V/ `0 \5 m parameter init_N = 14'd8; // N 的初始范围
: h( \$ B. q2 [' h* T reg [13:0]N;
; j$ S, ?; e8 `+ b. j* b6 S, z parameter init_K = 14'd2; //K 的初始值
, M0 b$ c* X7 ?& N6 ^; F+ F reg [13:0]K;
7 c% }. F. D% F 8 l/ w. G P: a1 K- v
parameter init_DIR = 4'd1; //扫描方向初始为正7 G- G _3 \ X; v- J
reg [3:0]DIR; //扫描方向! a" {+ l4 ]" H8 y
# c# t6 x5 l" j$ l& v ~' U 8 [# z5 {9 O( o: E
' d$ W, G6 l2 y0 s, r0 g0 p
reg [31:0]time_count;% P M7 o% k. l& R3 [5 ^8 I7 o
reg [7:0]time_ones; % B! l6 G! p0 h
! v& {3 `! I$ h) Z' g reg [7:0]auto_lock_state;
! H5 y3 T& N7 V" C: B reg [7:0]system_run_task_state;
6 |" Y7 k% p( k# p ) L" k! K; ]0 ~3 P1 F
reg key1buf,key2buf,key3buf,key4buf;
9 T; a2 g3 h9 ^9 W7 r+ k# E0 p; c. M% Z5 K
3 E2 K4 r; y: ?; A6 [7 j: B
always@(posedge clk)6 c5 p. D c- |/ ~
begin8 r' t; C; _- K
( |$ x' I9 U$ d+ u
if(!rst_n) //低电平复位
# m( M/ V) h0 M( j; } begin) F$ B7 H( P) O8 @+ x) t9 \: D+ i
auto_lock_state<= 8'd0;7 a! ~# U2 K/ X. R! S" Q, f+ [
1 l6 D/ C* Q: x end
9 F! y! x! K# p$ L else * c9 \3 j4 F g1 x- p
begin
/ E% j( I4 {' W* D) ` m+ a0 G" [ R8 `5 ~ }2 s5 \. z
case (auto_lock_state)
8 q) \7 d2 H" P0 L$ u/ x2 v . W$ `: M! m# R
8'd0: //初始化
+ O' {, G( @% o2 ?& T* s8 F begin 7 y0 T) B' ]5 C/ V/ P
" Y- J( I4 F* o& N- T' Z2 ?
dac_to_temperature_spare <= 14'd8192; //0V7 Y' v( d! M6 _1 L% k) N" y( W
dac_to_temperature_i <= 14'd8192; //0V
/ p/ J6 d! d1 t& k dac_ch1 <= dac_to_temperature_i;
/ D: Z9 f7 p( _! e' z 4 {( G$ P( u+ k% [; Z
analog_switch_1 <= OFF;% I. J) g5 x" x6 Z' b0 B& w
analog_switch_2 <= OFF;
, j: @6 G& z: ^! ^8 U' a# X$ x sawtooth_control <= OFF;
! E+ G3 F* Q ?. X, u
% g) l1 S2 U J5 i( s0 X- B time_count <= 0;
% {, G% \/ m$ S( s time_ones <= 0;# K! ]! r; A' O2 R4 I
+ U/ |2 o8 ^1 y6 c% P key1buf <= 2'd0;
0 I) }0 p: O* t5 O8 ?1 _ key2buf <= 2'd0;
. f3 A; H2 Y+ `; h ; `) S: B' W+ m& J7 _% J
auto_lock_state <= 8'd1;
% P5 b. w; ^5 C0 `9 I end
$ I# A" b+ K1 \! d! W J ; D) C0 v% i/ Y+ Q- Y9 S
8'd1: //运行
# \6 n) @: n" U7 z0 U5 V7 {* { begin3 J0 R' U9 h% I/ f+ U
# ]/ j _/ F, x6 A8 [ dac_ch1 <= dac_to_temperature_i; 7 S. E( }. S! q9 F6 I4 Q" w; D: B& M
' R' _9 ]" }/ K" v. @- M //系统预热20s9 i8 S' Q" K6 Z0 ?+ R
if(time_count == T1S) //1s: u5 }- U/ s3 P1 M
begin
% ^$ n4 a* D4 y% A. r" b" d time_ones <= time_ones + 1'b1;# l: u: T4 v+ z5 y! H$ M, G
8 L2 n0 z8 J% a9 V# } if(time_ones == T20S) //20s9 N1 l0 b" ?% J
begin
b2 d& H4 X. Y: P0 a) f, V: f //进入正常运行模式
' X* T. j6 f. i+ e' A' c dac_to_temperature_spare <= dac_to_temperature_i;
9 { u. E: l0 k time_ones <= 0;7 H: _, \6 \/ P/ n
time_count <= 0;
( b, W. d% }) F0 P$ ]4 X( \ system_run_task_state <= 8'd0;% t2 M, k5 q* Y. h5 V8 E
auto_lock_state <= 8'd3;
0 S: Z$ }9 y4 e# P% ] end
p, d* o2 V0 S6 w% _, B else! ?( K8 p3 q' v# G& b" k
time_count <= 0;
5 F, h/ c( t- F: ] end& H* _7 U0 q- x. d z
else
; N$ F7 H) D: U begin
J' b' K9 ]' W2 \$ b time_count <= time_count + 1'b1;
; o+ i& X, }- |, r7 L
8 w6 R/ P& M" ~, ?4 ^ p. c6 Y //按键按下进行快速搜索
1 `6 I/ r/ S3 g$ Q8 K2 E `) f key3buf <= key3_scan; ( C" f3 P+ f0 z/ n6 ^3 e3 W
if({key3buf,key3_scan} == 2'b10)
- i t1 g7 C9 `8 L4 A5 U1 b5 u1 x begin5 [% d R7 o* Q
time_ones <= 0;+ g7 J& {. Y3 y
time_count <= 0;
0 E+ r& O7 r3 [6 i. s7 l auto_lock_state <= 8'd2;' k( q) w5 E' h6 C% b$ T9 c
end
0 O- T$ [ G5 _) \- e* x; Z end 3 {. `0 V% B( {8 Z" v
$ a1 v2 r" o' Q+ N end$ ~- H, W( @; B$ _
, J7 E$ o- \# i' Z- S& C7 \ 8'd2: //快速搜索
5 q# Y9 U+ n% v! C! h# O( R begin
3 S: B" g0 m/ S! d" D7 M- D0 a 5 i! ^! u9 L- l7 a/ ]
fast_search_task();
- F0 p* k. f0 W8 L9 L* ~; Z8 z6 `7 e
end1 D" y6 w8 _9 M9 y3 b% Z+ s) v% R
8 J# F' z0 z* ~% z+ T
8'd3:/ F$ o& i/ m0 U2 E5 @
begin //模块运行
. v7 t3 B, H4 T
) m3 a, T# N% m1 P2 F: y- m8 ], O system_run_task();
Z8 ]0 c% z, E3 d V; R
+ [5 }1 P4 A, X ^/ I/ r7 b end/ k8 C# F: Q' S* A5 t# @* |( N
+ W k- V3 j8 t
default:
4 Z0 I1 q. }3 n auto_lock_state <= 8'd0; 0 X+ |& K" D4 X) H7 f2 k
# Z: E) J7 j1 ^
endcase* N! K% `: y6 y2 U
end
7 Z; F2 U, ^/ Y4 l6 i* J end
7 E& N( ?+ [! a/ y4 U
& ]) s# A; o* o! ~2 n 9 }" S. |5 f1 y1 ?8 r- Q
' d2 D2 a$ r' l3 t! \
//快速搜索模块的任务" |5 L& {# \$ E
task fast_search_task();
! e$ g$ _# d0 A7 J. t * ?% [* O9 u5 Q
begin
! z2 Q1 y$ j2 @7 \+ g! `, p
5 ?, H: V- j- D1 g$ F R: q6 e key1buf <= key1_scan;
5 O, v, C& ?+ @1 k7 \ if({key1buf,key1_scan} == 2'b10 && dac_to_temperature_i < 14'd16373) //下降沿& c& _6 ^" p* O& Y; L: S0 c
begin. y+ g' D7 K" y" c m( N
dac_to_temperature_i <= dac_to_temperature_i + 10;
# U2 E) c; z& d/ W dac_ch1 <= dac_to_temperature_i;
% g% J2 j* j: B* w/ J F end
2 `3 p* Y1 n9 j, a: y1 j, _. D4 O* S& \2 l4 }& C' B
key2buf <= key2_scan; , E* ^3 n {$ p4 V- |0 ^8 S: T2 c
if({key2buf,key2_scan} == 2'b10 && dac_to_temperature_i > 14'd10) //下降沿9 l" P- W6 o# {7 \- N+ M
begin
3 q) X. S# t- c6 a. ^; S1 d dac_to_temperature_i <= dac_to_temperature_i - 10;
) E- \- [, T& w3 i. X5 V dac_ch1 <= dac_to_temperature_i;
I- x; X) n( M2 W" U end; ?& L$ r+ U. S* }2 n, Z' e4 p9 ^ Q
- f" @4 D$ R1 c* o# D5 P: z2 v7 j
//模块运行
4 z3 {5 l$ B' m$ h key4buf <= key4_scan;
/ C) z7 j' w+ z: w/ Y if({key4buf,key4_scan} == 2'b10)2 Y T5 J' R5 Z) L
begin
) |7 o* a& p# f7 b# z dac_to_temperature_spare <= dac_to_temperature_i;
) A5 O$ e! Z4 B# U( b system_run_task_state <= 8'd0;& X) y+ A6 E0 k& ^7 |5 ]0 T* t
auto_lock_state <= 8'd3;
: I: C. G9 Y2 Z7 G5 F1 e) @ end 9 f. q2 ~& j) Q) `: D% Y1 u
" H9 w/ G7 T2 T' M end
" z# l; b+ i5 }; H/ N" \* R% V2 U
4 ~# V+ M+ X+ F8 n9 I endtask
" W% k* J& y$ N! @8 v) V; X1 \& }+ d+ M% R* S6 Z4 b6 J
//系统运行任务
& X: A7 ]+ e; Z9 ~7 l: e task system_run_task();
9 [& [( y6 R& o* [% V0 O2 t begin
! [2 p' O0 r* P+ c% Y5 {" Z" R case(system_run_task_state)( A; Y+ Q& K- x/ {6 N5 a! E2 ?
# Y" }* ^* u7 x: l* F
8'd0: //初始化) v* w# L' L: T3 s" N0 O
begin5 S3 I. Z6 i2 u# N# f" J
/ v/ M" F' |( `, j time_count <= 0;
+ k* }, U3 ]* [" [7 H1 h5 F g time_ones <= 0;
4 w1 }+ o% t. P3 S ) I) e5 c+ _7 r2 j/ O4 J
pdh_ok_count <= 8'd0;- x! i9 f) c7 L3 D$ x8 {1 l
pdh_ok_count_N <= 8'd3;. ]& d7 J; x! k4 a' M
, B) x! ^& `* b0 A8 L; O B
pdh_time <= pdh_time_INIT;
( _- N$ h1 w% V; q2 k% V' d) w5 p) a
pdh_ok_delay_flag <= END;
$ k3 e, m i9 A / B5 j: O% m0 Y# r
locked_fail_count <= 8'd0; //锁定失败计数
9 F4 W, ^# n& P X 3 s) E5 F9 E2 ]6 @9 o( _, D+ \$ J
analog_switch_1 <= OFF;8 K: ^- p/ D- ^3 {) o3 T* P! p) y
analog_switch_2 <= OFF;4 [5 I6 B# v8 x# T8 [& T
sawtooth_control <= OFF; , z+ `- l) M% P* y
, J* K. T9 p' U' z2 Q' A
system_run_task_state <= 8'd1;
1 F% |9 Y& o4 P5 M7 \9 J! U) i4 p6 u& I' m; F# A% L% V! R
end
; C: ]$ Y, q' M( y. h+ n6 {' ^
% D4 b& F* r* {9 U3 \3 M: @# g 8'd1:1 K7 C% _; A( _' ?. Q: h3 I2 T$ C
begin
# n# u; `5 Z% k* A9 Q3 u* c //init i = 0. U( k/ J7 b1 U
dac_to_temperature_i <= dac_to_temperature_spare;
* t z) a4 ]# s2 J+ r N <= init_N;! `/ a, d% s0 c$ G; d4 u9 `$ d
K <= init_K; ) T' e" J, D- \: G+ `9 G) V
DIR <= init_DIR; //init 扫描方向
; M* S& |* d, d1 I: U9 b8 @( { 6 i, M+ _3 j/ h7 e' V
system_run_task_state <= 8'd2;) b4 i1 `! A8 f8 m7 L& ?& v( z
_& |- {, F3 b K. t end
7 v$ w" E7 S" V5 L: H2 ]- \
5 j- A; Y7 ]0 N/ ? 8'd2:
2 y5 X$ K2 z2 d5 r" I begin
n' M# m. y. K; e( p; v. L5 { //start pzt scanning( V' Y0 g f$ y, P* D9 k
analog_switch_1 <= OFF;5 ~7 Z% j3 ^( y3 p. o7 R
analog_switch_2 <= ON;
) U9 b& e6 D9 @3 }0 G' O 6 P: A" @0 R. W# Y2 y7 B
//开启锯齿波扫描- S T* c2 L+ T ?% S: Z8 y
sawtooth_control <= ON;
9 c: K G" g3 G8 Z4 J* h- j- ^- O
; C0 D3 }6 V' a- i //T(i) = V * step * i;8 `% H' i5 y+ w# P: R) N) ]$ n% f! n
dac_ch1 <= dac_to_temperature_i;
/ C, S# [' q8 a C0 @& E b time_count <= 0;
7 I* P* \6 U9 H( i z5 e time_ones <= 0;
6 W( ?, z) f( w- ?. o system_run_task_state <= 8'd3;
# Q5 P/ }1 I$ ^( j2 B" ^ end
. x/ a0 R o4 B9 z6 d" t' {2 {
[. e# {/ l* w: { 8'd3:
$ Y% `# L6 `/ a9 G+ g4 ~8 [ begin5 b! Q9 c8 I, D- B9 h6 N2 ~! K
//wait 4 - 10s
8 ~% d+ X% D1 i8 H9 i# R& m3 K if(time_count == T1S) //1s" P7 U& j, V* A- l T
begin
/ D7 e6 a+ S' y8 j+ h( o time_ones <= time_ones + 1'b1;
+ t3 Q- x1 f9 }. V4 e9 z3 s4 @ 4 Q) t2 p9 S' b8 W6 D$ ?" ~
if(time_ones == T2S) //2s- r( h4 J0 W; R! x$ Z: C; q9 W( [
begin
3 A" s: _0 j1 O# u3 \+ [2 o search_mode(); //扫描模式
H1 x: [: D9 n2 p* S- D dac_ch1 <= dac_to_temperature_i; //更新数据
: g7 m$ R7 w5 } {% U1 L: f5 v time_ones <= 0;
' K# G6 g+ c+ V# | end
+ D9 s- f$ \9 m
( O6 B1 j# w, Q% [+ h8 I) F time_count <= 0;: U0 _+ _! \) [. y( m$ \
end
: ]/ Q: h) I/ ^( t! x else
0 J& m: \9 H6 j8 {, {2 F+ b$ | begin
8 n; g; X* F+ j( C% u4 i time_count <= time_count + 1'b1;
( j! o6 N5 X, U- M* w, Y* e# w 8 X7 ?. Y$ I2 b& q) p" |
//PDH OK? //判断是否找到信号* i/ s- z+ R/ `: _$ ]! @& @
if(pdh_ok == LOCK)$ `1 p: h3 f( w
begin$ o* I2 H1 }! P, l
pdh_ok_count <= pdh_ok_count + 1'b1;
- y7 j% a2 W+ v) a5 X! W pdh_ok_delay_flag <= START; //开始延时; E3 y% d! P0 V+ J
time_count <= 0;
2 O3 s+ l3 v9 o time_ones <= 0;
; r" ?3 d& s9 n" P, J, Q5 ]( g! m pdh_time_count <= 0;' j4 w; a4 C; b4 b3 R3 ]
system_run_task_state <= 8'd4;
+ F/ _7 F5 v- D2 | end
) d7 A0 [% f. t, q; l end6 I; M6 E( ]2 V! M
end4 Z5 j& R# p* X/ }6 f
+ L0 k( y/ S, k: B& ?$ [$ U/ j# J7 t, D8 w6 H
8'd4: //PDH OK Yes
! m# O9 Y4 H! g& N( W7 K# R begin
# H/ o5 m+ C$ I( @& V * `* n. P8 Z: M- h
//锯齿波扫描延长2S
@) B, c( M( Q0 l( `( a# r if(time_count == T1S) //1s
" ~; ~5 v4 S9 I d5 O begin
# ?' E( c& p6 U. K2 a time_ones <= time_ones + 1'b1;
6 B) d- D% m4 O, i
6 }! P7 l j5 w8 E; N6 u7 i" q if(time_ones == T2S) //2s
- s3 a* O# V$ Y9 ~ `7 T6 v begin
( p8 g. {0 M, \6 W
9 O/ B2 R8 ^1 |/ b. _( ?; ] if(pdh_ok_count >= pdh_ok_count_N ) //真信号
; a4 w# p% V6 q3 R. |7 j begin+ H N2 @4 f! L8 o' _
//pdh_ok_count <= 8'd0;
. k% S+ h, ?: s- x+ Q8 N, r pdh_time_count <= 0;1 y8 B( f3 I, i. h' j
system_run_task_state <= 8'd5; //搜索到pdh: j2 ?# l% W! u7 r: t4 ]
end+ o A. P" T9 V' H# H9 \, e( |9 V
else5 B9 _( ^& b, y4 G2 ^" ], a
begin& m3 p. X0 Y# k9 a
system_run_task_state <= 8'd3; //重新扫描7 S4 U+ t, e! N6 X! o4 ], w" a
pdh_ok_count <= 8'd0;
0 ~2 _0 f. }; D+ T5 z7 q: N end, B: C( E J0 H% @/ ~7 ?3 T4 p" e
1 y: t- M$ e4 K- }
time_ones <= 0;, N6 x. O z( ^ E, C# t
end
; }3 A1 k: J6 o4 ^ }) T
$ I# p- i4 W( U2 t: _ time_count <= 32'd0;6 d8 l8 z( _; q+ E6 e
end
4 r6 L# W8 t1 ~; ^- @: d! d& Q else1 k0 U5 N5 C2 s# w( ], ^) Z
begin" o% L9 [, H) t8 e8 }2 u! ^$ A2 A6 v
time_count <= time_count + 1'b1;
' r/ \" D7 _/ E W1 B: g 5 J' Y7 j% m. x
//pdh误触发处理
) a& K3 J, Q3 d& |: C9 y9 A //开始延时: ~# K u. |1 x9 V
if(pdh_ok_delay_flag == START)
# P; i) b1 P9 x7 F begin
* ~% Y/ c/ K4 D% s if(pdh_time_count == pdh_time ) //ms
$ b' T! X' H4 X1 ]* Z8 i9 { begin& C: e; K7 i- E
pdh_time_count <= 32'd0; 8 `9 o% c" F4 Z; P8 S1 K
pdh_ok_delay_flag <= END;
' k( a l& M( u6 e" F/ q1 J end( u/ U( A3 W* v7 f
else
$ `/ o! y& I% S6 {8 k pdh_time_count <= pdh_time_count + 1'b1;# `5 {4 J. W: E& @: s f
end
+ S' {) U- Z1 L' z0 T else
9 D. Z+ c Y: B8 R& M9 q9 r+ [1 o begin
1 ]3 T, E! s$ T- @8 A; |- Q if(pdh_ok == LOCK)
" V, x9 D% `* v n4 T6 m begin+ ~6 o7 u7 [) c! \7 _. e1 B) t( F1 J
pdh_ok_count <= pdh_ok_count + 1'b1;
5 y T @6 Q) p+ G/ j; @ pdh_ok_delay_flag <= START; # n5 _" Z8 [; Z. w9 W6 z4 W
end
; l% q+ @/ [ j' t4 Y end0 b) b# [( ^5 s2 x* J
end; O2 o1 h# {6 \: A! U
end
8 _& P3 v$ I9 W' T 9 d! o5 R4 H+ E- }; Y
8'd5://search pdh ok 8 }) A# f0 g! I& ?1 u9 [" X; [
begin
) H' I$ z/ U: t
: E1 Q$ [7 @; S4 d
! b& C) [7 }3 s5 z- f //stop pzt scanning1 }0 r8 X& e) e4 M- B$ ?
analog_switch_2 <= OFF;6 p. Y5 \4 Y/ y! ?) H: _
//analog_switch_1 <= ON;0 e6 O: T$ `4 G" m; S% r" T$ P5 i
sawtooth_control <= OFF;" H) g3 ]* |( V( q% L0 @
- d N% p( p3 t& | @6 ?
/*- ^* a: q) Q6 |6 y/ F9 E
//100MS等待
% Q# {+ C4 I: t% ^8 O$ X if(time_count == T100MS) //1s
) l3 i$ g5 l; g" E begin7 g' C- D% H% C" }6 ~3 K, b; ?
system_run_task_state <= 8'd8;
$ k3 C6 ]9 h( k% n# e time_count <= 32'd0;
. G% w) Q, j; Z( H' i& ^ end
0 ]4 c9 j2 z5 P% K else, b/ L% U S: V' S, E3 g7 Z; }: k
time_count <= time_count + 1'b1;. S/ z- C& B9 M4 c2 ]
J3 h8 Z" t$ H" o */
2 C9 K& j0 r6 k0 O3 u( y* x end2 n( a. T$ w9 @* w Q! @6 T
}3 c7 I, ~- N: m& l" j /*
0 k+ G# `( S7 F, O/ W) J 8'd8:
. Q0 T& U! s: n; d begin* Q; ?" y. |- E9 M9 j
+ R0 }( I! L! l4 I
//锁入过程
' b: v4 L, y6 [* @! e, ?- ^ //analog_switch_2 <= OFF;) l& Z8 T/ k) q p$ G6 f0 {$ N
analog_switch_1 <= ON;
, W' o S; C! t $ u4 l( F W! l' g
//2S判断一次
2 f/ N# b' N" q7 J6 y6 A" C if(time_count == T1S) //1s
/ x# H; b- E' M& K/ N/ S9 P begin
) a6 T% E, U1 d7 P time_ones <= time_ones + 1'b1;0 f2 t) N5 h& M Q8 g
time_count <= 32'd0;
. e6 z8 r' ]# Y# W% } end
4 }7 c" r( e; | else5 N4 s8 s8 q6 N
time_count <= time_count + 1'b1;% ^5 w l' m( x7 _; f5 k
3 @ Y( y& t( y) r( Z& b! w/ ]8 G if(time_ones == T2S) //2s
. K9 p1 e# T9 V; d# R* } h begin
6 w( F% e5 Q) v2 L 2 w4 D0 i$ m! d) l
if(locked == LOCK) / X9 O& G2 G" P; A; l
system_run_task_state <= 8'd11; //已锁定
3 f7 v$ M5 I9 M5 o& A8 n0 p& p else: z4 |- L3 L! @8 h1 H! c
system_run_task_state <= 8'd9; //未锁定# O! D5 f) `2 c1 x' P
. E3 w5 y# x4 ?( J' Q' _ C time_ones <= 0;8 m+ s- h l! x! c. ^" ~+ v }
end
3 s9 d. g$ l* x1 L0 }9 r) d2 D. ?! u2 x, r' \
end% _8 m0 M" Y, }% k. L9 {1 ?
) u9 O, a1 \4 D5 B: O, u" O# q& `+ ~) V2 R# F
8'd9: //锁入失败
2 ]6 b. Y3 t1 u# | begin
# k- E" I# a0 Z0 O! s2 t7 x ! p d x) `+ \( L8 u% e3 s
//锁定失败计数 ' e; @' X' w) B% R2 ?
locked_fail_count <= locked_fail_count + 1'b1;
$ F3 d9 A: `# I$ {/ x) v7 K3 _$ `
9 n; O7 f7 w0 F9 s! p if(locked_fail_count < 8'd5) 7 |+ [( f% k3 P) t
begin
" J" l& ?8 n w9 v' L5 L- W6 @ system_run_task_state <= 10;* V7 m1 {1 j, G+ N
end3 q% @/ e4 z' ~* @) s3 V& g0 `
else
9 Z5 `( t7 ~! h: S begin
: S) Z3 `8 e9 B$ t# u9 j$ Z) A if(dac_to_temperature_i > 14'd0)% L0 |8 b' O6 p; v% f+ a. n
dac_to_temperature_i <= dac_to_temperature_i - 1'b1;
- F& U% u' F1 S" r" ?8 y9 U# F
- a4 U9 m s9 Q/ c analog_switch_1 <= OFF;8 w/ m( ?$ K* G; P$ m
analog_switch_2 <= ON; / P' ^3 z% T/ V- t# ?3 x
6 [7 k3 U, h) a0 w. \( y. z locked_fail_count <= 8'd0;* X" h) G; ]8 [# W; T# K
' u6 t% w$ h3 e; X
system_run_task_state <= 3;
: O) ?: {. ]5 y- S6 d# m+ ^0 U" F8 a- |5 Y. @/ S F
end
! B" G2 T+ W3 H7 b5 r5 Z& h9 s3 n. g$ J' {& v0 [3 R
end
: U+ m' `1 T d8 ~" T- p8 t& R# N
: P6 Q" l. n7 |' T! \! Y. Z: s- v 8'd10:. l9 @# F- {! i0 r% i
begin
& L e$ m& r. @
, B/ l, T" |! D& R* C" w, U analog_switch_1 <= OFF;+ {- C9 `& ~+ L, ~! _8 f
* m( r+ w7 ?0 V! b
//2S判断一次% m! R% F0 s3 _
if(time_count == T1S) //1s
' E6 W! n2 \. V5 y. [! g begin
# p# N9 @3 R6 d' ~5 i time_ones <= time_ones + 1'b1;
; D0 W s$ u% | time_count <= 32'd0;
5 v" g+ e7 _2 Z2 E/ {) Z( T/ ~ end z! j3 y' K' M; y9 C- |& p+ A
else1 T2 h- X( Y% D' |
time_count <= time_count + 1'b1;) q0 k+ } F8 Y0 k2 i# P
1 k) I# U5 Z9 }! l if(time_ones == T2S) //2s
+ c+ K k. }' o+ I) G- \) a7 W0 {" X$ P begin% q" g2 g) o' i6 t
system_run_task_state <= 8;6 Q$ K; Q. p q1 W/ o c& N U
time_ones <= 0;
4 i# U% F0 U ~3 O c! f1 Q/ s end
5 ~: u( R+ f- `, E
7 S' b5 [, X: t$ B) c end
* j* D1 H1 \3 O& h/ N
7 }9 @( W* c O. V5 ^2 U! s9 ?' i _: U8 p8 X
& K9 `& }7 i$ X6 }) _ //锁定状态下的运行: X n) ^$ v" c7 Y& H* P" x
8'd11:+ y X( l7 u* H+ V+ l' W( ^
begin
: ?* b, y) y( t2 B0 V& ^2 E0 l9 y+ _! ?
//5S判断一次' b& g: T% ^1 f8 b
if(time_count == T1S) //1s$ Z3 v# t, D1 r" _" E: r3 S
begin5 w* b6 ~- n J8 v, G' h) f. F
time_ones <= time_ones + 1'b1;) ^; q. b) W- }" R8 R p
time_count <= 32'd0;; b, V" W# [; w$ p% c8 Z! |- P
end& z. _3 P1 y: ^1 q6 W- ^; v$ F/ {6 D
else9 X( l# |) @- S0 l" I# u1 ?+ r' n# A
time_count <= time_count + 1'b1;
6 ^, _" M: i/ p- ^5 z1 H- B
* b9 t' A1 O1 A I+ @7 ? if(time_ones == T5S) //5s
, U) v% w7 I6 x* O begin' R8 |5 V$ R4 j. M0 b7 D
+ x# z3 i7 [6 G5 t //电压 > 1 并且 处于锁定状态5 X4 f v3 L/ m1 p+ `" x
if(adc_ch1_data > 16'sd6553 && dac_to_temperature_i < 14'd16383 && locked == LOCK)
0 S( c# K( H: {7 l& ~- s! c6 _ begin; @+ N8 `3 {+ u& d) q
dac_to_temperature_i <= dac_to_temperature_i - 1;
5 ~5 O/ ]+ J$ C* ~, }1 r e end
3 d# _5 A/ _. H) k+ q7 d& V else if(adc_ch1_data < -16'sd6553 && dac_to_temperature_i > 14'd0 && locked == LOCK)
9 k7 T d6 p9 J8 K5 s begin- x% r# |& n) `$ Q6 p X
dac_to_temperature_i <= dac_to_temperature_i + 1;
0 w/ j' x# C& ~3 J3 `5 L6 A. x end 2 V2 H4 z$ p& Q! u9 P
" @7 F' A, j3 O' \8 s) j //T(i) = V * step * i;
" z' Q: p5 Q/ z9 V) G6 U. X" Q dac_ch1 <= dac_to_temperature_i;
( H; k' a+ W2 v9 ^6 B 6 u) v$ P/ R9 w) L, {7 J
time_ones <= 0;9 K7 Q6 ?7 d6 I! [/ y
1 D# e4 Y6 B2 |1 G( k4 R end
3 p7 J+ ^2 c( E' |5 k- F; p: T
6 ~: |7 R. v' Q; X, c7 r# Q : f; _0 B3 i# J$ |( C
if(locked == UNLOCK) //unlock5 x F" d5 `5 ]* q L
begin
; }; `4 V* ^2 F* ^+ F6 W
, C7 a, n9 l# D/ b6 H % g2 r- x. J( s2 S, B9 e/ _
dac_to_temperature_spare <= dac_to_temperature_i; //记录失锁值 从新扫描时从此值开始, `& ~+ l8 X% q
time_count <= 0;0 o z. n3 V1 L3 p3 c5 ~4 l4 j% |
time_ones <= 0; _- W! t6 E2 [' r# Z5 b
system_run_task_state <= 8'd2; //重新进入扫描模式3 s+ x0 ]4 v3 D9 w: R9 R" l
% F# H* D5 Y: K. b! x6 J5 ^+ j end
9 b! d5 c. u7 |0 t end: q- a. c- U( F) i% {+ G- w
*/: B& S% r/ B' M3 d h' z* v t' M+ b
, V/ ?- A8 a- f9 X c- s
default:
4 \5 v# Y4 R3 e7 J, X/ A n system_run_task_state <= 8'd0;
' W2 z; }% e1 F5 I4 D* m; f endcase: Q/ J# X/ S' K4 O \! r
end , m8 ]* Q/ j- X$ f: L
6 f1 J, g6 Z+ A8 l endtask. f5 F5 U8 L) r- K; D/ _3 _
2 S4 Z) |5 X( l' ^' O3 L" t8 Y! K4 l3 ?+ r4 }5 p
- V( c H5 j z$ `9 i
// 扫描模式
& q6 [+ d0 N9 ]) Xtask search_mode;
4 G4 v6 q4 E6 f" l begin4 O! \" n, p, |% o6 s9 C) {
//切换扫描方向
1 ^% z; J: y1 J) O1 H' Z- O if(DIR == 4'd1)
" w% s6 |' b7 `! a' V7 d v' Z9 u1 r begin7 D( m& Q5 ^0 i, H0 u; R; B% ^$ C
/ S7 @; w8 I# h" h% p if(dac_to_temperature_i < (dac_to_temperature_spare + N)) # F/ B9 R0 r1 B8 r. Y# f: l3 }0 D
begin C: v5 u6 e: V: J* ?+ a% {* S
dac_to_temperature_i <= dac_to_temperature_i + 1'b1;# u7 y( Q7 t2 D4 M
end
- r$ D0 F) l7 O4 N% a/ d4 f. P else
6 j! W( }: U9 P begin+ H$ m2 C1 x7 Z: f4 u
DIR <= DIR + 1'b1;7 U' p C$ M( |8 U8 @* i# W
end" S9 e! D7 Q) C) {
* c; j& g y/ }, C+ l end
* e7 a" J7 A3 @& Q$ [- x# [% U else if(DIR == 4'd2)# c# t# F& q. f% P" V
begin
8 H) M% x3 a, Y( h3 x2 m % o+ x- |! ^) h. K; j
if(dac_to_temperature_i > (dac_to_temperature_spare - N))
$ k9 P1 ]+ s- S j5 W4 l- z0 t( P begin : |7 h4 j x/ a0 }, J
dac_to_temperature_i <= dac_to_temperature_i - 1'b1;
% w- u; Y% H5 o end5 P" x: N9 r: {, X5 T+ I5 O
else
7 |% l" J2 l0 T8 q* a4 O2 K begin
+ E( a! @! J2 x( [/ a. Y2 Q DIR <= DIR + 1'b1;
& G# M; O6 v5 l& ] end3 |# |/ j. t$ l( i/ y1 R
2 g0 h: R* J6 G: Q2 N* I
end# Z/ ~( p) F- r- T
else if(DIR >= 4'd3): \3 g( ?) \5 N
begin
* n: k9 s. T9 \& S& Z - i5 H9 Q p8 J/ [$ B! H
//扩大扫描范围) o4 g/ h z& B
if(((dac_to_temperature_spare + (K * N)) < 14'd16383) && ((dac_to_temperature_spare - (K * N)) > 14'd0))
; V" ]1 {& O+ h) |# N begin# v _- k, T& a9 B( u- o( v
N <= (K * N);7 L/ F7 \, V9 Y2 H4 l
DIR <= init_DIR;; Y& a6 a! ^6 Y9 `2 Y# c) E
end' O9 ^# w, e7 S @
else
: t# j" o, S. f9 b' r( e' Z, m2 z begin4 [' U5 c9 [" G+ U* b3 w
dac_to_temperature_spare <= 14'd8192; //0V0 {& j# H7 o( R: O
system_run_task_state <= 8'd2; //超出范围重新扫描& i" b1 H. ^- m$ u/ C n$ }+ z
8 v1 i' o& R J V% F end
( z5 L7 r9 ?$ Q+ j4 \ end
6 ] F; D2 C/ Z8 Y9 C) F+ Y! J' u8 z8 X, x* Z Z
end( g6 z% p- n! q
endtask
1 {7 t. Z8 v8 E* J( r! p! U4 v
% k5 Z' ^5 C$ a) b3 mendmodule |
|