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

初学FPGA-2

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
初学FPGA-2

! E( Z" D8 d# ^* i! ^" y- G- l1 d! m$ u* v4 X/ w* ?

0 n$ ?% H% P8 G' a
* y, d: R/ [$ s8 O& {1、assign一般多用于组合逻辑,其后变量必须为wire类型;对于输入和输出变量,如不声明其类型,默认为wire类型。# ?8 D0 W4 b2 a' @
# L6 p8 L6 g4 c6 Z1 z. V
2、always多用于时序逻辑。
) ]6 H/ J) f- P& s
" M0 y# ?2 K/ T0 M1 Q, Q# n& B! s$ z0 s: ?' l
7 c' e  ?1 T# @: j2 N
# _  ]9 l1 `( {3 f' z3 N* G. o" e
3、modelsim仿真问题解决,见文档ModelSim相关。
! A3 w; i5 K6 D+ i     网络真的很强大,modelsim问题都已解决,现在自己的问题及网上找的解决方法整理上传。. r7 j% j" t2 f0 f

4 O8 _# V( h6 D  m# u- E4 X4、testbench是一种验证的手段。首先,任何设计都是会有输入输出的。但是在软环境中没有激励输入,也不会对你设计的输出正确性进行评估。那么此时便有一种,模拟实际环境的输入激励和输出校验的一种“虚拟平台”的产生。在这个平台上你可以对你的设计从软件层面上进行分析和校验,这个就是testbench的含义。; S1 ]6 |2 t9 A, V# N

/ ^. N& W) r4 X% q. |5、Testbench三步走:6 o& Z$ n" f- @5 {
    a、对被测试设计的顶层接口进行例化;
: e# B9 w+ P8 b$ q    b、给被测试设计的输入接口添加激励;
; S$ x7 s/ v% X( p5 p, q0 _    c、判断被测试设计的输出响应是否满足设计要求。" e& [% S% Q. X) U+ _( @0 z
3 X6 L+ }* u: s* H: o9 y6 c
6、最简单的Testbench应包含:时钟激励、复位激励及其它激励。
4 i5 X  c. a, @7 r8 K
: x2 l* l% e* ^3 w  d8 T, J  ]5 J7、最简单的Testbench例子(时钟的产生)% d" Q; D0 g/ b: y9 h# D
    // 定义时钟周期为20ns,已定义“`timescal 1ns/1ps”, W2 Y- v. Y6 A: y) ?
    parameter PERIOD 20;1 ?% h5 `( Z6 p6 {8 g: O2 C! t
) r% d4 s& e* U+ _# }
    initial
9 q; x* S0 A2 ?/ B( C, x* _    begin" q6 `/ {, r' C0 q- J
        clk = 0;
- _; }* ]' I; e8 ~9 \. L$ \        forever
% ^/ k5 n/ H! N6 c1 V/ V) U$ \$ j            #(PERIOD/2)  clk = ~clk;) r" Y4 O( J+ Q8 b- A5 F5 I$ j4 z+ b$ X
    end
2 _0 K5 l* v" g4 p7 {
4 }8 L5 p5 o# N. c    同例子的不同实现方法(用always来实现)
4 Z, `" a. e; R# L    parameter PERIOD 20;1 W! B; _/ b0 c+ W
: H# q% R3 ?* T
    always begin
+ u4 q8 h7 w/ x  t7 x( j; C7 Y        #(PERIOD/2) clk = 0;
7 M2 [4 T5 h& i0 R$ b" G3 o        #(PERIOD/2) clk = 1;2 V' r8 o; J5 M* I% E/ h# \1 O
    end6 B2 P2 n0 V% G1 V  q4 T7 Z
; w5 ]+ n7 i( _
+ `( h3 l5 M5 M$ Z" }
8、最简单的Testbench例子(复位信号的产生)
6 O; a# K) d& g# F: f    // 已经定义`timescale 1ns/1ps
" W; u  f8 a" X8 Y& G1 h    initial
$ X6 x- ?7 k. z4 Q" L3 e7 ]    begin7 w' l% }  v+ h# `% m3 ?% i; J) t4 ?
        rst_n = 0;
4 b6 Q7 A0 P" T. l4 |        #100;            //延时100ns5 e4 Y% u! T, G  ~
        rst_n = 1;      //撤销复位
4 h7 m; L1 l$ V3 \+ a, K' a        ......
! ~$ K4 F, [4 ]2 J0 V( f1 V    end6 I' K; e& ?( q6 N. D9 a

- o( D, s9 V- q- s3 z; N3 @6 F. K( ?0 C9、以任务的形式给出复位激励& O9 a$ z. G/ A
    initial
  n! Y2 @5 H) E( w# ~0 n    begin! M0 W% f( p6 `4 t; q; M5 P: R. g6 m
        reset_task(100);    // 复位100ns,已经定义 `timescale 1ns/1ps
& w. o! O% v! G( d. g5 I        ........
7 S; u# q, _( d: @, D5 V    end0 V+ D2 G- {, ?" o
0 V. s5 @. J. g1 g& H5 ^9 K- s
    task reset_task;# L; B; Z  S( w7 g
    input[15:0]  reset_time;    //定义复位时间
6 p3 |/ G5 `) i    begin5 ?$ O% R5 k- X1 |! x
        rst_n = 0;
! |9 A; a  i3 q1 ^        #reset_time;    // 延时reset_time 时间
9 A! ?! j: m$ H7 @  d        rst_n = 1;2 P3 s& d% q6 q& g2 m
        ........; p5 j9 G" U& ^/ Z2 z* X
    end
/ P# D$ t3 `! |9 r& ?    end task: D7 C+ g0 c, ^, r" H, E  t
! [( m9 f/ D, J$ z; @* ^9 F

. Y! J( ?8 |6 R* y
3 M8 m9 @3 V# r0 q% G: Z% b1 o4 T) W4 k/ s5 d! X. c
5 `, x6 A4 J: A: w
1、深入学习按键操作:
  V2 }2 @) |4 R
" G! l' d% G8 z& F2、解决一个警告,有时感觉学习好无头绪,其实像这样去解决一个个的警告也不为一种好的学习方法。
$ K# q/ S2 `. u  n* X   警告:Found pins functioning as undefined clocks
8 y4 b2 U8 M/ q8 i1 r/ Y; ^    解决方法,见附件
4 H* P$ K2 C; e8 h7 q
# i3 B8 g. P: n* I3、自己通过学习对 如何检测按键按下动作 的理解
, p8 J# H& _' k! y0 F0 s( o    定义寄存器(A,用到几个按键可对应定义几位),在每个时钟周期不断更新存放对应按键的状态值;在将该状态延时一个周期存放到另外一个定义的寄存器(B)中,然后进行以下操作:C = B & (~A);而得到的C状态可维持一个周期,在这个周期内可对其进行检测来判断是否有键按下。对以上所述用如下实例来加以说明:
8 Y! e) l8 R5 k0 A& }A:     1 1 1 1 0 0 0 0/ j" e/ @3 @( O) F1 a
~A:   0 0 0 0 1 1 1 1; _3 r  {4 g: @( O
B:        1 1 1 1 0 0 0 0/ {; {" h6 n; a4 s
C:        0 0 0 1 0 0 0
! ]0 R% n& v9 K* S  M6 o: Z从上可以看出:当A状态翻转时(只能从1到0),可通过C的值判断出来:一个下降沿的到来: l& `& P0 O6 i' ?$ c6 w/ [
?问题:只要有状态的变化,都能检测出来,即既能检测下降沿又能检测下降沿。(自己正在尝试中)
/ D/ q  l% K' h# p5 `: A, l
0 b* |' ]1 H% o6 d1 ?8 Y程序实例:+ i1 [0 D  S; \2 r0 f
//-------------------------------------------------------------  g1 ?6 X) o- U$ v9 s3 _/ q2 M9 Q
//说明:实现按键按下(只实现下降边沿)功能检测% M$ V1 E* r3 _. y: G
//-------------------------------------------------------------
  h8 Y; G+ f2 A9 B7 K, ]reg[3:0] sw_reg1;   //存放键值状态 . Z& Z/ D* g( G) j4 h3 T# ^
always @ (posedge clk or negedge rst_n)) \! ~% n8 R$ H+ m2 g- {7 G+ M
   if (!rst_n)    //异步复位 - \" h- \4 O. z) ]7 V
      sw_reg1 <= 4'b1111;
1 N2 E/ G3 k$ ]3 Z7 [3 Y* [. @ else0 g9 q( h- g4 M
      // 每一个时钟上升沿到来时,读取按键的值,并存入到定义的寄存器中, ]1 R$ c. P6 O' D) W  [6 \
      sw_reg1 <= {sw1_n, sw2_n, sw3_n, sw4_n};. F  L2 Q$ b# y% ?% r0 a! o

9 f: W. T* V7 P) z+ M3 X* i& B//延时一个时钟周期,存放键值状态  5 Q- e  p6 S% I! b# L1 E! J: `7 y2 ?
reg[3:0] sw_reg2;  
4 h) L. z) W% y# V0 V' A: qalways @ (posedge clk or negedge rst_n)
; d; h. p) @% n* n' G6 B   if (!rst_n)
0 O5 ]: `- y- P( T$ Q$ F      sw_reg2 <= 4'b1111;: y! G7 V# s, G8 ]& X  t' R2 A: p
   else! r0 K' Z# S; K# k
      sw_reg2 <= sw_reg1;
* N4 U3 u" G* l( [% a' X& x: ?9 N2 w7 m: O: t- L! q% ^* A
//当寄存器sw_reg1由1变为0时,sw_reg的值变为高,维持一个时钟周期 + m& ~, q4 E$ @% h
wire[3:0] sw_reg = sw_reg2 & (~sw_reg1);: q8 }/ ]# h7 }  K

$ }* O$ ?, G, Y% D' S( w" Q7 K  J' B: E; b: \: y) H

$ k, Y# T- q" H8 Q" l: l4、自学几个基础知识1 s& P0 v# u; g+ P! z! J
  a、变量分为两种:网络型(nets type)和寄存器型(register type);
; P- d# G; ?8 P9 j' W  b、nets型指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接;最常用的wire(连线类型),常用来表示以assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时,默认为wire类型。
游客,如果您要查看本帖隐藏内容请回复
9 G0 Q0 x1 p. X0 p# T, S" R" 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-19 08:54 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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