Verilog_Day1 在CSDN博客上。http://blog.csdn.net/m0_38073085

第三章:

书上基本知识

  • 每个Verilog程序包括4个主要部分:端口定义,I/O说明,内部信号声明和功能定义。
  • input/output/inout都默认是wire型而不是reg型变量。
  •  module block(a,b,c,d);  // 端口定义
    input a,b; // 输入口说明
    output c,d; // 输出口说明 reg [:] e; // 内部信号说明 [2:0] 表示3位信号 assign c=a|b; // 功能定义 1.用assign申明语句
    and # u1(e,c,d); // 2.用实例元件 #2表示延时2单位时间
    always @(c or e)
    begin end // 3.用always语句
    endmodule

    在实例元件使用中,and  #2 u1()可以看成是调用了一个名为u1的and内置模块。

  • 采用“assign"语句是描述组合逻辑最常用的方法之一。而"always"块既可以用于描述组合逻辑,也可描述时序逻辑。
  • 在"always"模块内,逻辑是按照指定的顺序执行的。  (?)
  • 只有连续赋值语句(即用关键词assign引出的语句)和实例应用语句(即用已定义的模块名引出的语句),可以独立于过程块而存在于模块的功能定义部分。
问题1:begin - end 语句内是顺序执行还是并列执行,alwatys内部语句执行顺序是不是一定是顺序执行,而不是取决于if-else?
  • 在数字电路中,x代表不定值,z代表高阻值。z还有一种表示方法是可以写作“?”。
  • 高阻,数字电路里常见的术语,又叫高阻态,指的是电路的一种输出状态,既不是高电平也不是低电平。

    高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定。

    高阻态的实质:

    电路分析时高阻态可做开路理解。你可以把它看作输出(输入)电阻非常大。他的极限可以认为悬空。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。而实际应用上与引脚的悬空几乎是一样的。

    高阻态的意义:

    当门电路的输出上拉管导通而下拉管截止时,输出为高电平;反之就是低电平;如上拉管和下拉管都截止时,输出端就相当于浮空(没有电流流动),其电平随外部电平高低而定,即该门电路放弃对输出端电路的控制 。

    单片机引脚复位后P口的所有引脚都是高阻输入什么是“高阻”?

    高阻 简言之就是 输入输出电阻都相当大,相当于隔离状态。处在高阻态的三态门是与总线隔离开的,这样总线可以同时被其他电路占用。

    高阻:从逻辑器件内部电路结构来说,就是其输出电阻很大,该状态即不是高电平,也不是低电平。当三态门处于高阻态时,无论该门的输入如何变化,都不会对其输出有贡献。

  • 负数的表示方法: -8‘d5    只能放在最前面。
  • 可以在长数字中使用下划线分隔开数以提高程序的可读性。
  • 在verilog中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量。              eg:   parameter byte=8,byte_msb=byte-1,delay=(byte+byte_msb)/2;

两种参数传递方法

下面是一个参数传递实例:

module Decode(s,A,F);
input s;
parameter Width=,Polarity=;
output A,F;
reg A,F;
always @(s)
if(! s) A=Width%;
else F=Polarity%;
endmodule module Top;
reg clock;
wire A4,A5,F16,F32;
initial
begin
clock=;
end
always # clock=~clock;
always @(posedge clock)
begin
end
Decode #(,) D1(clock,A4,F16);
Decode #() D2(clock,A5,F32);
endmodule

代码表示如果参数传递不成功,最后输出应该都为0,如果都传递成功,最后A4,F16,A5输出为1;F32输出为0.

最后结果输出如下图:

可以看出参数传递成功。

编程过程中的几个问题:

  1.   把always @(posedge clock)   begin end 注释掉也没有问题;
  2. 本来想在Decode模块中通过reg [Width]  A;将输出的A4,A5的数据长度也进行改变。但是最后没有成功。 不报错,但还是1位。
  3. 在Decode模块中要使用功能定义模块。不然输出全是不定态。
  4. 在wave窗口,使用 a 快捷键可以显示多个观察时间点。
  5. reg A,F; 不能省。不然会报错:Illegal reference to net "A".        因为 A 和 F 在always模块内被赋值。需要使用 reg 型数据。

另一种参数传递可以通过defparam命令来实现。

module Decode(s,A,F);
input s;
parameter Width=,Polarity=;
output A,F;
reg F;
reg [Width:] A;
always @(s)
if(! s) A=Width%;
else F=Polarity%;
endmodule module Top;
reg clock;
wire A4,A5,F16,F32;
initial
begin
clock=;
end
always # clock=~clock;
//always @(posedge clock)
//begin
//end
Decode #(,) D1(clock,A4,F16);
Decode D2(clock,A5,F32); // 这里直接产生Decode的D2。内部参数不变。
defparam // 用defparam来改变参数。
Top.D2.Width=; // 是Width, 不是A或者是A5。
endmodule

最后仿真结果不变。

总结:可以通过两种方法来改变module里面的参数型常量。   第一种是直接在生成一个实例时进行参数更改;第二种是用defparam在生成实例后再进行更改。

网络数据类型(wire,tri)与reg型的一般区别

  • 网络数据类型表示结构实体例如门之间的物理连接。常用的网络数据类型包括wire型和tri型。网络数据类型的变量不能储存值,而且必须受到驱动器(例如门和连续赋值语句,assign)的驱动。
  • wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络数据类型,tri 型变量则用来表示多驱动器驱动的网络数据。
  • 如果没有驱动器连接到网络类型(wire,tri)的变量,则该变量就是高阻(z)。    reg 型的变量默认为不定值x
  • 在”always"模块内被赋值的每一个信号都必须是reg型。
  • 注意:reg 型只表示被定义的信号将用在”always“模块内。

reg型数据与memory型数据的相似与区别

  • verilog通过对 reg 型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。    在verilog 中没有多维数组存在。数组的维数不能大于2。
  • memory 型数据是通过扩展 reg 型数据的地址范围来生成的。 eg: reg [7:0] mema[255:0]   定义了一个名为mema的存储器,包含有256个8位存储器。 注意:第二个括号的表达式必须是是常数表达式。
  • reg [n-1:0] rega;   //一个n为存储器。   可以使用   rega=0; 进行赋值
  • reg  mema [n-1,0];   // 一个由n个1位存储器构成的存储器组。   不能用 mema=0; 进行赋值。 类似于C中的数组。
  • 读多位的memory型,可以用  reg[7:0] mema[255:0];  mema[56][2]; 。 先找到56号8位存储器,再读该8位存储器的第二位。
  • 注意存储器属于寄存器数组类型。线网数据类型没有相应的存储器类型。

.运算符、表达式

  •  进行取模运算时,结果值的符号为采用模运算式里第一个操作数的符号位。 eg:  -10%3 = -1 ;  11%-3 = 2;
  • 位运算符:

      1. ~      // 取反
      2. &     // 按位与
      3. |      // 按位或
      4. ^     // 按位异或  
      5. ^~  // 按位同或     

    

Verilog_Day2的更多相关文章

随机推荐

  1. 为website安装免费的letsencrypt证书

    Certbot官网:https://certbot.eff.org 1. 安装certbot命令 wget https://dl.eff.org/certbot-auto chmod a+x cert ...

  2. zabbix系列之三——安装报错

    1Zabbix_server启动失败 1.1查看日志:vi /var/log/zabbix/zabbix_server.log zabbix_server [23500]: cannot open l ...

  3. 如何在首次启动 Linux 虚拟机时对其进行自定义

    在前面的教程中,你已学习如何通过 SSH 连接到虚拟机 (VM) 并手动安装 NGINX. 若要以快速一致的方式创建 VM,通常需要某种形式的自动化. 在首次启动 VM 时实现自定义的常见方法是使用  ...

  4. python基础_类型_str

    #python不用考虑变量,可随时变换,自动分配内存,比如a = 'jjj'后a = 123是可以的 #str 文本 字符串 #常用函数 a = ' abcefg \n' a.strip() #去掉前 ...

  5. [转]SQL Server 数据库定时自动备份

    前提:在使用下面的备份方式之前需要确保你的Sqlserver Agent服务启动,切设置为自动启动.否则当你服务器重启了但是Agent服务没有启动,那么自动备份任务就不会执行 (一)使用TSql代码自 ...

  6. K8S Deployment 命令

    创建 Deployment kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record ...

  7. (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

    1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...

  8. 【2017-11-19】Linux基础知识:TP-Link WN823N无线网卡(RTL8192EU芯片)的X86-64及AARCH64驱动安装

    目的: 使类似于树莓派的AARCH-64架构的嵌入式设备能通过USB无线网卡连接上以太网: 该设备有LAN接口,但在前一次系统固件升级后,其内部的三个网络接口可以相互ping通,但任一接口无法ping ...

  9. 学习博客之Java继承多态接口

    这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...

  10. 021.14 IO流 管道流

    用的频率不高特点:读取管道和写入管道对接,需要是用多线程技术,单线程容易死锁 使用connect方法连接两个流,实现边读编写,和node.js的管道流差不多 //##主函数位置 public stat ...