找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

1

主题

3

帖子

-8933

积分

未知游客(0)

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

EDA365欢迎您!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑 4 M/ b6 w: C& j2 P) P

% g5 ~5 d! p0 g8 q下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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 X8 Y- u" Q6 {4 x' p. r5 a% m- p4 B
     另外附上程序二为可行的一个程序。
5 U5 [1 `6 y- |$ i     拜谢!: N/ N$ l, x9 z$ X+ F! @& G* C$ |9 `
程序一:! v& {" U4 L% }8 h" O2 ?& f8 s/ |
LIBRARY IEEE;
0 Q/ E/ h. s3 r9 gUSE IEEE.STD_LOGIC_1164.ALL;1 A! o3 t2 w. `: d8 `1 W9 ^
USE IEEE.STD_LOGIC_UNSIGNED.ALL;7 [1 S/ ]4 z+ g- }2 ^* A3 D
ENTITY KBJISHU IS
* m3 l% ~* Q$ {/ P1 H    PORT (CLK,RST,EN,M: IN STD_LOGIC;) S% j$ q% b2 E
          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
9 ?3 w  Q& l& Q! u# J$ oEND ENTITY KBJISHU;
3 y5 w# f2 f8 M6 Q% `4 ]ARCHITECTURE ONE OF KBJISHU IS8 f$ K- L( F4 D* l" f6 G
    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
" B& x, q* [) \4 }2 [) u' pBEGIN
/ T' v/ I+ B' {   AIM<="000000100011" WHEN M='0' ELSE "000100001001";    f0 A& U  ~& a1 e2 `1 ?* l
  PROCESS(CLK,RST,EN,M,AIM)
9 H+ k; \% n2 I$ t" R" D    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');: [  g% E) p) O( l
  BEGIN( X/ V* {' \) _- x6 W- ^
    IF RST='1' THEN CQ := (OTHERS =>'0');
& m( s0 J$ W6 x        ELSIF  CLK'EVENT AND CLK='1' THEN
/ ~4 a  E* S; L* S  S) F7 w           IF EN='1' THEN- c( V! f  |) O5 k& X
              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1;
  C0 E, X7 w* n% \! f& P4 E                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
% y0 F9 g9 ~: R- g  U                ELSE CQ := CQ+7;   --个位出现9,进行调整
; C% g7 C2 f: W9 {: q$ z) P7 a1 H  {              END IF;1 u/ D2 s0 e7 u* x, U
           END IF;* k5 q0 l6 _. E$ T% W
     END IF;
5 n/ V! w- _/ g    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    ! S8 E9 @. G9 J! E  h- {
    END IF;
- Q+ U: o- @# v8 i' V; \    CQ1<=CQ(3 DOWNTO 0);1 m; u8 D0 v% Z  q7 O
    CQ2<=CQ(7 DOWNTO 4);3 M% |$ R# r% w8 C
    CQ3<=CQ(11 DOWNTO 8);
0 j" U5 i1 t  w% H2 m7 p8 o  END PROCESS;
: ?! }/ V5 j, y. V6 T- i7 T0 y8 v3 [END ONE;
7 U& \4 [' K: q  }
' v& Y7 n5 m/ U4 m' v& W程序二:
7 x2 _5 k* V5 r4 ~8 L7 m! XLIBRARY IEEE;+ k5 D* \, Z6 a" `* i$ d; ~! U
USE IEEE.STD_LOGIC_1164.ALL;
2 |, R$ _% l& E2 p' AUSE IEEE.STD_LOGIC_UNSIGNED.ALL;( x! ^' ?1 ?( p$ [  {' R( H
ENTITY KBJISHU IS
6 F& u! T* \) D& K
1 X# M7 L7 x; T; _% zPORT (CLK,RST,EN,M: IN STD_LOGIC;
# F+ p$ B6 U$ g5 K% [. e3 ?
4 R- w$ }+ D4 o* S8 W) F
CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;

' o7 n) j, n8 n% k- vEND ENTITY KBJISHU;
$ _$ r' u7 }% s. V/ hARCHITECTURE ONE OF KBJISHU IS1 m, K# E. r& k: u! a1 F
/ a. W& V0 J. c
SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

' v! l/ C$ h' }+ S8 \6 Y: oBEGIN
3 j$ {/ F8 }& \+ S2 s' f* Y& j9 D+ h$ C& b0 d
AIM<="000000100010" WHEN M='0' ELSE "000100001000";
# z1 u: V7 i" J4 l1 [' M6 @
+ Z* J6 q/ q' N; Z" ^9 b/ ?' O; n

1 ?, J& P$ n8 d# F8 qPROCESS(CLK,RST,EN,M)
8 o! c) p7 X" ^- J6 E! j

! G7 F8 l+ f0 n1 L% s( ^( YVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);
) H: Y5 o+ |% ^. l: ~& ]
( e1 V' o  _3 o+ Q1 W8 C
BEGIN
1 v6 [- @8 S! [

. L. s& ?& v$ w4 k# I6 FIF RST='1' THEN CQ := (OTHERS =>'0');
/ B5 H+ b2 _9 z; ~* `3 [. r: F

* z3 c! q+ m* g8 L. h4 x  `ELSIF
3 x" E! p' o; e$ `3 s1 T( ]CLK'EVENT AND CLK='1' THEN

1 k. M( x, S; z& T6 x1 H) d( |# u- C6 e# L
IF CQ < AIM THEN8 u1 D% `) z7 i; E9 N4 B7 {

7 f/ l% I* F1 o4 K--
循环控制,在达到0-220-108范围内循环3 d! D! G& ]1 O& m1 I& h1 M' Y, Q+ f

! w' o/ l& E* I; @$ K5 h+ |
5 g( v( I" }! D# @. LIF EN='1' THEN
' m5 U9 @/ E* H1 U4 k7 Y  ]  @
0 I1 g. F5 L9 \- `. S
IF CQ(3 DOWNTO 0) < 9
* f6 K& G7 u, T' w; j1 s% }: F$ CTHEN CQ := CQ+1;

( u+ E7 |# a$ A. n' @# l/ Q
9 i& ]% J. E1 z/ C2 {+ ?3 `& rELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;
2 g+ K! l+ Z3 H0 u0 o

' o+ r8 m6 P2 h% n2 D: g( f# g                                                        --后两位出现99,进行调整  S; S5 k3 V+ [0 C
: B( _4 ^6 X  f4 F) J0 |, c
ELSE CQ := CQ+7;
4 Q% \' |( u0 |9 C: S, W--
个位出现9,进行调整
% l" ]$ ?# v( G' W2 S9 t; [

3 D8 R9 z2 k0 y6 QEND IF;
, R  c- j7 ]# Z( W9 ]: C  H2 A

! Y! v0 O6 _, eEND IF;
) H& g1 H5 {" Y! L( o5 K0 l

4 t6 i# G- {7 j) {% |! |ELSE CQ := (OTHERS=>'0');
. F6 T& Z0 {# {% ^" B

8 V8 l) J6 g' E. `+ d1 bEND IF;
0 Y! X% f" B+ C! l

2 O7 K  c% s0 S& `END IF;

! }4 W& |* m' h2 b* o
- i- r& O2 r2 P3 ?# R5 v1 y
# V% x( o+ q6 u5 m4 q- o0 v
. Q4 l1 b& w: R& f7 KCQ1<=CQ(3 DOWNTO 0);

) {( ?0 C8 Z$ r5 F6 \
, A) Y6 R; a6 T3 {5 }) c/ F' ]1 X5 l" [( K
CQ2<=CQ(7 DOWNTO 4);

! v, C, J' N# U6 j  V  U! }. v! r8 p7 x
CQ3<=CQ(11 DOWNTO 8);
2 o% q/ F7 e2 l0 R

7 `* \) U) Z0 T5 uEND PROCESS;

, \9 ?0 P0 k# ]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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
4 [; ^/ H5 u7 i1 H  n如果有可能还望再次指教。
Keep Moving
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-5-26 05:40 , Processed in 0.055529 second(s), 32 queries , Gzip On.

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

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

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