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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑
7 }  s/ Z! Q  z; z
& t; M, J1 l! W% D6 Y! K, J+ x下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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 O) ]" l7 m5 `7 Z3 h2 j
     另外附上程序二为可行的一个程序。
4 i" Y( q' K, |+ N3 P' N* w     拜谢!  F0 }0 l  q( F! z- f
程序一:4 Q6 k; a9 \8 y& [/ m' o* Y0 X
LIBRARY IEEE;/ c7 W0 m& M) V' Y3 V( }7 s& I$ \
USE IEEE.STD_LOGIC_1164.ALL;
! c- C: O. a3 U/ v  ?USE IEEE.STD_LOGIC_UNSIGNED.ALL;. ?- v: d, u$ n8 C; n! w
ENTITY KBJISHU IS
7 L" m& j, T6 |, i5 s+ d3 T  Y    PORT (CLK,RST,EN,M: IN STD_LOGIC;
& y2 j1 ]# I+ Z* ]1 u. r" F) @$ J7 e          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
- d+ A: ]1 e4 {END ENTITY KBJISHU;/ r- X5 A" e+ q4 c! z4 T& g+ ?
ARCHITECTURE ONE OF KBJISHU IS  y0 s, N* q' z3 u/ l6 [
    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
; S: Y2 p: u% ~4 ^: OBEGIN9 _( W+ \% c" a
   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  
# ?! b6 o, G" y6 T. A/ E  PROCESS(CLK,RST,EN,M,AIM)8 G* r  o* ]" t" p! p
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');
5 P  I- ~  k  x  E( a9 }  BEGIN6 _8 Q+ I1 g/ V: s8 u1 ]
    IF RST='1' THEN CQ := (OTHERS =>'0');
. |3 r- x% S/ M) K: t! n9 U        ELSIF  CLK'EVENT AND CLK='1' THEN1 f9 h3 A. Z7 y
           IF EN='1' THEN& e; F% G- j# W* p" c2 p% p) K
              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1; * y' O8 ~% Q( g+ Q
                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整
$ x$ C/ l9 J0 |. x- J4 d! T                ELSE CQ := CQ+7;   --个位出现9,进行调整
5 M, X; a6 k( w) m' G# L: b+ `              END IF;0 K# Q& z* A6 K+ t+ {) }7 o) y& @
           END IF;& l$ N, q4 f& i9 J+ |
     END IF;
) ?0 d& d6 u- O0 x5 [: B' N: C& Y    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    8 y* S. @9 Z0 X; m* h' F
    END IF;
) |/ |4 d& ^. U) v/ @, g    CQ1<=CQ(3 DOWNTO 0);
  y( K( N  X, Q. \+ u    CQ2<=CQ(7 DOWNTO 4);
, I& ~2 v& ~3 I6 W# M% Y& e    CQ3<=CQ(11 DOWNTO 8);
5 C& R+ a8 X( g  END PROCESS;6 `/ w' s+ `: X. \. m8 I8 K
END ONE;
1 t# T7 ?9 C+ v( W' ?3 g0 U
3 e5 k8 N/ e9 u程序二:
. F6 W/ d0 ]. t/ j% k6 {% c3 w- qLIBRARY IEEE;
  c+ L8 h( Z6 a+ r; E8 lUSE IEEE.STD_LOGIC_1164.ALL;
( I9 R9 H2 K. NUSE IEEE.STD_LOGIC_UNSIGNED.ALL;6 q2 C% R8 u! Z8 w: _2 E
ENTITY KBJISHU IS
6 y( R# m( m2 ?5 E: F
9 k0 L, A! Y: R: m: X! tPORT (CLK,RST,EN,M: IN STD_LOGIC;
8 s! E0 r. a+ f- ?( F

2 g! I7 p! o; n+ @/ ]4 C/ QCQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
$ w' }/ K- N* u8 c; S0 ]
END ENTITY KBJISHU;7 D- p' U* _6 Q) f1 L1 Y
ARCHITECTURE ONE OF KBJISHU IS* p/ W* [9 S7 P

; a" g3 o8 h: D* s; _SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

5 x4 Y- u3 P8 D7 l& YBEGIN
& X+ m, A9 |$ q
+ l6 b6 b: q5 N" c9 xAIM<="000000100010" WHEN M='0' ELSE "000100001000";+ g3 D% x4 d, f7 o3 t

/ G* ~: _; n& t" V8 D- W7 F8 }3 X
, O7 y0 Z7 g3 g# ZPROCESS(CLK,RST,EN,M)
- Z/ i# O8 [0 s; Y' I) t( ?
4 E! @6 Q2 z, {4 m& f1 L
VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);
/ ]2 c! Z4 D8 X9 o  S' X0 F9 _
& Q0 U: x; {* u; L8 ^4 N. W9 c5 C  w
BEGIN
7 P1 p' u, I( F9 F; G8 k
3 [  B; O! c# W  G: L
IF RST='1' THEN CQ := (OTHERS =>'0');

2 V7 f. ^0 Y1 m
5 |. ^  M0 ]1 VELSIF- _) j3 S9 x1 F4 Z
CLK'EVENT AND CLK='1' THEN
' T; m) V5 I* K3 l) j) K8 N  o

5 ]: a8 H  H3 k( m+ x3 L5 HIF CQ < AIM THEN
$ Y6 l- ?; u2 G2 d& Z; ^/ z) B  ]
--
循环控制,在达到0-220-108范围内循环
, @" P' F. g' j& r6 C
" w9 W8 C! j5 I% P. ]

+ Q/ u1 `9 q: V* I8 K6 S; jIF EN='1' THEN
7 C6 k& u" f# H7 g" q
- F1 P5 Y8 M5 `/ m/ ?7 Z
IF CQ(3 DOWNTO 0) < 9  {4 Q' J! G2 h" E3 l6 x3 l
THEN CQ := CQ+1;

7 h1 K& [9 ?. ^4 ~6 T+ _5 B0 a, ^5 \" T3 b3 R- |: [
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;5 }% S4 u0 G+ h/ k4 }1 z  Y- H8 l5 E

3 d0 J; Q8 c: G. |2 e! c                                                        --后两位出现99,进行调整: q* a8 q; f" O3 ?6 T2 L# i

* Q2 J' [) y& r6 Z+ aELSE CQ := CQ+7;
( |9 E* V2 B% M! O; O3 u9 q--
个位出现9,进行调整
7 r5 g5 B" A/ }. d( D' |
# k. J; r/ `5 ?: k7 K, c' y5 e/ |
END IF;
! f. h9 n/ e9 X
8 ~( Q) ]# I! C6 G% i
END IF;

/ x1 l: y2 }) V; s+ c- d+ p! Q0 S/ f5 w# {& Q  ^8 [: Z
ELSE CQ := (OTHERS=>'0');
7 @1 i6 p! H& ^( x; r3 @8 w& L
7 Z  D7 U+ V3 t9 d' @
END IF;

& z* x: a6 Y2 q% z4 f6 G) M$ O* s
END IF;
) b$ s' V! J. W
' e& Q* [. }# n2 q

1 c+ O. z) n2 p2 U" N8 o+ l
! Z- ~( w  X8 M8 o5 HCQ1<=CQ(3 DOWNTO 0);
! p, p  O0 N, M1 Z, b7 s

. C* T# F3 `, `7 v* P6 w
/ R: j+ n, F' d" Y' W3 G+ lCQ2<=CQ(7 DOWNTO 4);

/ L' p# z' e" W) I+ i4 t/ N8 n6 w! c# }0 a3 I) G- Z4 U
CQ3<=CQ(11 DOWNTO 8);

* B- m8 \7 J2 f# [- P6 H9 D9 q0 R2 f  ?
END PROCESS;
3 r6 ?4 f, P: h4 X6 n- L6 P5 e
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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。
  `/ y, _7 z0 w3 Z如果有可能还望再次指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-28 18:40 , Processed in 0.140625 second(s), 25 queries , Gzip On.

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

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

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