verilog没有葵花宝典

https://github.com/zsylov/verliog-study/edit/master/2019.4.29%E8%BE%B9%E6%B2%BF%E6%A3%80%E6%B5%8B.md

1.复习verilog语法
====
* reg和wire的区别。
----

  1.reg对应于过程赋值,如always,initial.
  2.wire对应于连续赋值,如assign。其综合出来一般是一根导线。
  
* 阻塞与非阻塞的区别。
-----
  1.阻塞赋值采用(=,组合逻辑电路)指在同一个always块中,其后面的赋值语句从概念上是在前一条赋值语句结束后开始赋值的。
  非阻塞赋值采用(<=,时序逻辑电路),首先计算语句块内部所有右边表达式(RHS)的值,然后完成对左边寄存器变量的赋值操作。
  
* parameter与define的区别。
-----
  1.语法不同,使用define定义的参数调用要加.
  2.二者的作用域也不同,parameter 作用于声明的那个文件;define从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。
  
*task与function的区别。
-----
   function的定义:
    function<返回值类型和位宽> <函数名>
      <入口参量和类型声明>
      <局部变量声明>
      行为语句;
  endfunction
  task的定义
  task<任务名>;
    端口与类型说明;
    变量声明;
    语句1;
    。。。
    语句n;
  endtask
  task和function的不同点:
  (1):  function只能与主模块共用一个仿真时间单位,而task可以定义自己的仿真时间单位;
  (2):  function不能调用任务,而task可以调用函数;
  (3):  function至少需要一个输入变量,而task可以没有或者有很多个任意类型的变量;
  (4):  function返回一个值,而task则不返回值。
  https://blog.csdn.net/duhanting/article/details/10326405
  
2.用verilog实现边沿检测电路:上升沿,下降沿,双沿(上升或下降沿)。
====
  * 上升沿下降沿检测
  ```verilog
 // Code your design here
`timescale 1ns/1ps
module edge_dect(
                input Sys_clk,
                  input Sys_reset,
                  input data_in,
                  output L2H,
                  output H2L,
                  output both
            );
  reg data_in_r0;
  reg data_in_r1;

  always @ (posedge Sys_clk ,negedge Sys_reset )
    if(!Sys_reset)
      begin
       data_in_r0<= 1'b0;
       data_in_r1<= 1'b0;
      end
      else
      begin
        data_in_r0 <= data_in;
        data_in_r1 <= data_in_r0;
      end
  assign L2H =~data_in_r1 & data_in_r0;
  assign H2L =data_in_r1 & ~data_in_r0;
  assign both = data_in_r1 ^ data_in_r0;
endmodule

```
testbench
```verilog
// Code your testbench here
// or browse Examples
`timescale 1ns/1ps
module test_edge();
  reg Sys_clk;
  reg Sys_reset;
  reg data_in;
  wire L2H,H2L,both;
  initial
    begin
      $dumpfile("test_edge.vcd");
      $dumpvars(1);
      Sys_clk =0;
      Sys_reset =0;
      data_in = 0;
      #100
      Sys_reset =1;
      #20
      data_in = 0;
      #20
      data_in =1;
      #60
      data_in =0;
      
    end
  always #10 Sys_clk = ~Sys_clk;
  edge_dect edge_tect_inst(
                Sys_clk,
                  Sys_reset,
                  data_in,
                   L2H,
                   H2L,
                 both
            );
endmodule

```
* 仿真结果

  如图
3.记录一下第2题中用到的工具,包括工具版本,操作步骤或命令选项,遇到的错误,提示信息等。
====
  * 仿真工具采用www.edaplayground.com,由于之前也是采用这个工具,现在再使用,没有啥大的问题,主要还是要注意vcd文件要自己添加。

verilog没有葵花宝典_第1张图片

你可能感兴趣的:(verilog)