|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) `% R! b2 Y8 P1 U8 @ B) g9 ]7 g* N: }! b9 {' M
& v* u3 \ A( K2 o0 H; B% a
1 A. g! @( K- T1 Z7 p
1、assign一般多用于组合逻辑,其后变量必须为wire类型;对于输入和输出变量,如不声明其类型,默认为wire类型。
0 p; A" v! |& R" |# [
& F2 t& T% Q+ g( {! E5 \8 l2、always多用于时序逻辑。
- B& g0 X- j/ T8 E- b) U0 t Z$ ]4 f2 g) ^. w; U
1 s' z6 O$ W' [: z) J# r2 y3 I( s% I8 e3 E! h
7 S) x ?# g- R; {+ a
3、modelsim仿真问题解决,见文档ModelSim相关。
* i) ]- {* k" b9 o2 V- ]) N4 M 网络真的很强大,modelsim问题都已解决,现在自己的问题及网上找的解决方法整理上传。1 O6 \8 c9 u# |. i
1 }$ |+ G e# b6 c! T4、testbench是一种验证的手段。首先,任何设计都是会有输入输出的。但是在软环境中没有激励输入,也不会对你设计的输出正确性进行评估。那么此时便有一种,模拟实际环境的输入激励和输出校验的一种“虚拟平台”的产生。在这个平台上你可以对你的设计从软件层面上进行分析和校验,这个就是testbench的含义。
& b& Z/ u: T' D8 I' [* _/ n
: ^. ~, m2 |. M! [5 Q% c5、Testbench三步走:
1 _- P& U! T- p- _/ @+ N' _+ d9 n a、对被测试设计的顶层接口进行例化;
' l4 ?, c( {3 G- c b、给被测试设计的输入接口添加激励;
8 z6 U: [) J Y) h; r c、判断被测试设计的输出响应是否满足设计要求。- v9 N! p# d. ?: k. R$ j6 x$ ?
8 A4 m: Y. }& |6、最简单的Testbench应包含:时钟激励、复位激励及其它激励。
) ?* ^$ f! a7 E' t- p
j9 E" A3 r: B7、最简单的Testbench例子(时钟的产生)7 _( Q2 G; M7 x( Y! l$ W! f# s
// 定义时钟周期为20ns,已定义“`timescal 1ns/1ps”; f/ q# n" C7 [, T0 r& E8 w
parameter PERIOD 20;
- q- m; I5 _; v* G3 Y" u
* Q" b& X. X$ }+ v initial9 @! h% y U' K1 x6 j3 P+ C
begin
, } z6 w1 p4 [, ~0 |; L0 C1 w clk = 0;
& e8 r: W6 F$ s8 e- S8 Q$ h, a& T forever
$ h! z9 @" k3 r+ n #(PERIOD/2) clk = ~clk;
5 u$ G& ^ B. w8 { end
, a" ?/ t3 g# z$ S8 g+ U7 [
# W0 J0 U+ C5 n9 v% y ? Q 同例子的不同实现方法(用always来实现)
. C& t& b4 `, i P* J, x* c3 ` parameter PERIOD 20;$ x4 W) a( Q: }
; K9 A. n7 ]! K' |" m
always begin
% m$ I4 C9 c1 h# b3 K$ i #(PERIOD/2) clk = 0;% Y1 o: N* a( L: @/ @2 f0 k/ K
#(PERIOD/2) clk = 1;
5 |1 t& |) E# [ end
0 ?6 {% B! \- }# E& n3 _' C3 n0 _$ l
3 d( h7 j6 L4 W/ T
5 q7 _+ R y [1 R5 X" V8、最简单的Testbench例子(复位信号的产生)
* c! X1 C7 a; P$ W // 已经定义`timescale 1ns/1ps4 B" ^# v% S9 q4 Z
initial
) D) P( w9 F6 E8 @/ o) c. V! { begin
0 T6 C8 q& ~) M4 c rst_n = 0;* Y: [; w9 u! O( x2 ~- F4 i. `( a7 b
#100; //延时100ns
; H1 \' ?; g7 X: G/ o rst_n = 1; //撤销复位
% ]$ X9 H9 S5 D2 E, g% _# M' w ......* p& Q9 E8 t: S
end
) o" p% r- ^( a! L8 G7 ~; m3 z
# L% Y! M* S$ h, X! ]5 r9、以任务的形式给出复位激励
& ?$ m6 I) m1 d: e# }! E initial0 b" _2 n$ `0 p2 o) Q6 L) g
begin: d" A K9 ]1 Y R
reset_task(100); // 复位100ns,已经定义 `timescale 1ns/1ps
% G# B- F+ R. w; n ........' [. N. S! p4 r8 d, Q* M
end
% N7 ] m' N% \9 N5 X, q3 K6 w2 d, @. P* e% E; J3 M9 n( }2 C) Z
task reset_task;! n0 U# j# _' u* C; U* `* {
input[15:0] reset_time; //定义复位时间
1 l0 W A. v: R. U( G# E+ i begin
$ W: A3 k1 `( h" _0 ]% F& h rst_n = 0;
; o9 ?' T a) f #reset_time; // 延时reset_time 时间
) r# L8 @: s+ m$ a/ C rst_n = 1;) C: \2 _3 `* ]0 d7 V' K# Z
........4 [2 n4 ?+ W I# |, m( q- m
end
6 W2 S+ b+ f5 M" u end task8 @* x' G* Y. Z) D! H" u
# v6 B% Z, F! ?1 P5 s! n: _
o! F7 E4 ]1 n) L9 ~
( k/ y5 p" U* |( W. P
# R& k# x" k9 q* A# Q/ G
, @) t t0 X5 Y- R" }/ b- y1、深入学习按键操作:1 o+ n% q' u' e$ N6 U. M* _ u1 A, T0 B
9 v; F* u. H# U5 P
2、解决一个警告,有时感觉学习好无头绪,其实像这样去解决一个个的警告也不为一种好的学习方法。, D' X) Z l& V9 ?2 h/ L3 j% s
警告:Found pins functioning as undefined clocks / ~! O" E, H% G b: M1 E5 y- q
解决方法,见附件
& ]5 U2 |5 z) t7 ?7 {% u _1 d8 I0 J. R5 s$ S/ c( k4 H
3、自己通过学习对 如何检测按键按下动作 的理解# y) h% P2 r3 B; W) D
定义寄存器(A,用到几个按键可对应定义几位),在每个时钟周期不断更新存放对应按键的状态值;在将该状态延时一个周期存放到另外一个定义的寄存器(B)中,然后进行以下操作:C = B & (~A);而得到的C状态可维持一个周期,在这个周期内可对其进行检测来判断是否有键按下。对以上所述用如下实例来加以说明:7 x1 g1 j6 f% c8 |( U$ O2 U$ ?" ~
A: 1 1 1 1 0 0 0 0
' r/ a. M3 D, j8 M. {7 j5 J; u. T~A: 0 0 0 0 1 1 1 16 r a& J4 U5 J! i' u
B: 1 1 1 1 0 0 0 0
2 g* M3 E; a; R- M" J) {6 p+ qC: 0 0 0 1 0 0 0" F# |0 T% o1 l9 h5 T7 k* v
从上可以看出:当A状态翻转时(只能从1到0),可通过C的值判断出来:一个下降沿的到来# e- _1 N5 l/ m/ j! G
?问题:只要有状态的变化,都能检测出来,即既能检测下降沿又能检测下降沿。(自己正在尝试中)6 Y5 w3 |; J0 T' o: t, d e
) h, X2 a/ M( H( x9 H5 S; a# D
程序实例:
1 b, [7 u; ?; s/ n; o//-------------------------------------------------------------
z7 y" v, e; B' A0 _2 }% E//说明:实现按键按下(只实现下降边沿)功能检测
' P6 J/ X a! S//-------------------------------------------------------------7 [) }9 Y3 a6 F
reg[3:0] sw_reg1; //存放键值状态
* S0 ?& y% l( k: }) K- palways @ (posedge clk or negedge rst_n)4 K4 O! D$ A" U* @- G
if (!rst_n) //异步复位
+ M# H( s6 K# R' Q sw_reg1 <= 4'b1111;
& z5 S3 {) }5 [7 I1 f. @. } else
7 P" B8 z; H5 M0 E7 I // 每一个时钟上升沿到来时,读取按键的值,并存入到定义的寄存器中
4 f4 D4 _2 i, q0 g+ H4 }& { sw_reg1 <= {sw1_n, sw2_n, sw3_n, sw4_n};
. v' A' |0 V$ m' C1 G5 y
2 p1 T& Q9 F9 P9 A q//延时一个时钟周期,存放键值状态
& z4 y5 a# Q5 y) {6 \' \reg[3:0] sw_reg2; % V- A& U/ B& W. `5 S- J
always @ (posedge clk or negedge rst_n)
# ^- J& j5 D& t+ u8 ^6 k% M! Q if (!rst_n)2 p0 e9 p( G; j% S
sw_reg2 <= 4'b1111;
0 ^8 M5 {+ R- q$ w" T else% {7 {( n- K6 O
sw_reg2 <= sw_reg1;) i2 T2 }& P8 B @
^7 A0 E8 i, r//当寄存器sw_reg1由1变为0时,sw_reg的值变为高,维持一个时钟周期
1 [: g4 d- H6 | a6 q& C/ A: M% owire[3:0] sw_reg = sw_reg2 & (~sw_reg1);+ i+ C" h. w2 g) F7 d9 m5 E
?. o, [7 m; Q+ h1 l5 E
8 R0 S: |9 u; z% s `( a! @5 N
$ a' J- `% j9 N8 P4、自学几个基础知识$ k! ]# Y+ X& d: C" L7 ^
a、变量分为两种:网络型(nets type)和寄存器型(register type);7 I4 H7 A( x$ H
b、nets型指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接;最常用的wire(连线类型),常用来表示以assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时,默认为wire类型。
3 R5 N. B) t% }( H& ]' G |
|