|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
我在用Verilong代码做液晶显示时。有一个不能更新的寄存器数据类型的问题,现请教下各位大虾。
' [ g U: b) b3 x过程如下:我使用Data_Shift_Direction作为寄存器类型缓存区。初始时,将下面参数中Data_Static赋值给Data_Shift_Direction。然后根据pro_signal信号的变化将其他的参数赋值给Data_Shift_Direction。但是液晶第二行上总是显示“Mouse's silent”。并没有更新显示。然后我就加了一个测试信号test_signal。看外部模块数据变化时,Data_Shift_Direction有没有更新。结果发现测试信号test_signal随着pro_signal信号的变化而正确变化。这就证明Data_Shift_Direction中的数据应该也更新了。可是液晶上第二行还是显示“Mouse's silent”。即初始化时所赋的值。+ g* p8 J9 |6 r" N0 W
然后我想是不是时钟的问题。因为两段并行代码一个是48M的时钟,而另一个则是500Hz的时钟。但觉得这没有道理。因为pro_signal信号的变化我自己可以随时控制,让pro_signal信号变化就变化,不变化就不变化。只要pro_signal信号不变化的时候,那么Data_Shift_Direction的数据也不再变化。即使后面一段代码是500Hz触发的,也应该能够检测到Data_Shift_Direction里面的数据。不知道哪位大虾碰到过这种情况没。有的话,请一起来讨论讨论下吧。& b1 s& [0 [2 _0 ~ J
! m- y0 _9 e% f3 p! |
现把这部分代码粘贴如下:
/ @& F. ^. @. I. _4 Z! o6 [parameter Data_First = "This is an App", //液晶显示的第一行的数据, `! G4 [$ l% E/ R$ U/ q3 ^6 z
Data_R_U = "Shift Ri or Up", //液晶显示的第二行的数据# K" {: @. L6 N, f5 U% [! U# ^' N
Data_B_RB = "Shift Be or RB", `! X) w+ m- R5 u; F
Data_L_LU = "Shift L or LUp",# G( p7 N: P8 @( v2 K
Data_LB = "Shift Left_bel",
& P2 [3 ^' K6 N4 x4 C6 n Data_L_Button = "You Left click",' X. p B: z" s) f
Data_R_Button = "You Righ click",$ i6 g8 V, Q5 A' e$ K
Data_Static = "Mouse's silent";
; ?) V V- L k3 K* _8 Z, `; r7 [; L7 S; P) m2 }# ?
always@(posedge clk_48m or posedge rst)
' h: i$ t% Y D; Mbegin
6 b9 G, l4 I9 j# J if(rst)& t3 W0 m t4 x$ I
begin+ q& V! O$ n" o" `
Data_Shift_Direction <= Data_Static;% N* P7 I/ [7 z2 V% f2 P4 ], N; ^
test_signal <= 3'b000;
6 D6 M0 r, V V2 a) p. K: x end
3 K( Q3 o0 m. \ else# J- s z+ l* S2 e x+ [" ?
begin
/ ~/ Y0 Y+ Q! v8 y if(pro_signal == 4'b0001) //LED1 light/ V; Q: A$ S8 _" L+ j
begin
9 w( ~6 v9 s5 o8 }8 [: u! e Data_Shift_Direction <= Data_R_U;7 g( f+ G, q: {+ v" s
test_signal <= 3'b001;' H$ z- @7 ~6 {' h: {2 I* n; @
end
5 v. X* n: j; y3 ^# l/ l5 O else if(pro_signal == 4'b0010) //LED2 light
' _5 F2 j' [6 o begin
$ `7 Z3 U. ^& C1 { Data_Shift_Direction <= Data_L_Button;
( S" Z4 U, p' M+ E, I test_signal <= 3'b010;
. i. i4 S, ]3 B# x- m& A0 D3 z; b3 ` a end
& x' ?* u. x$ j" S( A) y, C3 A- C else if(pro_signal == 4'b0011) . b$ ^' a7 L& \1 r2 f/ D
begin
" C! t. i. J) v+ H* d Data_Shift_Direction <= Data_R_Button;
, O) f: H% C' f0 e$ V6 d test_signal <= 3'b011;; _0 x3 v) c2 E6 o
end' z- \* o0 G6 W: f4 K
else if(pro_signal == 4'b0100) //LED3 light4 q" Y D0 H& h6 X& M8 P' A
begin
: F# q# w0 R9 Y b Data_Shift_Direction <= Data_L_LU;
! |+ x- K9 \9 F$ V1 n% X test_signal <= 3'b100;, `" i8 Z/ W h% C8 P
end
% g, M+ c* o0 `9 b" C; L1 @, s- ? else if(pro_signal == 4'b0101) //LED4 light ]8 j; |9 \# p
begin# z, o: e( Z( ^- q4 Z5 O
Data_Shift_Direction <= Data_B_RB;& d# ?) d' w- F
test_signal <= 3'b101;# Z6 D7 z& L$ `+ s
end 0 d5 }% X( m% L* G: r; E8 L
else if(pro_signal == 4'b0110) //LED5 light
; I$ o$ E# X$ U W begin
2 n- y& c3 @- F+ s- M Data_Shift_Direction <= Data_LB;8 O, W6 x/ K. B9 ~
test_signal <= 3'b110;( L3 ]: u4 b8 i1 l4 H2 g1 J( S
end
+ P) Z8 |( F: J* X6 w# X
- }) I" B, F% g0 v0 T4 `6 S else
3 ]4 {7 t& u' E/ {& w begin' c) z* W7 W, n* m# |/ ^( D
Data_Shift_Direction <= Data_Static;
' |# k4 O: |* J1 M4 `" m test_signal <= 3'b000;
* z) H {" D4 z# O/ q* ~ end
( U+ s0 O. ^1 c4 V5 k! _% T0 k
; u2 g$ M& Y1 ]6 ?7 g, B) I3 h end
) T- V) H# Q, w. C8 G+ wend
8 G, @' I5 q) C- k! x% n, V6 v- p5 B& s2 Q
always @(posedge clk_500 or posedge rst)* `2 C8 e8 @7 S- }
begin
7 @9 j* M% W! z9 x3 ` if(rst)
/ o# X9 U* `( i5 H begin
7 M/ W. P: R8 Z% O: L" z" h RS <= 1'b0; //复位:RS=0时为写指令; 9 U( v' M4 s( h$ }6 Q+ E. d
DB8 <= 8'b0; //复位:使DB8总线输出全0 6 N1 H3 O/ f ?' n6 a; F
end
; F/ @! s7 r8 V* z8 ^% |7 S1 B else |# A. Z8 M# S* X
begin
' q8 @1 u8 m9 ?; E5 ^# H2 d9 g9 _ if(disp_count == 14) //disp_count等于14时表示第一行数据已写完& P% `+ k, c. t( g
begin
# I$ l# x# Z5 n" I3 E DB8 <= 8'b11000001; //送入写第二行的指令
! M6 Q* b; H# F: s: W1 i RS <= 1'b0;
t5 I: e0 d6 F1 v# V disp_count <= 4'b0; ! ]9 I. f% v' L' t4 I
Data_Sec_Buf <= Data_Shift_Direction;, x( }% B+ {8 z! I" g
state <= Write_Data_Sec;
* R) u6 l' z; }9 Y/ Y end
; m4 w. s0 N: t k1 P else" B# W! T' W- x) S
begin
4 L$ n3 X( `5 a3 h# u3 Z8 Z DB8 <= Data_Fir_Buf[111:104];/ P) F" Y2 P/ G O; W
Data_Fir_Buf <= (Data_Fir_Buf << 8);# S( t& \8 v8 W) e
RS <= 1'b1; //RS=1表示写数据
3 A6 y- X$ T. F1 ]- A disp_count <= disp_count + 1'b1;
; B6 y0 w- w" ]5 n& U5 a) {9 d state <= Write_Data_Fir; - e- R) T+ @" ?! Y' ]5 @# s
end
" I+ d1 ^' v5 u end
& q: R3 N% r4 R5 `, ]3 q. }2 Xend |
|