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

初学FPGA-2

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-29 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
初学FPGA-2

) `% 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

Quartus II警告与错误解决.rar

248.94 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2019-5-29 18:11 | 只看该作者
thanks for sharing
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 19:18 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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