EDA365电子工程师网

标题: 那个高手来解释下这个VHDL程序现象 [打印本页]

作者: 主儿乞    时间: 2009-10-26 16:11
标题: 那个高手来解释下这个VHDL程序现象
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑 % q" N4 ?) N# ~) j3 E1 p; h4 _9 E
3 N% B) a! l# m% n' w, y& O
下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,M取0时模23,M取1时模109。不过要实现切换后立即按新的规则进行计数(比如,在模109模式下计数到60,然后切换,要求下个时钟到来时候就要开始0-22计数了),于是,我改动了倒数第七行,    IF CQ=AIM THEN CQ := (OTHERS=>'0'); 为   IF CQ>=AIM THEN CQ := (OTHERS=>'0'); 在Quartus II中仿真结果却出现了问题,结果变成了模20和模100的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  
' L, o" ~% D$ L     另外附上程序二为可行的一个程序。" S6 w! V/ ?$ [! w. A/ W
     拜谢!2 `# \0 D. h  d9 H% H0 R
程序一:0 g2 Q2 q! y2 t  }& s" w( ^  @
LIBRARY IEEE;
2 Y4 t; y9 y: r: WUSE IEEE.STD_LOGIC_1164.ALL;  z6 b7 r( }* ^% O$ M$ K
USE IEEE.STD_LOGIC_UNSIGNED.ALL;% g/ j5 \% `+ I9 g4 F3 O9 d
ENTITY KBJISHU IS
4 j. `) n) K( [2 d1 I! U    PORT (CLK,RST,EN,M: IN STD_LOGIC;  M+ D1 _2 R( Q. z
          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
; M6 b1 b8 D6 `END ENTITY KBJISHU;
4 P3 M, _+ G5 c0 WARCHITECTURE ONE OF KBJISHU IS
) P! o: g0 h" z+ H3 k9 t9 \    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
1 @. q1 u$ U  NBEGIN
$ v6 V$ ~) R% {% f' j% Z   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  % U# T& T8 T2 u' x  T+ V2 X" |
  PROCESS(CLK,RST,EN,M,AIM)+ M  u, r! ~) Y9 S2 P
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');
0 V) Z9 I+ F  e5 l  BEGIN; S7 G+ Q9 U6 c, \7 \2 U
    IF RST='1' THEN CQ := (OTHERS =>'0');
7 u" T1 d) j" t3 T% Z        ELSIF  CLK'EVENT AND CLK='1' THEN5 B( N" ^6 d. j1 I3 E/ e) w. u, m- Q1 X
           IF EN='1' THEN
+ j2 r3 U( N9 A; J4 J              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1;
  z3 y5 N9 q5 ^$ Y1 J' b                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
5 a, Q  F' ?3 U                ELSE CQ := CQ+7;   --个位出现9,进行调整
& j6 X; H5 T  C0 @) t              END IF;8 \9 m4 I7 @. ^) F6 Q  p
           END IF;' _0 z# e$ F( O. L5 k
     END IF;
! L* o) X1 h) ]; q0 w    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    / ~! U- R5 [5 {" z1 t$ v: P* J
    END IF;1 ^( R+ {; J+ R; C7 M2 C3 b
    CQ1<=CQ(3 DOWNTO 0);
+ K$ A2 |* A  ]. W1 X    CQ2<=CQ(7 DOWNTO 4);
4 I( }$ O" A: V7 n, |2 G. q7 A    CQ3<=CQ(11 DOWNTO 8);
& X1 U5 |  u# r- ]" x6 ?( s9 {  END PROCESS;
- K* [, e% `* o8 h, A1 x4 }END ONE;
4 G0 V! r& s1 B- x( u# O+ h* Q) n2 Y/ \- u
程序二:. G7 r4 k/ z1 u0 H' h+ _
LIBRARY IEEE;5 W7 f: G6 ~# B) [7 h
USE IEEE.STD_LOGIC_1164.ALL;
  }& d, t* i% `2 f) c$ H) @USE IEEE.STD_LOGIC_UNSIGNED.ALL;
, O: J" C4 \0 G& KENTITY KBJISHU IS
7 }. _% _1 w$ i& v
8 ^* ^4 s) m- }* z3 YPORT (CLK,RST,EN,M: IN STD_LOGIC;

! u/ D  R. M0 Y! z' D2 v0 T7 V% U& F1 c" h% I
CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;

/ s. h& q% s: V/ F& h4 ]. R9 ]$ LEND ENTITY KBJISHU;
* W8 |. |* M1 H5 r: }ARCHITECTURE ONE OF KBJISHU IS3 X3 ?; \* T6 I: C3 b
( Q; t: `) I5 O# a
SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
8 {. ~9 |6 i) t6 ^8 c5 _
BEGIN
- d& N0 _8 A! }3 `. C: T
6 O" {5 X3 k: Q. zAIM<="000000100010" WHEN M='0' ELSE "000100001000";& ^- t' _8 z$ R( d

8 T- g0 H8 g% s9 O$ f
  t+ b4 @" L7 E8 E& cPROCESS(CLK,RST,EN,M)

: {) R: Y( C- t9 q9 O5 w& |* S' w/ [! I* x" f
VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

( Z: q5 N: K! }. M7 v- v6 v$ l% G$ d9 N4 x
BEGIN
. r2 v9 `( j+ p- ?& z
3 r% B. J6 f5 @
IF RST='1' THEN CQ := (OTHERS =>'0');
. F" F) a' S7 }9 i  s% @
- u6 J: P' |7 c- Q: M
ELSIF
$ x, j' t6 i6 s9 x9 ?& U8 ]CLK'EVENT AND CLK='1' THEN

+ a, U3 I3 p& ~) Z( P" m, S; v
! z  ^/ g( w, ?$ X2 G- ~  X  Q0 mIF CQ < AIM THEN+ g5 C% Z, E3 j/ _; i) d
* b7 {; _1 ]9 |& ^, \
--
循环控制,在达到0-220-108范围内循环1 Z2 `" c/ S9 `/ O4 F
5 q! l9 m) _$ e

* p; S2 L* w" w7 b; c9 }IF EN='1' THEN
$ ^; e5 j8 G0 {
) O: u( {2 a9 e6 a
IF CQ(3 DOWNTO 0) < 96 B( G9 ^8 G/ k8 A" ?5 k
THEN CQ := CQ+1;

- l1 q# W. g: J0 j! H! V0 V1 O* A' c3 R+ O$ o9 t
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;
" x! g' k2 P7 \) z/ V

/ B" I$ o' S2 t% d+ u/ Q& N                                                        --后两位出现99,进行调整
# e/ ]! L& t; {" Y5 P  D+ T
1 w( A, B( j7 B+ J: ^/ Y% kELSE CQ := CQ+7;
, J' h6 K5 \& B, I--
个位出现9,进行调整
6 h! t% v; p* E1 t

% S& k5 ?; k1 OEND IF;
5 W4 T5 W- `) R2 L
2 |% n  l, K& U6 o
END IF;
5 |3 m$ @  M* L+ z- V# T4 u( {
2 Z- Q& I( z- D( b% l
ELSE CQ := (OTHERS=>'0');
" n& B( F" A* _* x; }: W$ j

( y9 l, b& u  D- P: yEND IF;

. K6 C4 F/ }& Z) R7 E1 [" S" n9 _! P  B9 P  n- t
END IF;
$ ~4 k" y/ B4 s  C" `* B# o

7 o* ?. @+ x3 L: ^! N8 w. }
8 R4 ]4 ~9 D1 C& T' Z4 `8 E& K. D3 u' F
CQ1<=CQ(3 DOWNTO 0);

- d$ B, A' \% F. A! t
$ Q& B$ {* ~1 N- U5 l
9 |- H; j2 K- |" a! R* R+ U' ~CQ2<=CQ(7 DOWNTO 4);

% @( }& A% V  z! w5 s
4 ^; S# z" s9 l6 I$ {CQ3<=CQ(11 DOWNTO 8);
' K1 ?/ b* q; t; |$ l
# I' u9 V" w2 E+ n0 s4 p
END PROCESS;
/ r6 E: J, N( ?% z4 x
END ONE;
作者: cxdzy    时间: 2009-10-27 22:59
我用active仿了一下,改动后可以实现(比如,在模109模式下计数到60,然后切换,要求下个时钟到来时候就要开始0-22计数了),不过需要在CQ定义时赋0值(VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0) := (OTHERS=>'0');)。
作者: 主儿乞    时间: 2009-10-28 18:03
首先感谢你的热心指点,不过我现在用的是Quartus II软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
6 P: W1 g  w( k2 E2 F& |1 `如果有可能还望再次指教。




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2