草庐IT

二、Verilog基础语法学习

Hello Jason 2023-09-04 原文

一、Verilog基础知识

1、Verilog的逻辑值

我们先看下逻辑电路中有四种值,即四种状态:

  • 逻辑 0:表示低电平,也就是对应我们电路的GND;
  • 逻辑 1:表示高电平,也就是对应我们电路的VCC;
  • 逻辑 X:表示未知,有可能是高电平,也有可能是低电平;
  • 逻辑 Z:表示高阻态,外部没有激励信号是一个悬空状态。
     

2、Verilog的标识符

        标识符(identifier)用于定义模块名端口名信号名等。 Verilog的标识符可以是任意一组字母、数字、 $和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。不建议大小写混合使用,普通内部信号建议全部小写, 参数定义建议大写
 

3、Verilog的数字进制格式

 二进制表示如下: 4’b0101表示4位二进制数字0101;
十进制表示如下: 4’d2表示4位十进制数字2(二进制0010) ;
十六进制表示如下: 4’ha表示4位十六进制数字a(二进制1010) 。
当代码中没有指定数字的位宽与进制时,默认为32位的十进制。

4、Verilog的数据类型

寄存器类型(reg、 integer、 real)

        寄存器类型表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为寄存器;如果该过程语句描述的是组合逻辑, 即always语句不带有时钟信号,则该寄存器变量对应为硬件连线;

reg [31:0] delay_cnt; //延时计数器
reg key_flag ; //按键标志

线网类型(tri、wire)

        线网表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值
或门的输出。

wire data_en; //数据使能信号
wire [7:0] data ; //数据

参数类型(parameter)

        参数其实就是一个常量,常被用于定义状态机的状态、数据位宽和延迟大小等,由于它可以在编译时修改参数的值,因此它又常被用于一些参数可调的模块中,使用户在实例化模块时,可以根据需要配置参数。参数的定义是局部的,只在当前模块中有效。

parameter DATA_WIDTH = 8; //数据位宽为8位

5、Verilog的运算符

算术运算符

关系运算符

 逻辑运算符

条件运算符

 位运算符

移位运算符

拼接运算符

6、关键字
 

 二、Verilog程序框架

module led(
    input sys_clk ,                 // 系统时钟
    input sys_rst_n,                // 系统复位,低电平有效
    output reg [3:0] led            // 4位LED灯
);

parameter define
parameter WIDTH = 25 ;              // 位宽
parameter COUNT_MAX = 25_000_000;   // 板载50M时钟=20ns, 0.5s/20ns=25000000,需要25bit

 //reg define
 reg [WIDTH-1:0] counter ;
 reg [1:0] led_ctrl_cnt;

 //wire define
 wire counter_en ;

 //***********************************************************************************
 //** main code
 //***********************************************************************************
 //计数到最大值时产生高电平使能信号
 assign counter_en = (counter == (COUNT_MAX - 1'b1)) ? 1'b1 : 1'b0;

 //用于产生0.5秒使能信号的计数器
 always @(posedge sys_clk or negedge sys_rst_n) begin
    if (sys_rst_n == 1'b0)
        counter <= 1'b0;
    else if (counter_en)
        counter <= 1'b0;
    else
        counter <= counter + 1'b1;
end

//led流水控制计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (sys_rst_n == 1'b0)
        led_ctrl_cnt <= 2'b0;
    else if (counter_en)
        led_ctrl_cnt <= led_ctrl_cnt + 2'b1;
end

//通过控制IO口的高低电平实现发光二极管的亮灭
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (sys_rst_n == 1'b0)
        led <= 4'b0;
    else begin
        case (led_ctrl_cnt)
            2'd0 : led <= 4'b0001;
            2'd1 : led <= 4'b0010;
            2'd2 : led <= 4'b0100;
            2'd3 : led <= 4'b1000;
        default : ;
        endcase
    end
end
endmodule

三、Verilog高级知识点
 

1、顺序块语句 

1.1、阻塞赋值( Blocking)

也就是说always块内的语句是一种顺序关系,这里和C语言很类似。 符号“ =”用于阻塞的赋值(如:b = a;) ,阻塞赋值“ =”在begin和end之间的语句是顺序执行,属于串行语句。

 1.2、非阻塞赋值( Non-Blocking)

        符号“ <=”用于非阻塞赋值(如:b <= a;), 非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边,注意:是begin—end之间的所有语句,一起执行,且一个时钟只执行一次, 属于并行执行语句。 这个是和C语言最大的一个差异点,大家要逐步理解并行执行的概念。

2、分支语句

有关二、Verilog基础语法学习的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  3. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  4. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  5. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

  6. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  7. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  8. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  9. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  10. ruby -::在 Ruby 语法中是什么意思? - 2

    这个问题在这里已经有了答案:WhatisRuby'sdouble-colon`::`?(12个答案)关闭8年前。什么是::?@song||=::TwelveDaysSong.new

随机推荐