Verilog入门

Verilog入门

前言

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

名词解释

Verilog

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ff1aWuxA-1601887728248)(D:\github\Blog\source_posts\龙芯班讲义——Verilog入门\image-20200929210846866.png)]

wikipedia:

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

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

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

VHDL

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

FPGA

wikipedia:

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K57C16NP-1601887728253)(D:\github\Blog\source_posts\龙芯班讲义——Verilog入门\image-20200930154001387.png)]

看起来是不是比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

思考2wirereg的区别?为什么abassign...=赋值,而resultalways...<=的形式赋值?

  • 数据类型及其运算符

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

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

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

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

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

再介绍一下运算符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NM3q4I7r-1601887728258)(D:\github\Blog\source_posts\龙芯班讲义——Verilog入门\image-20201003132847066.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0Rku4NT-1601887728260)(D:\github\Blog\source_posts\龙芯班讲义——Verilog入门\image-20201003095612690.png)]

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

语法小结

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

条件语句

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

  • 常见的条件语句

    if……elsewhilecase()……endcaseforever begin……endfor(;;)等,具体与C相差无几。

结构说明语句

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

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

    思考3alwayswhilefor以及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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值