FPGA学习日记——02Verilog语法的基本概念

Verilog语法的基本概念1

1、概述

Verilog描述的电路设计,就是该电路的Verilog模型,也称为模块。Verilog模型根据需要可以抽象成不同的级别,包括:系统级、算法级、RTL级、门级、开关级。前三者属于行为描述,只有RTL级与逻辑电路有明确的对应关系。可以理解为一个复杂电路系统的完整Verilog模型是由若干个Verilog模型构成的,每个模块又可由若干个子模块构成。

Verilog是一种硬件描述语言,不是计算机编程语言,虽然有很多c语言的影子,但是编写的思路完全不同。在设计Verilog电路时要考虑对应的电路是什么样的,而不是考虑CPU该怎样工作。

2、Verilog模块

先看Verilog程序,以及使用高云云源软件综合后的原理图(另外两个软件太卡),体会模块的概念。

module muxtwo(out,a,b,sl);
    
input a,b,sl;
output out;
reg out;

    always @(sl or a or b) begin
        if(!sl) begin
           out = a; 
        end
        else begin
           out = b; 
        end
    end
    
endmodule

在这里插入图片描述

module muxtwo(out,a,b,sl);
input a,b,sl;
output out;

wire nsl,sela,selb;
    
	assign nsl =~ sl;
	assign sela = a & nsl;
    assign selb = b & sl;
    assign out = sela | selb;
    
endmodule

在这里插入图片描述

module muxtwo(out,a,b,sl);
input a,b,sl;
output out;

wire nsl,sela,selb;
    
    not			u1(nsl,sl);
    and    		u2(sela,a,nsl);
    and    		u3(selb,b,sl);
    or    		u4(out,sela,selb);
    
endmodule

在这里插入图片描述

以上Verilog程序均实现了二选一多路选择器的功能,显然他们的编写方式是不同的。第一个图中综合出来的反相器应该是高云FPGA硬件结构的原因,在此可以忽略。

  • 第一个反相器使用了逻辑行为描述,在此设计者并不关心电路的结构,关注的是从逻辑功能上实现特定要求。
  • 第二个电路使用“~”、“&”、“|”等布尔操作符实现,逻辑功能非常明显,本质上是一个逻辑表达式。
  • 第三个电路使用了Verilog原语(通常由逻辑门和触发器构成)实现。反相器u1的输入是sl信号,输出nsl送给与门u2的一个输入端…依次描述下去。是一种逻辑单元互联结构的而描述方法。

利用Verilog编写模块时,符合语法要求的前提下再符合一些特定的规则,就可以利用计算机将上面第一种反相器通过二转换为第三种反相器,这个过程就是综合(个人理解类似于编译的过程)。再通过布局布线工具就可以将整个设计转换为某种具体工艺的电路布线结构。有一些语句符合语法但不能进行综合,这就是不可综合的语句。什么风格可综合的,什么是不可综合的后面再谈。

3、Verilog模块测试

无论行为描述、还是结构描述设计的Verilog模块,能否达到预计目的就需要经过测试平台(testbench)检验。给设计的模块特定输入信号,观察输出是否符合要求,以下是二选一选择器的测试程序。

`include "muxtwo.v"

module t;
reg ain,bin,select;
reg clk;
wire outw;
initial
begin
    ain = 0;
    bin = 0;
    select = 0;
    clk = 0;
end

	always #50 clk = ~clk; //产生一个周期为100的时钟脉冲信号
    
    always @(posedge clk)
    begin
        #1 ain = {$random} % 2; //{$random}产生随机数,延时1个时间单位后,产生ain流信号
        #3 bin = {$random} % 2;
    end
    
    always #1000 select = !select;//产生周期为1000的选通信号
    
    muxtwo m(.out(outw),//实例化选择器,其中muxtwo是已经定义好的模块,m为名为m功能为muxtwo模块,.a表示m的muxtwo中a端口。
             .a(ain),
             .b(bin),
             .sl(selsct));
    
endmodule

首先,此Verilog代码不可以综合,因为上述功能不全能找到硬件实现,例如#1延时,{$random}产生随机数等。因此能综合的模块必然有一个实际的电路结构与之对应。其次,模块t可以对muxtwo模块进行测试,可以在功能(行为)级、布尔表达式(逻辑表达式)级和门级上进行。


  1. 夏宇闻,Verilog数字系统设计教程(第三版),2013.7,P19-25. ↩︎

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

功成狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值