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