原创 fpga学习日记9,fpga常见模块与modelsim仿真

2013-8-24 21:59 3476 11 11 分类: FPGA/CPLD 文集: 数电,FPGA学习

本文先简单列举了fpga/CPLD开发常用模块

然后通过一个实例学习下modelsim的仿真流程

 

第一部分:

模块是构成系统的基础

所以只有把最基本的模块知识都掌握扎实才能设计出高效  实用 可靠的系统

同时对 组合逻辑 时序电路以及常用驱动的学习也有助于对开发工具和设计思想的熟悉

 

学之前自己也打算复习下数字电路的基本知识

同时感觉学这些模块的时候对单片机和arm的理解和应用也是有帮助的

这里只是综合列出常见的模块(觉得有些地方可以参考74系列的数据手册)

还是需要花大量的时间来一个个学习

然后通过练习,仿真和分析来慢慢了解设计方法,verilog语言和应用环境。

 

 

 

数字逻辑电路可分为两种类型:组合逻辑电路和时序逻辑电路。

 

- 组合逻辑:输出只是输入逻辑电平的函数(有延时),与电路的原始状态无关。

 

时序逻辑:输出不只是输入的逻辑电平的函数,还与电路所处的状态有关。

同步时序逻辑是在同一时钟跳变节拍的前提下,如输入条件满足,则进入下一状态,否则仍留在原来的状态的状态机。

 

 

 

组合逻辑:由与、或、非门组成的网络。常用的有:多路器、数据通路开关、加法器、乘法器等,没有记忆功能。

时序逻辑: 由多个触发器和多个组合逻辑块组成的网络。常用的有:计数器、复杂的数据流动控制逻辑、运算控制逻辑、指令分析和操作控制逻辑。同步时序逻辑的设计是设计复杂的数字逻辑系统的核心。

存储器和寄存器:用于暂时存储数据信息。

 

竞争与冒险

信号在通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变 化,成为“竞争”;往往导致出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。

 

        如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在“冒险”。冒险是由变量的竞争引起的。冒险又分为逻辑冒险和功能冒险。

 

竞争与冒险的关系:有竞争不一定会产生冒险,但有冒险就一定有竞争

http://blog.163.com/zhangmaochu@126/blog/static/3736062220094300473146/

 

 

组合逻辑设计要点 

组合逻辑的两种Verilog HDL表示:

  -用 assign 语句:

      assign q = (al==1?) d : 0 ;

  -用 always 块:

   always @(al or d) 

      begin  

           if (al==1)  q = d ;

                 else  q = 0; 

      End

 

用always块时,必须注意电平敏感的信号表是否完全,如:

  always @ (a or b or c or d )

      begin  

         out = (a & b & c) | (d & e);

      end

此时生成的不是纯组合逻辑,因为当 e 变化时,out 不

能立即跟着变化。只有当a 或 b 或 c 或 d 变化时e 的

变化后果才显示出来。可见需要有一个寄存器来储存 e 

的变化。

 

组合逻辑举例之一
一个八位数据通路控制器

`define   ON   1 ‘b 1

`define  OFF  1 ‘b 0

 wire ControlSwitch;

 wire [7:0] out, in;

 assign  out =  (ControlSwith== `ON) ? in  : 8 ‘h00

 

 

基本逻辑 与,或,非

比较器

编码器  8-3线 16-4线

译码器  3-8  4-16  bcd LED显示译码器

选择器  2选1  3选1 4选1

缓冲器

运算器  加法 乘法 除法 阶乘运算器

 

 

----------------------------------------------------------------------------------------------------------

 

 时序逻辑的 Verilog HDL表示:

  - 用 always:

   如: always @(posedge clock)

         if (!reset)

              do_reset;

         else case(state)

          state_1: do_state_1;

          state_2: do_state_2;

           state_3: do_state_3;

           state_4: do_state_4;

           state_5: do_state_5;

           default: state <=xx;

         Endcase

    task do_reset;

        begin

           Reset_Every_Register;

           Prepare_For_Next_State;

        end

     Endtask

 task do_state_1;

   begin  if (Condition_Is_True)

         Switch_Proper_Control_Logic;

         Prepare_For_Next_State;

      else Stay_In_Original_State; 

   end

 Endtask

 task do_state_2;

   begin if (Condition_Is_True)

        Switch_Proper_Control_Logic;

        Prepare_For_Next_State;

        else Stay_In_Original_State; 

   end

 endtask

 

 

移位寄存器

锁存器

计数器

分频器

频率合成器

脉冲控制器

存储器 ROM  RAM

 

 

---------------------------------------------------------------------------------------------------

有限状态机FSM

FIFO模块

数字滤波器FIR

CPU

数据通道

流水线设计

VGA等外围电路驱动

 

 

Testbench等

 

第二部分

实例与modelsim仿真(工程重新打开后我的注释中文变成了? 问题还在查找中

当打开一个文件时其中的中文会显示为乱码,可以通过如下设置解决。

在ModelSim主窗口中 
 
6.6版本是 TOOLS---edit preference---在窗口列表中选择source windows 然后选右边的files在encoding中选择custom encoding for read GB2312
点击apply应用   重新打开文件即可显示中文
 
Tools --> Preference --> Source Windows --> Files --> Custom Encoding for Read中选择gb2312编码。
就可显示并输入中文了。
 

)

介绍一个四选一数据选择器 的实现和仿真modelsim流程

(符号输入 注意:基数表示法用的是键盘上双引号键 out=1'b0;    时间单位用的是~键   `timescale 1ns/10ps)

代码如下

 

//
//mux4_1.v 四选一选择器代码
//
 
 
module mux4_1(out,in0,in1,in2,in3,sel);
    input  in0,in1,in2,in3;
    input  [1:0] sel;
    output out;
    
    reg    out;
    
    always @(sel or in0 or in1 or in2 or in3)
    begin
                case(sel)
                      0:out=in0;
                      1:out=in1;
                      2:out=in2;
                      3:out=in3;
                      default :out=1'b0;
                endcase
  end
endmodule
 
 
 
----------------------------------------------------------
//
//mux4_1_tb.v 四选一选择器测试代码
//
 
//时间单位设置
`timescale 1ns/10ps
 
module mux4_1_tb;
      reg[3:0] in;
      reg[1:0] sel_in;
      wire f;
      
      mux4_1 mux4_1(f,in[0],in[1],in[2],in[3],sel_in);  //实例化
      
      always #150 sel_in=sel_in+1;   //产生地址信号激励
      always #50  in=in+1;           //产生数据信号激励
      
      initial begin
                in=0;
                sel_in=0;
                #1200 $finish;
              end
endmodule
  
 
仿真流程
1,创建库文件work(如果是第一次使用)  file---new--library
0.jpg
2,创建新工程file-new----project
3,创建代码   添加到工程  本例的两个.V文件
1.jpg
4,编译代码改错 compile--compile all
2.jpg
 
5,进入仿真环境  simulate---start sumulation
 只选mux4_1_tb.v文件即可 点击ok
4.jpg
 
6,添加需要查看的信号到波形观察窗口
5.jpg
 
7,运行仿真
6.jpg
 
8,查看 分析 仿真结果
9.jpg
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /1 下一条