Verilog入门

    科技2022-08-18  121

    Verilog入门

    文章目录

    Verilog入门前言名词解释VerilogVHDLFPGAEDA 语法入门Hello Worldcoding_1.0 基本概念coding_1.1 语法小结条件语句结构说明语句系统函数系统任务必知必会

    前言

    最原始的,或许就是最有效的,一些缩写的全称或许是入门的关键。比如xswl(笑死我了)、xmsl(羡慕死了)等。

    名词解释

    Verilog

    什么是Verilog?遇事蒙圈,上网浏览!

    wikipedia:

    Verilog是一种用于描述、设计电子系统(特别是数字电路)的硬件描述语言,主要用于在集成电路设计,特别是超大规模集成电路的计算机辅助设计。Verilog是电气电子工程师学会(IEEE)的1364号标准。

    Verilog全称是Verilog Hardware Description Language(Verilog 硬件描述语言),缩写Verilog HDL,简称Verilog

    总之,就是用来描述硬件——描述电路的一种语言,从前,CPU的设计是许多个工程师在纸上绘制的电路图,现在我们可以用变成语言来实现了。

    VHDL

    那么上图中提到的VHDL是什么呢?全称是Very-High-Speed Integerated Circuit Hardware Description Language,这里千万不要以为Verilog HDL和VHDL是一样的东西噢!

    FPGA

    wikipedia:

    现场可编程逻辑门阵列(英语:Field Programmable Gate Array,缩写为FPGA),它以PAL、GAL、CPLD等可编程逻辑器件为技术基础发展而成。作为专用集成电路中的一种半客制电路,它既弥补完全客制电路不足,又克服原有可编程逻辑组件门电路数有限的缺点。

    EDA

    wikipedia:

    电子设计自动化(英语:Electronic design automation,缩写:EDA)是指利用计算机辅助设计(CAD)软件,来完成超大规模集成电路(VLSI)芯片的功能设计、综合、验证、物理设计(包括布局、布线、版图、设计规则检查等)等流程的设计方式。

    思考1:思考硬件描述语言设计方法的优缺点

    语法入门

    Hello World

    语言入门是不是都会从Hello World开始emmm

    coding_1.0

    module helloworld(); initial begin $display("Hello World!"); $finish; end endmodule

    看起来是不是比C还简洁?!接下来我们来探究一下其中的秘密……

    基本概念

    关键字

    关键字含义module模块开始定义input输入端口定义output输出端口定义inout双向端口定义parameter信号的参数定义wirewire信号定义regreg信号定义always产生reg信号语句的关键字assign产生wire信号语句的关键字begin语句的起始标志end语句的结束标志posedge/negedge时序电路的标志caseCase语句起始标记defaultCase语句的默认分支标志endcaseCase语句结束标记ifif/else语句标记elseif/else语句标记forfor语句标记endmodule模块结束定义

    模块结构:

    module 模块名(a,b,c,d); input a,b; output c,d; endmodule //与下面等同 module 模块名(input a,input b,output c,output d); endmodule

    结合上面的代码进行说明:

    module helloworld(); //定义模块,及模块的名字 initial //初始化 begin //代码块开始,相当于C语言的'{' $display("Hello World!"); //调用输出函数,相当于C语言的printf $finish; //调用结束函数,相当于C语言的return 0 end //代码块结束,相当于C语言的'}' endmodule //模块结束

    为了让一个程序能够学到更多的东西,我们可以把上面的hello world程序修改的更加细致一些:

    coding_1.1

    `timescale 1ns/100ps module helloworld( input wire[3:0] a, //定义了输入端口a和b,输出端口result input wire[6:0] b, output reg result ); reg clk; assign a = 4'b0001; //初始化a和b assign b = 7'b0000001; initial begin result <= 0; //在a和b相等的条件下初始化result clk <= 0; $display("Hello,I am ready"); end always #50 clk = ~clk; always @(posedge clk) begin $display("Hello World!"); // $finish; end always @(clk) begin $display("sir,where am I?"); end always @ (result == 1) $display("haha"); endmodule

    思考2:wire和reg的区别?为什么a和b用assign...=赋值,而result用always...<=的形式赋值?

    数据类型及其运算符

    先介绍一下常见的两种数据类型:

    名称含义举例regregister寄存器类型reg[3:0] reg_a,reg_b;wirewire线型wire[4:0] wire_a,wire_b;

    针对上述思考2,应该可以观察到,reg型数据在always块中赋值,wire型数据在assign语句中赋值。这正是reg和wire的区别之一。其中wire对应连续赋值,如assign,reg对应过程赋值,如always和initial。

    wire综合之后一般是一根导线,reg则要根据条件判断是组合逻辑(与原先电路状态无关)还是时序逻辑(跟原先电路状态有关)。

    wire和reg的使用还是难以用以上几句话说清楚,大家自行继续思考呀~

    再介绍一下运算符:

    和C语言的运算符一毛一样!

    语法小结

    所有的过程块(initial、always)、assign连续赋值语句等,都是并行执行的。Verilog更加体现了数据传输的思想,表示一种通过变量名互相连接的关系。

    条件语句

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uI10eNgT-1601887728263)(龙芯班讲义——Verilog入门/image-20201003154811154.png)]

    常见的条件语句

    if……else、while、case()……endcase、forever begin……end、for(;;)等,具体与C相差无几。

    结构说明语句

    initial——初始化语句,运行程序就立即开始

    always——只要符合条件,就会一直执行

    思考3:always,while、for以及forever有什么区别?

    task——任务,task task_name(input a,……);……endtask

    function——函数,function function_name(input a,……);……endfunction

    思考4:任务和函数的区别,也可以扩展了解一下进程和线程的区别,加油!

    系统函数

    如上面的程序,$display函数就是一个非常有用的系统函数,这里我们不研究它的实现过程,只需要知道怎么用即可,如同C语言的printf,在不同的地方加一句printf,或许会对调试有很大的帮助!

    其他的函数还有$time、$setup、$write等,遇到的时候可以再进行了解。

    系统任务

    与系统函数相似,常用的有$readmemh、$readmemb、$finish、$stop等,其与系统函数的区别,与任务和函数的区别一致。

    必知必会

    include——文件包含,所有的代码写在一个文件里那是很头疼的一件事,就像所有的器官都长在脑袋里那样令人费解。include的作用就是将分开的文件联系在一起,具体请查询“预编译”相关解释。timescale—— timescale 10ns/10ps 其中10ns指时间单位,10ps指时间精度,模块中的时间均为10ns的整数倍,时间延迟的最小分辨率为10ps
    Processed: 0.014, SQL: 9