找回密码
 注册
关于网站域名变更的通知
查看: 1706|回复: 2
打印 上一主题 下一主题

那个高手来解释下这个VHDL程序现象

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-10-26 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑 ! ^- k4 @+ O& v& k
4 c9 H* ?, W& c  t9 L! x
下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  1 p1 c5 F( _% X: b) v" m" x/ O
     另外附上程序二为可行的一个程序。
4 \. ~; h4 X- n. c7 Y3 \     拜谢!
' Y+ W( V0 m' q+ V7 Z) F程序一:/ w3 a5 S/ k8 k# c% x
LIBRARY IEEE;
" O1 I& Z0 E- q- i+ pUSE IEEE.STD_LOGIC_1164.ALL;  y, f% c* V! s8 `
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
( Z3 p: c* ?- t- T$ w) _2 gENTITY KBJISHU IS
9 s6 R) {! }0 l) r8 I2 s! |    PORT (CLK,RST,EN,M: IN STD_LOGIC;
/ K: Y& \/ L. O1 h; i- T1 L          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;0 H2 C$ E9 @2 w; k& C; J
END ENTITY KBJISHU;7 c+ S: Y8 x. ?4 P  D' J
ARCHITECTURE ONE OF KBJISHU IS! @" i- ]: h7 V! \
    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);, y2 R4 R& G5 F* w9 ^$ a
BEGIN
, U" b6 }' Z  z# B; B& _0 U. e7 _   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  / O" a5 G5 C& e  h8 `
  PROCESS(CLK,RST,EN,M,AIM): Q" l2 R3 S9 A) t
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');! B: Z' m/ r+ \- D6 E
  BEGIN
0 P4 m! {. S2 F# B3 L    IF RST='1' THEN CQ := (OTHERS =>'0');9 v$ H/ m: S; j4 ?
        ELSIF  CLK'EVENT AND CLK='1' THEN2 d- d; R7 r$ q# `) y
           IF EN='1' THEN4 _6 @3 c0 G. |; Q
              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1; * e  z* ^1 {( \+ j7 W
                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整$ a% T, C4 f) [
                ELSE CQ := CQ+7;   --个位出现9,进行调整
: C7 s6 a$ C3 E; }% u              END IF;5 H0 X. I5 L4 s1 d
           END IF;. f. n# Y& R0 q
     END IF;$ P. C1 k) D5 R
    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    5 @. Z2 l- e# }0 n) c9 z
    END IF;
% |. ]' j+ T) L% @4 ~7 b; l    CQ1<=CQ(3 DOWNTO 0);( X! M" P1 E9 _0 t' b/ T& P7 V' S
    CQ2<=CQ(7 DOWNTO 4);/ V# l/ `# h+ M$ g& D" o6 a
    CQ3<=CQ(11 DOWNTO 8);
' [0 {- P4 H. r5 R$ p2 J9 p  END PROCESS;
& b& Y3 Z7 N; P; }9 MEND ONE;
5 e, ]) y# G" C$ c: O0 }4 l
; d+ Z$ B' Q& c% p7 A程序二:0 y' c  a0 n2 Y" M* C
LIBRARY IEEE;
) B! z7 \/ [9 ~3 }USE IEEE.STD_LOGIC_1164.ALL;
& s7 J$ n% D" c! KUSE IEEE.STD_LOGIC_UNSIGNED.ALL;6 Y" E# Y. q2 L' p* T3 F/ ]* ?
ENTITY KBJISHU IS
0 r% j, k. S0 ?9 P- w4 x4 u, A: o: t& b/ j
PORT (CLK,RST,EN,M: IN STD_LOGIC;
# q3 G/ O) f! ?

2 k" N4 U$ r& ?7 DCQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;

/ h' D" [- Y3 ]3 V  Z5 b7 BEND ENTITY KBJISHU;& U( v% x+ D6 k: \8 s
ARCHITECTURE ONE OF KBJISHU IS) `. ]# e7 q- c8 s8 }" I& j

3 ]+ u, s, ?  \# R* W! i  PSIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

1 v) z+ p3 y  H* n" c% xBEGIN# g2 g0 U- r" a& W- r3 R

' X7 J1 i; J; f$ I. W3 yAIM<="000000100010" WHEN M='0' ELSE "000100001000";6 x9 g4 s$ `) s; N
) T2 d" @' O" u

$ j/ u: g3 g8 b: [% k- R/ }PROCESS(CLK,RST,EN,M)

3 h- o7 u6 d/ c% K; `8 O
( T3 `" M, [# [, L8 GVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

1 w& \+ j3 _% N& |. \% @: c! e0 a' p' A
BEGIN
1 ^0 V, A$ t4 j* i. u
, ?6 f1 ?# k% n& n9 @( X
IF RST='1' THEN CQ := (OTHERS =>'0');
7 p0 ]; R8 R5 _- U" ]
2 N7 D/ d' t2 |: B, S" H
ELSIF
, Y; C) \' Z8 v6 j) R& B1 f4 bCLK'EVENT AND CLK='1' THEN

9 A$ a. `. f$ a* M9 H" k) i$ G  D
, r" A9 k! J$ u: N+ s1 A; OIF CQ < AIM THEN  j* |& q, V( P2 v& u5 ?( E! F% \

4 ~# `! R* `! n--
循环控制,在达到0-220-108范围内循环
) e, i4 ~8 P; z* c% w+ G3 [

7 [- `* h' h# w2 r
5 Q5 ]. @6 Z# D1 i" P1 IIF EN='1' THEN
% d; l/ d1 c7 g* x
9 N* y  W7 f  T) d# n. B
IF CQ(3 DOWNTO 0) < 9
' P1 W1 @0 g" Q9 f5 d) x% S7 RTHEN CQ := CQ+1;

6 l2 n, p* h& M: P) b( w  u# y! ]/ v- K# g: @" l- k0 j/ x# C
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;( H; x6 @( D, b2 C" S

" x7 b/ W9 G. L. k                                                        --后两位出现99,进行调整
$ y# g0 |) W9 m+ H! ]+ Z/ O; g
0 |9 b4 W/ x3 {- l1 I0 y5 xELSE CQ := CQ+7;1 k* Y# l( S- H, K2 o7 v# F! k
--
个位出现9,进行调整
; v7 L! r, O( b# d9 k

# ]4 p  h0 Q- X5 qEND IF;

9 ^! N$ r  x1 n" t
# H$ j1 V+ d& kEND IF;
) e0 t1 t% V. N& b2 e& D# H

# s! q/ k+ n8 ^+ y0 O4 TELSE CQ := (OTHERS=>'0');
$ N6 Z$ l9 F- e6 Z& u

- M& C+ T( q6 y  |# nEND IF;

! w% C5 d; [# r4 y" V
$ _2 x5 Z9 n8 D7 Y9 k" l8 \END IF;

4 d4 H: L8 r& ]) H- r . o9 k+ U) |$ L9 Z  }
# O8 U/ I+ W" \1 T- d

% L8 F/ e5 g0 i. e/ R& QCQ1<=CQ(3 DOWNTO 0);
1 m) h- U, R( y

& v! W8 x8 P5 q. w8 S5 K" P/ C( s
& j. N" z7 t% _+ s7 Y* |. s- GCQ2<=CQ(7 DOWNTO 4);
+ A& Y/ W6 G3 n, [: X6 l

2 {; t. {0 O- @  r8 c7 JCQ3<=CQ(11 DOWNTO 8);
/ P3 o4 Q+ [5 G2 ^4 q" v# {
  [- W1 X& [' @3 g/ E/ O+ S
END PROCESS;
( n7 x( T0 D. G- a, i5 K; {% X
END ONE;

该用户从未签到

2#
发表于 2009-10-27 22:59 | 只看该作者
我用active仿了一下,改动后可以实现(比如,在模109模式下计数到60,然后切换,要求下个时钟到来时候就要开始0-22计数了),不过需要在CQ定义时赋0值(VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0) := (OTHERS=>'0');)。

该用户从未签到

3#
 楼主| 发表于 2009-10-28 18:03 | 只看该作者
首先感谢你的热心指点,不过我现在用的是Quartus II软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
9 a7 {1 C: G6 }$ b0 e如果有可能还望再次指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-20 18:37 , Processed in 0.109375 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表