找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1141|回复: 2
打印 上一主题 下一主题

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

[复制链接]

1

主题

3

帖子

-8933

积分

未知游客(0)

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

EDA365欢迎您!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑
+ C4 y1 E  D2 e3 |, o1 C; O1 ~
" }4 E. q( }8 L# r# @下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  
0 T, J" I: z& k     另外附上程序二为可行的一个程序。
7 i$ |. k: v3 o! E     拜谢!
5 z% C( w' b- J; C3 t& c1 v7 P- H程序一:' g- [. t* b  i; R1 Q
LIBRARY IEEE;
# Z" u$ k2 Z# _8 o, O3 xUSE IEEE.STD_LOGIC_1164.ALL;9 k5 y: W) O' s- U$ K& _3 S! b& y
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
. s' w5 {* E- l6 q! M& t& nENTITY KBJISHU IS
5 C6 M8 x9 \5 X2 _: ?' N3 M+ [) T    PORT (CLK,RST,EN,M: IN STD_LOGIC;8 z& N6 a& u$ K/ a" T
          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
9 S" ~) o3 }: kEND ENTITY KBJISHU;
+ |8 Z& V: a' b- ?! N2 EARCHITECTURE ONE OF KBJISHU IS0 p( x  M/ s3 Z+ e; P- T* g
    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);% ^0 Y5 Z* r& j) @4 D& i
BEGIN/ k5 c2 M: I/ o- r. H
   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  : \* }; a/ e) F" G
  PROCESS(CLK,RST,EN,M,AIM)* D3 P0 j! V) z2 X1 o
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');
+ a) A4 C4 Z, `% a  BEGIN
: [! }" A7 o2 E6 j    IF RST='1' THEN CQ := (OTHERS =>'0');$ W* r; k* }, W0 W6 i/ m# P
        ELSIF  CLK'EVENT AND CLK='1' THEN, u* F% p% }" i2 H5 ?% ?6 Q
           IF EN='1' THEN
& N2 D0 B- r  L+ d4 _              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1;
7 L. N1 o; Y5 l* Q# q2 t                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
. H! j0 Q: k! ~& X7 W                ELSE CQ := CQ+7;   --个位出现9,进行调整$ J3 S5 H9 y  K
              END IF;! P' n4 C4 P4 Y, v' K
           END IF;  ]4 Y# V4 }7 H+ U5 J0 w
     END IF;
7 i6 c6 q/ N  @% w: a& K* ^% l: W    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    * }! s! T! Q1 J8 M' Z* e! M* I0 _
    END IF;
4 H5 r1 C- f$ w    CQ1<=CQ(3 DOWNTO 0);
# e& N. E( [) R/ G4 V& p    CQ2<=CQ(7 DOWNTO 4);
& D! ^/ d1 {& c8 {' u" ^# G2 B9 \    CQ3<=CQ(11 DOWNTO 8);( T' s+ [9 N& H# e2 n9 t7 K0 w+ c
  END PROCESS;
" W1 u8 P  k* o* L9 W  \  vEND ONE;- ?8 f! d! f9 z; D* d

/ V9 S7 F% ~) }: G程序二:0 C0 e. {0 R! _
LIBRARY IEEE;
  I. \3 T( L$ T7 R8 j) ~! ]& tUSE IEEE.STD_LOGIC_1164.ALL;% U/ U6 k5 w, r9 U: A5 Q/ M2 A
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
7 i1 M% R9 H3 `, s8 I' ?ENTITY KBJISHU IS1 L& U& B! `4 \5 {' y: K
/ Y1 e/ d: |8 R1 ~+ b
PORT (CLK,RST,EN,M: IN STD_LOGIC;

7 c# c7 J! q3 k8 ]' L1 V) o0 {
/ ^& d4 o: s2 ]/ a$ Z' ]8 HCQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
( I. N8 S) Z- r7 v+ w8 L; t* k
END ENTITY KBJISHU;
' v3 ^) k8 a- p# CARCHITECTURE ONE OF KBJISHU IS( s9 P6 y5 C5 }9 y/ c/ C# ]% v

* `7 M* E* w! a7 p  N. J8 VSIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
3 m" x- E/ p! ^- x
BEGIN
& F+ }; ]  T4 g2 }- F: T9 q1 Z+ t
" e/ a3 M! _+ l! P) cAIM<="000000100010" WHEN M='0' ELSE "000100001000";
. i; h5 `2 y0 O; x

( @4 d6 b) w; m- g) c5 ~! y5 D1 J$ H6 \$ P9 b6 q
PROCESS(CLK,RST,EN,M)

) v. x$ W- M0 k. @) h& O: x8 [9 P0 K
VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);
: j$ o5 U4 j' K0 }! a% b
, _* z! j' q+ B' b' e8 ^- y: l
BEGIN
7 C' s  u2 c0 m: ?4 Q" f  T% U
; A7 r0 x  i, X
IF RST='1' THEN CQ := (OTHERS =>'0');

$ n: }( z$ w5 x3 }% U  e! c7 g
7 K4 g3 z7 U( |; i! h* cELSIF0 b+ `& o7 i; H+ ]+ w* m$ F1 L$ n0 k
CLK'EVENT AND CLK='1' THEN
* M  l. V. i( c
' o# e9 `2 z) t
IF CQ < AIM THEN
: q& ~) f: l" S9 O3 o% B/ y2 _2 \
1 L, s8 T2 @; d3 `! H! f--
循环控制,在达到0-220-108范围内循环
, w8 b( [& b5 n( C/ t

/ D& T5 w- L: z" {& s  D& R2 h6 g# x/ V1 X
IF EN='1' THEN
6 h0 W. D0 ]0 c+ `7 s+ G

9 G+ q+ q# W; J" \2 G8 Q' C# |5 M# yIF CQ(3 DOWNTO 0) < 9
$ ]6 Q, u5 R& eTHEN CQ := CQ+1;

5 Q( j- }5 \: T. f& N' h7 ?% ^; K/ j* w  u
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;/ ^& {3 n* [0 j# \6 ~
; l% S) P, B. B9 k3 c' }
                                                        --后两位出现99,进行调整
. L& Q/ A6 ^* v. w" p  _* e7 E  D% {, g
ELSE CQ := CQ+7;
) i5 M: H  f- b, }% \* D& v--
个位出现9,进行调整
: [7 _/ O/ }3 C
/ r1 d4 |: h3 @$ E# Y7 n
END IF;

% |- @3 V1 Y( b" R/ n* l1 A& \! l5 ]8 F% B3 L' j
END IF;

$ R& N: P! t( ^5 F( b$ C# [, T+ m7 d
ELSE CQ := (OTHERS=>'0');
( U$ w7 F+ }/ _6 ^

) U" g, e  X# t4 pEND IF;

$ B  P/ D: U$ k- c' j# j3 Y) i9 I' q& @( `% h
END IF;

8 t2 _) R8 M( B9 j+ l # c  N8 D# t% v% c4 e( T$ o

9 e5 o( B: _9 W' U% ?) |6 _. i0 @$ t6 X/ Q+ c: m- z
CQ1<=CQ(3 DOWNTO 0);

; I" `* x1 G9 {9 S* S3 ^- N; N& A0 j" j; x  B* L$ X

4 _3 Q( L7 W. l4 S/ y9 x* oCQ2<=CQ(7 DOWNTO 4);
8 Z/ ^# \+ d$ A1 D  u
# ]+ h& i& y7 F6 D; J
CQ3<=CQ(11 DOWNTO 8);

& t0 l/ _/ Y- _5 s. A8 x; ^
$ R& J/ z9 ]1 k+ Y* A! w5 vEND PROCESS;
: E- G, }6 B- _7 H% v( T! {
END ONE;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
Keep Moving

1

主题

5

帖子

-8939

积分

未知游客(0)

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

1

主题

3

帖子

-8933

积分

未知游客(0)

积分
-8933
3#
 楼主| 发表于 2009-10-28 18:03 | 只看该作者
首先感谢你的热心指点,不过我现在用的是Quartus II软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
) L7 x6 J& R5 |9 C4 s1 @' b6 z如果有可能还望再次指教。
Keep Moving
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-6-3 19:32 , Processed in 0.055510 second(s), 32 queries , Gzip On.

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

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

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