Verilog语法简介

Verilog语法简介

  1. 常量
正数常量含义
8’b11001100宽度为8位的二进制数
8’hff宽度为8位的十六进制数
7’o15宽度为7位的八进制数
6’d10宽度为6位的十进制数
  1. 变量
  • net型变量

net型变量相当于硬件电路中各种物料连接其特点是输出的值紧跟输入值的变化而变化。wire是最常用的net型变量。wire型信号可以用作任何表达式的输入,也可以作为assign语句和实例元件的输出。

  • variable变量

variable型变量可以保存上次写入的数据,一般对应硬件上的一个触发器或锁存器等存储元件。在综合器综合的时候,会根据其被赋值的情况来具体确定是映射成连线还是映射为存储元件。

类型含义
reg比特数据
interger整数
real实数
  1. 向量

可以理解为变量的数组,示例

定义含义
wire [31:0] bus;32位的wire型向量,bus[31]是最高位,bus[0]是最低位
reg [31:23] pc;32位的reg型向量,其中pc[31]是最高位,pc[23]是最低位
  1. 运算符

运算符与C语言类似,这里挑几个特别的运算符

  1. 等式运算符“==“:参与比较的两个操作数必须逐位相等,其结果才为1.如果某些值是不定态X或高阻态Z,其结果是不定态X。等式“===”:参与比较的操作数中为不定态X或高阻态Z的位也进行比较,两个操作数必须完全一致,其结果才为1,否则为0。
  2. 位拼接运算符:{op1,op2}、{num{op}}、{num{op1},op2}…
  1. 过程语句
  1. always语句:不断重复执行的语句
    always @(posedge clk) begin
        else begin
            data<=data_in;
        end
    end
  1. initial语句:只执行一次的语句,不可综合
  1. 赋值语句
  1. 持续赋值语句:assign,主要用于对wire型变量赋值。可理解为在电路中将线路直接连接。
  2. 过程赋值语句:在always、initial过程语句中的赋值语句称为过程赋值语句,多用于对reg型变量进行赋值,分为非阻塞赋值和阻塞赋值两种方式。

(1). 非阻塞赋值“<=”:非阻塞赋值在整个过程语句结束时才会完成赋值操作。
(2). 阻塞赋值“=”:阻塞赋值在该语句结束时就立即完成赋值操作。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行。

在always过程块中,非阻塞赋值可以理解为赋值语句是并发执行的,而阻塞赋值可以理解为赋值语句串行执行的。在一个过程块中,阻塞式赋值与非阻塞式赋值只能使用其中一种。

  1. 条件语句

条件语句有if-else、case两种

    always @(posedge clock or posedge reset)begin
        if(reset)begin
            count<=0;
            busy<=0;
            busy2<=0;
        end
    end
    always@(*)begin
        case(m)
            2'b00:out<=data_in1;
            2'b01:out<=data_in2;
            2'b11:out<=data_in3;
            default: out<=32'b0;
        endcase
    end
  1. 循环语句

循环语句有四种:for、forever、while、repeat。除for语句可综合以外,其它都不可综合。

  1. 编译指示语句

(1). 宏替换define (2).include语句,不可综合
(3). 条件编译语句`ifdef、`else、`endif


实例代码:Verilog实现JK触发器

module JK_FF(
    input CLK,
    input J,
    input K,
    input RST_n,
    output reg Q1,
    output reg Q2
    );
    always @(posedge CLK or negedge RST_n) begin
        if(~RST_n) begin
            Q1<=0;
        end
        else begin
                if(K&J) begin
                Q1<=Q2;
            end
            else if(J) begin
                Q1<=1;
            end
            else if(K) begin
                Q1<=0;
            end
        end
    end
    always @ (Q1)
        Q2 <= ~Q1;
endmodule
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值