找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

1

主题

3

帖子

-8933

积分

未知游客(0)

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

EDA365欢迎您!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑 : t+ \  U4 j5 j5 s8 A

8 A2 Z! j; b- k8 b下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  7 C/ }( r" R/ ?0 }$ e2 K- b, m
     另外附上程序二为可行的一个程序。4 ]3 }4 I- ~* w
     拜谢!! _7 U+ Q1 `" x  K
程序一:
  j+ l/ u( j8 n7 iLIBRARY IEEE;
% |$ W: z" R% Q# bUSE IEEE.STD_LOGIC_1164.ALL;
, v" a1 u' S6 d) b- x8 R6 v& A. k8 `USE IEEE.STD_LOGIC_UNSIGNED.ALL;5 g4 q* C6 J& t/ I6 A  I
ENTITY KBJISHU IS
; l( Z# s2 `& e7 S+ W( T    PORT (CLK,RST,EN,M: IN STD_LOGIC;3 h4 s; m" }! B& Y0 T6 P/ p# F
          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
, K) w( {' t7 L% y4 \$ p- j% t6 GEND ENTITY KBJISHU;
: e0 o& K* ?, t1 K3 vARCHITECTURE ONE OF KBJISHU IS3 ?. l2 y% }' T8 s1 r0 Q9 y' _
    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);6 G# G0 |: r! I& h
BEGIN
6 n7 d' _. l0 b5 \; C+ q   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  
0 t! e$ m% U* |  PROCESS(CLK,RST,EN,M,AIM)
: a& j4 r# w- p5 v+ h6 _( M* ~! j) l    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');% x) ?9 Y5 b& Z# ]) q
  BEGIN
- ^+ {: @3 [* D/ h- J  P$ v' B. I    IF RST='1' THEN CQ := (OTHERS =>'0');- }% e: U  y5 t
        ELSIF  CLK'EVENT AND CLK='1' THEN$ _! [3 c# k3 @8 w! |
           IF EN='1' THEN2 t1 K! k: o% i% u  [
              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1; # n6 m# N& y) U- P1 a% H5 L
                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
9 b2 ~! _; _" y+ g                ELSE CQ := CQ+7;   --个位出现9,进行调整
1 g3 Y! i) F/ D3 a$ S* \) X7 W              END IF;
- G) c6 U. ?7 O  I% e" f           END IF;. L$ u+ \4 t/ l6 B+ x. d  `
     END IF;
) a# J5 y# ^  c5 }    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出   
+ u9 b# x& G" W    END IF;
5 G3 r+ z) r) `0 S    CQ1<=CQ(3 DOWNTO 0);
+ K9 a4 e( W3 H% t" N/ q) n: V    CQ2<=CQ(7 DOWNTO 4);9 K- K% f7 R# }8 X
    CQ3<=CQ(11 DOWNTO 8);+ ^% ]  V% r6 @
  END PROCESS;/ x5 `% N# @0 [* ^
END ONE;+ Q- t% F5 T7 O) q9 P

5 [. Y; U7 V  i* v1 X程序二:7 b& d2 g4 \8 m; e2 m2 a" W
LIBRARY IEEE;
" U8 l) r7 S9 D% BUSE IEEE.STD_LOGIC_1164.ALL;; p- c/ Q* g8 z0 j2 A
USE IEEE.STD_LOGIC_UNSIGNED.ALL;) z; N$ t( |7 e% [2 M  Z, S7 r
ENTITY KBJISHU IS
2 e1 p$ p# O: \. ~+ {2 |+ |0 B6 _2 x8 V0 q' R& P
PORT (CLK,RST,EN,M: IN STD_LOGIC;
9 s( T  |" X) @! {) D) w

) z2 m  @2 O( k/ ~CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
1 X1 q! U0 [1 a6 c; z( J2 k6 V
END ENTITY KBJISHU;
  ^0 x+ S" I% b* UARCHITECTURE ONE OF KBJISHU IS; ]$ U" s1 v$ h" ?) P, p) b
% Y6 H1 C1 R1 t6 [' y3 N2 A
SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
4 p0 ^& f) G" |; X8 D( f# ~1 Z
BEGIN( m! ~# q/ B' t3 l: y2 h
8 d/ B; n$ f, q+ n6 Y
AIM<="000000100010" WHEN M='0' ELSE "000100001000";
$ v9 c* h, ~2 ^( ~4 ^
- u9 c( E/ G) B, x4 n/ h

; h. w( I$ T; O/ T- s9 j6 _& SPROCESS(CLK,RST,EN,M)
, G' I: D: ^! j; T: x

! }8 F5 T! I5 H/ c# _) I1 B% `& dVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

) m2 r2 Y) o0 b! F  K% p1 ^7 f1 Y  l5 Y1 k! Y* m
BEGIN
6 d/ f* c8 U, T

# s1 Q: f) O2 iIF RST='1' THEN CQ := (OTHERS =>'0');

- K3 r. c" {. z0 ?# e
; k4 q7 }8 p) u+ B7 @  ?# b: }ELSIF
! d! u, o/ o5 h# ?2 }% LCLK'EVENT AND CLK='1' THEN
0 x# E3 s" @. n2 F, j

. A6 Z5 d) D, S* {! @IF CQ < AIM THEN2 f  J5 S* _) y$ i. Y
  @' V! u+ @) V/ p  a' M( J
--
循环控制,在达到0-220-108范围内循环: x$ `# v* `2 ^& ]) y

# A6 D& |% z! q8 l% @
0 B) a( U- H6 S8 j7 c' X9 rIF EN='1' THEN
1 L/ S0 O9 u. _8 u
# X9 J7 ^& z" U4 T0 ?& T! U% R
IF CQ(3 DOWNTO 0) < 9( G; G0 q' A7 `' P
THEN CQ := CQ+1;
2 \6 i3 w, o9 J9 E! A% r0 T9 k
! ]7 I. p, M" }
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;
- h( k! V/ u) x/ H: _8 [! Z" g7 }

4 `% V1 G* }$ Y6 Z# j                                                        --后两位出现99,进行调整7 Z9 I+ a/ k5 {* ]7 k  T

! F- `, t/ W* b' u+ P* R% r9 j" w" W) ]ELSE CQ := CQ+7;, g# k$ z6 F5 M
--
个位出现9,进行调整

/ [1 i/ n3 B) D7 z  F8 k( S
5 |5 G! B# @) r: rEND IF;
+ _7 h5 e3 w% ^2 C

7 d  D/ ~5 m/ }5 P$ C/ g2 |7 BEND IF;
) [  ~4 w$ z, O2 g9 n
; a8 r2 C  A& Z5 G9 v
ELSE CQ := (OTHERS=>'0');

, y0 z7 o/ m2 M; v" m/ P  e6 `$ g2 l( ]* g( x  C1 K' G& P) [( d( B. r
END IF;
3 \. X7 a; `! w% b

, a6 Z- b2 j' S1 W* TEND IF;
6 G) j0 p3 e) N) m# H4 l: y) h
$ M% V3 G! B) j( G! }" M6 Y3 w0 Z
: J) N5 P: n, k

- ~3 S* \( D+ o9 r% w$ R1 p- zCQ1<=CQ(3 DOWNTO 0);

, u: n* f9 j4 C/ S. a! I. l+ z
. }% |; K8 K# x9 c5 Q" D  t" [1 i- C$ ^* d5 J& j
CQ2<=CQ(7 DOWNTO 4);

6 t  x5 U$ c5 _% [3 x+ |
; E/ @% u* i) \: P" KCQ3<=CQ(11 DOWNTO 8);

5 S- c8 h/ V* {4 Q* X
/ z6 p3 \6 r: p: C8 X" `END PROCESS;

1 n7 W; V% W, q$ }. f8 f) n' T9 ~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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
  d* x4 S9 W7 X  u7 O0 @0 X如果有可能还望再次指教。
Keep Moving
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-22 23:30 , Processed in 0.090379 second(s), 33 queries , Gzip On.

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

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

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