Verilog基础

Verilog基础


  Verilog 是一种专用于数字电路系统设计的 硬件描述语言 (HDL)。它在数字和混合信号系统的设计与验证过程中被广泛应用,涉及专用 集成电路 (ASIC)现场可编程门阵列 (FPGA) 等领域。相较于另一种硬件描述语言 VHDL,Verilog 的语法较为宽松,代码编写更为简洁,使得初学者能够更快上手。
  此外,Verilog 展现了出色的电路描述与建模能力,能够从多个层面对数字系统进行全面的描述和建模。因此,它在简化硬件设计流程、提升设计效率与可靠性,以及 语言的易读性设计的层次化结构化方面,都表现出了巨大的优势和潜力。

语法模板:

module name(A, B, C, clk, F1, F2);
    //输入输出声明
    input A, B, C, clk;
    output F1, F2;
    //类型声明
    wire F1;
    reg F2;
    
    //赋值
    always @(possedge clk) //敏感信号赋值
        F2 <= A
    //逻辑赋值
    assign F1 = (A & B) | (~A & ~C)
    begin
       //过程赋值
    end

endmodule

Verilog模块定义的结构:

	module 模块名(端口1, 端口2, ……, 端口n);
	
				“内容”
				
	endmodule

  端口声明完成后,需要定义输入端口输出端口

	input 端口1, 端口2 ……;
	output 端口1, 端口2 ……;

  类似于C语言的定义变量,其中也可以使用类似数组的表示方法描述多位输入输出端口:

	input [7:0/0:7]x; //(注意数字顺序,该表示为x[7] --> x[0])

  表示x是8位的输入端口;其中类型声明wire和reg也可以用数组描述表示多位。

​  输入端口声明结束后,紧接着声明输出端口的类型(类似于C语言的int,float数据类型)Verilog的输出也有两种类型:wirereg

  • wire:表示连线输出端口,即输入发生变化,输出立刻改变(一般由assign进行赋值,表决器等案例)
  • reg:表示寄存器输出端口,需要有触发信号(如时钟信号,一般随@always一起使用),只有触发,输出才会改变

运算量与运算符:

常量与变量

	A  <=  <位宽>  [b/d/o/h] <值>

  其中,b是二进制,d是十进制,o是八进制,h是十六进制
  一些常量会用parameter在模块头进行赋值

module test(A, B, F);
    input A, B;
    parameter flag = 1'b1;
    wire F;
    
    assign F = flag & A + ~flag & B;
    
endmodule

运算符

运算符作用
算术运算符加(+),减(-),乘(*),除(\),取模(%)
位运算符与(&),或(|),非(),异或(^),同或(^)
逻辑运算符与(&&),或(||),非(!)
关系运算符<, <=, >, >=, ==, !=
移位运算符左移(<<), 右移(>>), 采用0进行填充
条件运算符? : (了解)
位拼接运算符{} --> eg:{x, y[2:1]}, 表示x,y[2],y[1]的拼接

行为语句:

过程语句

always @(触发条件) // possedge or negedge
    //eg
    always @(A)
        begin
            
        end
    always @(posedge A)
    always @(negedge A)

块语句

begin
    //语句块, 串行方式顺序执行
end

赋值语句

//阻塞赋值  与   非阻塞赋值
//阻塞赋值 (=)
always @(posedge clk)
    begin
       b = 1'b1;
       a = b;
    end
//如果触发前b为0,则先执行b=1,再执行a=b,这时a的值为1
//非阻塞赋值 (<=)
always @(posedge clk)
    begin
       b <= 1'b1;
       a <= b;
    end
//如果触发前b为0,同时执行a和b的赋值语句,此时a为0,b为1

//持续赋值assign
assign F = A&B + (~A&~B);

条件语句

//1, if - else
if 表达式1 ~A&&A
    begin
    end
else if 表达式2
    begin
    end
else
    begin
    end

//2, case, casex, casez
case 表达式
    值1:
    begin
    end
    值2:
    begin
    end
    值n:
    begin
    end
    default:
    begin
    end
endcase

  注:条件语句均在always块内使用

例,下表逻辑的Verilog实现:

ABCF1F2
00000
00111
01011
01110
10001
10100
11000
11111
module test(A, B, C, F1, F2);
    input A, B, C;
    output F1, F2;
    reg F1, F2;
    
    always @(A or B or C)
        case({A, B, C})
            0, 5, 6:{F1, F2} <= 2'b00;
            1, 2, 7:{F1, F2} <= 2'b11;
            3:{F1, F2} <= 2'b10;
            default:{F1, F2} <= 2'b01;
        endcase
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值