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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑 8 x  R3 v; S+ ^: x& |
2 c! a# |" g- W1 g* o* c- D- s( Z
下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  5 l" q$ h4 J  S: p  f1 T
     另外附上程序二为可行的一个程序。2 |. `/ j- y6 c+ j0 j( L+ F
     拜谢!
. t' Q6 S, ~  |' j程序一:9 D9 U4 r$ A* h3 T
LIBRARY IEEE;
4 N! s" N1 a  J0 NUSE IEEE.STD_LOGIC_1164.ALL;
0 J5 ~6 C; k7 w- F5 o7 cUSE IEEE.STD_LOGIC_UNSIGNED.ALL;$ z5 A7 l  `: ^* z. B6 c2 @
ENTITY KBJISHU IS
0 @5 A9 ?9 d4 G; _6 Q    PORT (CLK,RST,EN,M: IN STD_LOGIC;
# p# d  e# Y0 J          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;( l6 Q$ Q& N1 a# X+ J* R; I7 a
END ENTITY KBJISHU;) r$ z- i( f( y4 C: p  \0 g9 H0 @
ARCHITECTURE ONE OF KBJISHU IS
- i' }+ |: p+ R    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);$ @: |6 P9 y; _  |" C) j
BEGIN
, w/ [: I. s2 O$ Z9 p   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  . n1 e" S- w$ s: ]6 d# {
  PROCESS(CLK,RST,EN,M,AIM)0 T) s0 K0 @; V# V" O+ K
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');
6 f, i2 N' y; `  BEGIN3 u$ v+ V7 [" K. u+ T& v1 Z% o
    IF RST='1' THEN CQ := (OTHERS =>'0');& F6 j% ^: K# p8 z: d9 ~! ~
        ELSIF  CLK'EVENT AND CLK='1' THEN9 W4 S$ \' @- O% H2 k
           IF EN='1' THEN
' ?, L7 g& t5 G, z0 y2 Y              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1;
5 h! n. E4 t- \" R: Q0 S                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
3 P- G: ~9 w8 L5 E8 }5 r                ELSE CQ := CQ+7;   --个位出现9,进行调整+ `7 V5 |  [5 \! R' i* V
              END IF;4 O% o0 R, U4 j) @" D" t! l+ V
           END IF;$ o; R$ s; S6 j, \
     END IF;  P7 O% W1 `# W( y
    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    $ t& I1 @+ }1 v  {; m  U
    END IF;
+ X2 N" {8 R. }. k    CQ1<=CQ(3 DOWNTO 0);
; p. t; s8 ?+ n    CQ2<=CQ(7 DOWNTO 4);9 i! T: J0 g( R; t4 z
    CQ3<=CQ(11 DOWNTO 8);& S! A/ T/ k) b: y" w8 c
  END PROCESS;# \! X. g/ f& f. }. U2 U
END ONE;
* u+ B" H& k! v' o& [4 z
. G; t' Y1 G- t9 K5 F* ]7 i- D程序二:& L) I, ]' I: l; X
LIBRARY IEEE;
7 v5 _/ ]3 x8 Y% L, P4 FUSE IEEE.STD_LOGIC_1164.ALL;
' U! W+ U- S6 G: [( Q6 J9 ZUSE IEEE.STD_LOGIC_UNSIGNED.ALL;
& p% }( \! W  n: pENTITY KBJISHU IS
* k' N6 Z5 y$ \5 a. z9 O" j7 d! m, ~/ `- ~
PORT (CLK,RST,EN,M: IN STD_LOGIC;
* V# F# c, q5 t, K

9 }. I  Q8 D: u( a* r0 OCQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
1 n  J! Z. N9 q$ r' @
END ENTITY KBJISHU;/ o8 k8 f" e: T* N
ARCHITECTURE ONE OF KBJISHU IS7 `/ e. W! l4 C7 d* }2 W

: ^. W/ m* m5 m) u% c- V9 v+ Y; mSIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

3 M. ]5 a* Y+ s. X9 vBEGIN3 e- v8 }! E4 G8 s0 g( E

$ ]* V0 F) f( h2 u4 L7 fAIM<="000000100010" WHEN M='0' ELSE "000100001000";
4 |' ~- L% D! ]# T- C% y0 D) \4 F- {

) k) q( w* t2 Z+ {8 @$ t7 `6 X8 f5 q1 v
PROCESS(CLK,RST,EN,M)
% _: @& t9 L* T) K

. `8 M- d6 j7 N1 b( rVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

- I) V' v' ~! t! ?: u+ i- U
- F! Y, E3 ?, |; ^/ c7 x" WBEGIN
) \$ ]; x0 @9 v. @' h( a: M( \1 d
( O* O2 h2 h$ M
IF RST='1' THEN CQ := (OTHERS =>'0');
9 V4 S3 o, y5 U; |) G* q# o

* Y0 j9 t. M* ]% f( g1 ]ELSIF
  _; K3 W* r$ X" I+ JCLK'EVENT AND CLK='1' THEN
9 T  b2 P# W3 N0 `6 B

" v5 {5 d8 I+ v% NIF CQ < AIM THEN- E. X& J+ R& E& o; ~

4 E! X" B+ h/ a' y0 w( q2 K) X! Y( }--
循环控制,在达到0-220-108范围内循环  p) w* C& _' k% v4 Q$ ^  g

' }) R& P2 z" T) V1 a
+ n: ?5 W8 D% E' F( V" k6 M4 _IF EN='1' THEN

; n6 Y, r0 K, h4 b2 H5 A! f. S+ s. \
IF CQ(3 DOWNTO 0) < 9
& _' d, k! W! FTHEN CQ := CQ+1;

( X; U; r! g  P2 Z( A* ^) K2 G7 S; k
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;% ^4 d( n* {4 |( z
; a8 m/ s+ c! B1 }# R
                                                        --后两位出现99,进行调整, c5 I1 l' T0 |- S5 B) `
  b9 w$ I# u  y
ELSE CQ := CQ+7;
! P" o& ]8 c! `# E- F, Z--
个位出现9,进行调整
7 H3 P/ ^; S8 A5 j# R' G( w$ H
, ~( C( X+ z% ^3 \: c
END IF;
9 \- _! y: Z: C$ b% ~

2 {+ _+ Z! h- ]" I# X* _4 JEND IF;
  _4 {5 I$ M6 G0 x4 I5 H
: F& ^9 E4 I$ h% S) N+ t" _2 p, _
ELSE CQ := (OTHERS=>'0');
: n8 X8 _( g( w9 K; Y

! e0 f: `8 P( k" hEND IF;

! w7 r* F+ n) m; W8 n& c" l% l
3 }) r: e. w% E- }+ D( IEND IF;
% p& M& P- c7 Z4 x; b

* {$ _! s2 a0 q2 {6 I
: s; e1 ]0 E$ C+ z0 F3 O# ~' p, d, d1 ~+ F2 T1 j0 A
CQ1<=CQ(3 DOWNTO 0);

) O" |# }* j6 y; @/ W9 m% g
; O# R1 H1 e1 z# t9 Y8 R1 S6 A) y; T  S
CQ2<=CQ(7 DOWNTO 4);

% ]1 l. Z* U5 r: N2 }' x& d: A" r" L
CQ3<=CQ(11 DOWNTO 8);
& r) ?2 O- W1 ~: N1 c! F

. P3 I4 Z# p( @; Q/ LEND PROCESS;

! x- s$ ]% Z9 D9 K0 p  ?# D# REND 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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
; r% E$ y3 v( [, Y) k- d! J3 {如果有可能还望再次指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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