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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 主儿乞 于 2009-10-28 18:00 编辑   c) E$ a1 D% M$ q) k

3 n2 i' ?3 n; U+ }! t6 X3 Y5 o下面程序一是一个模可变计数器的程序,可以实现模可变计数功能,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的了,百思不得其解,敬请高手赐教,为什么会变成这个样子。  
4 ?5 b) Q" g8 d     另外附上程序二为可行的一个程序。
. d, {/ y% F) r( f     拜谢!
! |: @! {& S& o0 Q! g程序一:5 t& o: _7 `' j& C
LIBRARY IEEE;
% p3 t! ]/ z' C! T8 CUSE IEEE.STD_LOGIC_1164.ALL;$ Z. q0 ^3 c4 b# t; g% r0 m
USE IEEE.STD_LOGIC_UNSIGNED.ALL;3 m7 H& a) U1 U, B5 s
ENTITY KBJISHU IS6 P6 ]/ @- L- i2 C. l
    PORT (CLK,RST,EN,M: IN STD_LOGIC;  I7 ?+ ~8 W3 a7 t
          CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;, S3 |( z/ P1 v0 N) o" q
END ENTITY KBJISHU;
) R  d( [( ^3 S! J! o  v- Y5 ^5 ZARCHITECTURE ONE OF KBJISHU IS
8 E: q6 v# k8 S- H( g9 z# u    SIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);
# ~( a1 j- _0 v# C1 D, HBEGIN) E/ C! o/ [( l1 \  f2 Q# F
   AIM<="000000100011" WHEN M='0' ELSE "000100001001";  . q1 h+ {$ ^' K2 u. [
  PROCESS(CLK,RST,EN,M,AIM)" V" a, }/ y* @8 S, @8 O- k9 h
    VARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0):= (OTHERS=>'0');: q7 z2 O* S% Y0 ]1 i- b
  BEGIN
! _  ?9 i- d% z    IF RST='1' THEN CQ := (OTHERS =>'0');, _, r5 F: J! T! A0 K
        ELSIF  CLK'EVENT AND CLK='1' THEN
! n  {, S8 O+ ^           IF EN='1' THEN9 y' Q" [3 |& n1 ^) H4 s
              IF CQ(3 DOWNTO 0) < 9  THEN CQ := CQ+1; " ?  m7 T6 Y) Z& i. H
                ELSIF CQ(7 DOWNTO 4)=9 THEN CQ := CQ+103;  --后两位出现99,进行调整( T* z" @/ N& F4 i3 j: G5 q! R
                ELSE CQ := CQ+7;   --个位出现9,进行调整
. c9 |8 U4 Q$ k; p# ~; x              END IF;
9 u) s- N  |7 @. R& {           END IF;
( C* C6 ^( o: {: u  g     END IF;+ ^6 }  C9 C; e4 t9 t
    IF CQ=AIM  THEN CQ := (OTHERS=>'0'); --循环控制,在达到23或109时清零输出    & g4 _7 `3 S8 e9 b/ C0 u4 `
    END IF;# I& {, ?- E1 L1 T3 ~
    CQ1<=CQ(3 DOWNTO 0);
4 l8 H4 B! X& I8 q    CQ2<=CQ(7 DOWNTO 4);
+ M- i1 N* J, e0 W    CQ3<=CQ(11 DOWNTO 8);/ ], j/ R: ?% U( O1 J5 b! E  m5 F
  END PROCESS;
$ K, h! I2 V; F3 iEND ONE;
% ~1 L# ?& i% f/ N. U
9 s% _0 w. u# D& W) b/ g& Y程序二:
! |& p8 W+ ^6 g' d; b8 h( a4 rLIBRARY IEEE;
; f0 y0 \' j2 C6 l: ~" G6 lUSE IEEE.STD_LOGIC_1164.ALL;
7 |" O9 R- Y# j# X# H; l9 ZUSE IEEE.STD_LOGIC_UNSIGNED.ALL;
8 E) c2 N" d* J. Z1 S% t7 @ENTITY KBJISHU IS% j/ O/ l' P8 C/ P9 @

3 Z+ k& n( ?) X' w8 ^# o0 iPORT (CLK,RST,EN,M: IN STD_LOGIC;
: w6 J# f: d! k& \

) ^; o  p( ]6 F* b& @CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
! b& R; w$ J3 y/ [
END ENTITY KBJISHU;4 O# B: U3 W1 A) j" b8 t
ARCHITECTURE ONE OF KBJISHU IS
: _& t8 E$ {  t( F4 L6 L# }
3 V- ?' s7 d7 q  O5 u0 b; ?  S+ MSIGNAL AIM : STD_LOGIC_VECTOR(11 DOWNTO 0);

. A$ I; q3 _' i( m" L' |( OBEGIN! n! r* e4 x( d( E

' |. y" ~0 d4 F. i# s3 OAIM<="000000100010" WHEN M='0' ELSE "000100001000";
! n2 K7 ?  R9 y' K0 \  E2 V6 n
6 I2 z" p7 @. Q7 y+ Y
5 T; o6 a* V8 q0 r
PROCESS(CLK,RST,EN,M)
+ D; Z9 M- b- U( ]8 T

, a% Z$ \1 K3 T: `* NVARIABLE CQ: STD_LOGIC_VECTOR(11 DOWNTO 0);

) u% k  j8 g; \9 W1 ~; u/ L1 q  N$ H) D; H$ c" F3 i
BEGIN

+ c) ~6 D6 N# V. N/ E1 Y" N6 w3 q9 S" w: i- D9 m6 K7 l, T
IF RST='1' THEN CQ := (OTHERS =>'0');

, ~! t* |4 Y# R5 g$ S. h( R! A# F8 I4 _$ }5 M( @2 ~
ELSIF, L1 r+ `  Z! a  N4 u0 c
CLK'EVENT AND CLK='1' THEN

8 }$ |; E; W) i- k; H" A: v& C* D! m$ k- K3 c0 W0 z1 r
IF CQ < AIM THEN
, a: D  X$ V) \9 F2 G1 d
7 m3 f- q' W8 D7 f  a--
循环控制,在达到0-220-108范围内循环
  u# j# j8 l# {6 q
* g, L  K( ?+ Z$ S6 Q5 r

; i3 R' S8 \  W5 J& EIF EN='1' THEN

$ r4 y; u; l8 I1 Q2 A
. L* N5 J/ U$ [# Y, rIF CQ(3 DOWNTO 0) < 9: W: j2 ?' m6 n8 P5 v8 n" W+ A9 h
THEN CQ := CQ+1;

3 \( @9 l: \% h) O( g+ @0 a! Y! H6 `9 K# r0 ?1 E. j
ELSIF CQ(7 DOWNTO 4) = 9 THEN CQ := CQ+103;( O' H1 V/ ?, n; q4 Q1 V3 E+ d4 R
8 y  [! D$ g$ p/ s6 Z7 ^# j2 s0 l3 f
                                                        --后两位出现99,进行调整2 }. b( Z6 k; I% N: b* o4 ]% j
- \: h9 W$ s/ y3 S: M
ELSE CQ := CQ+7;
8 I$ o  b% |8 i1 K3 z- b* E, i--
个位出现9,进行调整

; @  \7 r7 p% N7 \% l; V$ P8 }, F9 M! f7 Q( ^- z
END IF;
3 q0 x, z+ }+ l3 B  b! p0 f
/ R/ O) X8 P- G
END IF;
: S: C, |8 i0 x5 k8 s5 `
" T9 ~- Z. J' K/ [
ELSE CQ := (OTHERS=>'0');
2 F" u3 o2 f/ u/ S  j2 p; x

( l: v0 M; B0 D2 l9 x7 PEND IF;

- C" @  a  E' T, \5 ^- g' m
4 Y0 a1 z8 `; X& VEND IF;

+ A: m) {. X0 W$ Y' h$ K- I 9 v: u0 H9 \6 I% R

0 u- u# w( t6 s
' j; T& @+ q1 I$ ?CQ1<=CQ(3 DOWNTO 0);
+ f6 U1 s. N0 N

8 Q  X" u8 w0 D& m: m+ g: L# f
9 v1 z2 k" h$ s' ^# k1 u+ GCQ2<=CQ(7 DOWNTO 4);
9 M& A& q2 ]4 ]( p+ J! q3 |. t( b

% D' ~! J5 @& b6 yCQ3<=CQ(11 DOWNTO 8);

3 V- h8 L7 ^. K; R1 Z& m) D0 h* ^
6 L8 W7 |4 N9 }1 hEND PROCESS;
- z0 D' i# d% L6 Z
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软件,而且关键是问为什么我的那个改法会出现模值改变了的问题。+ O2 I& x% m" @- a1 @; f
如果有可能还望再次指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 12:32 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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