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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑 ' f# X3 t: h$ K. U4 M2 H' M
2 Q' |; ]! C" |2 f3 S/ V
下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  
  u* w6 d8 |3 f: I6 w" Q     另外附上程序二为可行的一个程序。9 P% D7 ~9 Y! y; q& g! C: O
     拜谢!
' I$ R8 O/ u% w" q; z" ]程序一:
% A1 z  j5 C# r: h$ {* v2 HLIBRARY IEEE;
6 @7 K% j4 K0 l' N1 S' }5 QUSE IEEE.STD_LOGIC_1164.ALL;# w& G: o5 r) b
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
# E; d$ l& f: i" P! KENTITY KBJISHU IS
# K9 z3 Z* S, F. s8 C    PORT (CLK,RST,EN,M: IN STD_LOGIC;
$ _* E: d; c- u' E  G4 x$ Z6 I/ e          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
4 c# y/ N1 t9 t: R: EEND ENTITY KBJISHU;
# N1 n7 D, y' I+ I$ O5 I, RARCHITECTURE ONE OF KBJISHU IS: _( L; `0 \! A" t* ~2 {
    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);. q7 h/ B* S9 K
BEGIN
: i5 o* b4 `0 `   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  ; c  k" z# o- n; \% z
  PROCESS(CLK,RST,EN,M,AIM)- h1 K, p& y! q" l" p) b1 j% Q
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');
* y# T" k7 |2 i  BEGIN
- f( |: P/ S0 G4 K% s* d& c    IF RST='1' THEN CQ := (OTHERS =>'0');
: f5 I- {0 t9 ?2 O, {/ C        ELSIF  CLK'EVENT AND CLK='1' THEN
3 q# Q: Y) r2 w. h$ p- g           IF EN='1' THEN
7 ?4 W& _! O9 O4 J( i              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1;
3 ?+ e4 p5 j* |( }; H% P                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
2 r5 }. Q- b6 w                ELSE CQ := CQ+7;   --个位出现9,进行调整
, N7 \5 Z5 H4 f, i              END IF;4 c0 y- ]/ ], ?4 `7 D/ @$ ^* o8 s
           END IF;
" _/ [+ ~2 K' A; O0 X3 ^% s     END IF;
2 C8 R, z$ E! F: j1 X  O1 R; n' n    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    + t( u# w) P  x+ ?
    END IF;! Z, w* d/ f+ T3 C. N
    CQ1<=CQ(3 DOWNTO 0);4 z/ b- L! G& u" ?5 L
    CQ2<=CQ(7 DOWNTO 4);; a' n3 |% q0 L# r6 G2 H+ z
    CQ3<=CQ(11 DOWNTO 8);, w( y% j4 h) A$ F
  END PROCESS;
# C7 v+ K, x1 S0 K1 m6 QEND ONE;: t; w* R+ m1 |, m( Y

+ t( J+ N& G  h, f6 V- x' [' k程序二:) p5 Q# ~: b  z. t' K) r
LIBRARY IEEE;
4 P1 H) v$ s/ t- ]4 B6 p. [USE IEEE.STD_LOGIC_1164.ALL;( I/ \7 B( {' B; o
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
2 e2 [6 p  r3 t0 `1 Q3 UENTITY KBJISHU IS" l# R9 R5 D! A

* y4 E  V/ w$ @PORT (CLK,RST,EN,M: IN STD_LOGIC;

( q# u. L( u" A0 `. `2 I6 D! r- T/ J: ^* L  O
CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
9 L5 p6 d- \- Y" b! U
END ENTITY KBJISHU;
. o2 m" d8 k. e$ @/ }  FARCHITECTURE ONE OF KBJISHU IS
9 e9 C3 c6 _8 n+ L% H' Y
: p) o) k1 s; v, Z# l- y* A+ ?1 \8 wSIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

# w. X! y5 ?$ }9 H" i( TBEGIN- ?) O( ?/ w" e0 H6 m3 @+ a$ p# d0 T

. E; P. n+ k1 B+ P+ @& gAIM<="000000100010" WHEN M='0' ELSE "000100001000";
# b/ E0 R; i9 U( G+ X
$ L1 Q- a% G$ `% X7 w* @- ?& Z1 J  k' N" G

' ]9 Y; M2 U7 UPROCESS(CLK,RST,EN,M)
. x( P: Y3 }  ]5 L' j& K

+ L8 F) k# _3 N1 N9 K6 U7 i* B; TVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

" i2 P3 d; v9 x1 X+ t7 x5 a# C' o5 b3 X/ H, N; u9 W$ ^8 \6 L8 N
BEGIN

$ b' G' z+ r# n0 l+ G9 S, S$ g* x: f6 {
IF RST='1' THEN CQ := (OTHERS =>'0');
, {+ [. c! }5 H8 a7 e
& u) K# \2 t2 r6 z' n
ELSIF/ {0 ^# l# `4 J3 g
CLK'EVENT AND CLK='1' THEN
( G3 J9 C' W- [) z+ g
3 ]/ @$ J0 X4 \/ X6 p" n
IF CQ < AIM THEN/ g' _  k. f, d/ t: a) h1 G2 u

$ \6 O% ^$ L8 A9 C- n! M2 ]' F' i' _--
循环控制,在达到0-220-108范围内循环
5 k7 g8 \- u7 ?/ U

: T7 t; F, I4 F) M) c  ^0 `# D# K; }+ u7 _
IF EN='1' THEN
4 l% I. s" e$ a# X; e
! B  v" j9 f! T( G7 O
IF CQ(3 DOWNTO 0) < 9
+ I( ~1 B9 Z/ x3 hTHEN CQ := CQ+1;
3 ]8 N" ?6 r* `5 q' A# U; o' C  j
: R/ n; [% |5 X$ ^4 X) M3 u
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;
3 [. k6 ?- ?( p+ O; n. Y4 ~

6 J# M, v% g) H/ |0 G. P7 J5 F/ Z                                                        --后两位出现99,进行调整
. _# [  V6 a& d: r6 k0 P0 Y8 O" a, t( B0 `8 A4 j5 M1 G* w
ELSE CQ := CQ+7;+ H  w, u8 |) T! ?+ z# Q
--
个位出现9,进行调整
' E) L3 s# O, i" n# g
0 e+ V# K) u9 _( @" B  f" Z
END IF;

, q; a5 l& ]; f) L
6 V2 \7 }7 l2 |; s( J: hEND IF;
7 j0 `% |( Q2 ]/ I7 _: V

1 c9 h, y! @4 P( v3 uELSE CQ := (OTHERS=>'0');
5 [6 u/ i. R5 K
' A) M9 N  V+ U
END IF;

: b  ]3 C/ ^: O7 {. F  o/ x/ {% z& l0 e  `+ R7 p
END IF;
. Y; P  W2 Z: k) r& o+ C. U

1 A! |0 N, x3 R. b: ]/ B* R6 b' E  l" U. a: M2 T( r
+ V- E! `/ z; X& Y
CQ1<=CQ(3 DOWNTO 0);
8 ^, L6 |3 i' f$ h. Z
* p1 v5 _4 @0 d
8 j) q8 C7 P( D/ L' O
CQ2<=CQ(7 DOWNTO 4);
8 l" n; a0 f  [! X" q
( T- W5 Z. z& X/ Y
CQ3<=CQ(11 DOWNTO 8);

7 b. E* a' N  }( y, A  |  ]& T0 R0 [! R  P6 k- A
END PROCESS;
! D, S) a  a  w; t9 {
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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。6 F$ l: E2 I  N, h( C
如果有可能还望再次指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 23:46 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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