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: W
USE 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 W
ARCHITECTURE ONE OF KBJISHU IS
) P! o: g0 h" z+ H3 k9 t9 \
SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
1 @. q1 u$ U N
BEGIN
$ 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' THEN
5 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& K
ENTITY KBJISHU IS
7 }. _% _1 w$ i& v
8 ^* ^4 s) m- }* z3 Y
PORT (CLK,RST,EN,M: IN STD_LOGIC;
! u/ D R. M0 Y! z' D2 v
0 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 ]$ L
END ENTITY KBJISHU;
* W8 |. |* M1 H5 r: }
ARCHITECTURE ONE OF KBJISHU IS
3 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. z
AIM<="000000100010" WHEN M='0' ELSE "000100001000";
& ^- t' _8 z$ R( d
8 T- g0 H8 g% s9 O$ f
t+ b4 @" L7 E8 E& c
PROCESS(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- v
6 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 m
IF CQ < AIM THEN
+ g5 C% Z, E3 j/ _; i) d
* b7 {; _1 ]9 |& ^, \
--
循环控制,在达到
0-22
或
0-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) < 9
6 B( G9 ^8 G/ k8 A" ?5 k
THEN CQ := CQ+1;
- l1 q# W. g: J0 j! H! V
0 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% k
ELSE CQ := CQ+7;
, J' h6 K5 \& B, I
--
个位出现
9
,进行调整
6 h! t% v; p* E1 t
% S& k5 ?; k1 O
END 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: y
END 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' Z
4 `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