找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

1

主题

3

帖子

-8933

积分

未知游客(0)

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

EDA365欢迎您!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑
; [: C& K6 h. x- `; O! H7 o1 w( |/ T5 |9 a+ s% K# _
下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  
6 [. s+ x6 @: v, F8 }     另外附上程序二为可行的一个程序。; y/ e; k3 w3 u2 t0 n5 p+ f
     拜谢!
7 g! N. C* M1 _% T6 j& q2 e程序一:
2 r5 P# Q& e# \/ q) \% CLIBRARY IEEE;' @- D8 J* i. C- M, n4 Y' z2 x% z
USE IEEE.STD_LOGIC_1164.ALL;
9 r) C# R$ T: kUSE IEEE.STD_LOGIC_UNSIGNED.ALL;
+ g0 ~  k, H: p/ c- }5 b. o! vENTITY KBJISHU IS
7 ]& A" v0 O. c1 G$ m    PORT (CLK,RST,EN,M: IN STD_LOGIC;1 w& Q, ^( I2 ^( M& m2 e
          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
" e  c* ]; I- T6 tEND ENTITY KBJISHU;
- B/ E( u: q( o' Z0 s- c/ `ARCHITECTURE ONE OF KBJISHU IS
) u  S' W% x9 y* h8 Z% i  e: W! E: O    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);& ~& [+ l  R" E' y- i" U
BEGIN) a2 d5 e$ }' p  |0 ~/ }
   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  
" b( p: D( t: r: {$ O% Z  PROCESS(CLK,RST,EN,M,AIM)/ Z: e) H! }9 v* v3 D3 m$ Y) I  o
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');$ m' _5 t% N: h( s
  BEGIN# F9 j) o  V) \* F
    IF RST='1' THEN CQ := (OTHERS =>'0');
/ Q$ p2 V0 z) a5 D0 g        ELSIF  CLK'EVENT AND CLK='1' THEN
. U1 n7 H2 [. D+ I( f5 v3 X           IF EN='1' THEN; H; f4 Y% p* s
              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1;
' C  w" T; E% E                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
% T, S5 ]" ]  O5 o8 ~                ELSE CQ := CQ+7;   --个位出现9,进行调整
% @7 k) Q" o5 F: }2 [              END IF;1 X% Q. w1 r. v: L" }9 ~2 Q
           END IF;
3 K: @9 [; v/ f     END IF;! @& z1 G. H5 o# `, c2 H+ c
    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出   
/ B7 G& k" ~$ m0 p" l$ C; k! h: P; q    END IF;7 L6 T$ _- Z; X) U% ?  K/ d
    CQ1<=CQ(3 DOWNTO 0);" i" j2 Q4 q5 ?" D
    CQ2<=CQ(7 DOWNTO 4);# Z( O* ]: {& A* f
    CQ3<=CQ(11 DOWNTO 8);
1 p; }2 c  O2 {- p, x  END PROCESS;
2 p; H" C- K- mEND ONE;! P% D7 E; D; L4 c- W# Y! [; B
! k1 U# e# K1 y# \
程序二:! N$ b3 w9 l" R9 n( j
LIBRARY IEEE;$ P, R, S$ V, M% V$ @
USE IEEE.STD_LOGIC_1164.ALL;# F/ |) K+ Q9 I: C8 l+ Z/ [
USE IEEE.STD_LOGIC_UNSIGNED.ALL;! V  p7 j4 v( \2 F8 R1 S7 H
ENTITY KBJISHU IS
4 ?  F( x+ o- B1 V4 ?  w
8 s, {6 \+ I0 O, wPORT (CLK,RST,EN,M: IN STD_LOGIC;

4 V$ [( N  |7 x3 l, y* w8 Z  P5 o$ y
CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
  k& U8 t$ S1 o6 ?9 `( G5 `
END ENTITY KBJISHU;  T. G) }# F6 T) G# l5 a
ARCHITECTURE ONE OF KBJISHU IS$ X6 p: L- u8 R  ]4 C

4 b1 y* w! L9 bSIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

+ A, [6 X* X, ^" V- I0 j. Z6 b0 UBEGIN& z1 X. ~2 `$ N# v5 {

5 P# f2 o* ?# Y- M/ y' uAIM<="000000100010" WHEN M='0' ELSE "000100001000";
" e9 e: |$ y/ O% t8 M" [
1 F4 f  C( D9 F# ^' N" w/ b
9 q& p5 V5 L: c- _3 Z
PROCESS(CLK,RST,EN,M)
/ Y" ?. }5 s' D; U4 n6 a# H

5 u# m4 E) i  {1 `# C; UVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

& ^4 u* H, h8 X" Y0 ]
, M) v6 Q9 i4 c- E( X/ a* j( zBEGIN
0 h/ W, }4 {6 ?: N
5 O- G5 j! X* V
IF RST='1' THEN CQ := (OTHERS =>'0');

" e- b7 P  o0 e7 R2 J9 B4 ]
! [: D/ z- w7 p* L1 @. sELSIF' Z; K% w' ]1 }2 D
CLK'EVENT AND CLK='1' THEN
3 v* o' R9 ~- T3 J2 x. V8 R: H
9 ]7 ?8 }) j" O
IF CQ < AIM THEN  b5 u* I3 o6 b+ @

) b4 Y2 v6 m6 O6 d--
循环控制,在达到0-220-108范围内循环* o# V9 c7 l( b' I, O1 p

6 \8 l( o! ^1 E8 t% s7 c. C7 K2 d; }2 h) I- _0 m
IF EN='1' THEN
5 W, P& V) H4 `/ a0 a& |

0 ~$ c: P) G1 c  UIF CQ(3 DOWNTO 0) < 9! M; u! }0 e3 p$ K% s* B
THEN CQ := CQ+1;
2 F0 V/ E( E6 q$ S5 x6 _
6 V! N2 \( Z' V
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;4 R% r6 x) M8 A( I- u' E6 k( L

- l: t1 T9 N. e; J# d. b( x                                                        --后两位出现99,进行调整
/ B+ |' K5 A. c4 \; B7 ~# c' i0 P6 [5 e/ D- |' T3 P
ELSE CQ := CQ+7;
" K) s  _  b6 Y9 z--
个位出现9,进行调整
7 Z1 j# G6 v. l# {7 p
1 E! \; t1 E, ~6 a
END IF;
* \( D- S) I$ K3 a( d

* O; {) w0 P0 kEND IF;
/ @& H* z- @+ J- ?) \* D  C3 u( n

3 |- F+ ]$ Q, x( ~- OELSE CQ := (OTHERS=>'0');

- {. G2 ?' Q: f# j, @; o! D
/ K6 t* {) P2 R9 s7 d, t" Y  cEND IF;
* H1 ~2 B- L' [; l1 ?7 a

$ N6 N2 j2 d8 [0 G; y' [, zEND IF;
5 c: _4 x( w! L. }7 u# M! O

  O: r5 I+ \! K8 V9 m9 [% G4 |& X6 Q9 l9 W2 s, E. @

9 R4 H. s! y& f' ^$ }CQ1<=CQ(3 DOWNTO 0);
6 C0 i3 p6 z: e# Y; r: x
3 I! p: @9 H; x; F3 w

/ f1 n% W! }/ jCQ2<=CQ(7 DOWNTO 4);

( I$ x1 ^! H6 f+ U/ T5 r, u" t9 W4 O8 `; E( s7 f* ]
CQ3<=CQ(11 DOWNTO 8);

+ a# H" w+ s% j4 d/ E
% H9 C( V8 f" qEND PROCESS;

! x# y, T  i2 c. MEND 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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
. `. }# O2 u: |! a2 X如果有可能还望再次指教。
Keep Moving
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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