FLDPMpang's blog FLDPMpang's blog
随笔
归档
分类
标签
关于
友链
GitHub (opens new window)

FLDPMpang

都不知道该干什么
随笔
归档
分类
标签
关于
友链
GitHub (opens new window)
  • 算法与数据结构

  • Python

  • X86汇编

  • FPGA

    • FPGA学习笔记-VerilogHDL的基本语法
      • 数字表示
      • 参数
      • 变量
        • 线网(wire)
        • 寄存器(reg)
      • 向量
      • 整数与实数
      • 字符串
      • 数组
      • 宏定义
      • 编译说明
      • 运算符
      • 赋值
        • 连续赋值
      • 语句块
      • 判断语句
        • if-else
        • case
      • 循环语句
        • 无限循环
        • 固定次数循环
        • for,while
  • 代码
  • FPGA
FLDPMpang
2020-12-15

FPGA学习笔记-VerilogHDL的基本语法

Verilog HDL 是一种用于数字逻辑电路设计的语言 它与之前学过的高级编程语言大不一样,Verilog HDL 行为描述语言作为一种结构化和过程性的语言

# 模块结构

module        //声明模块开始
  module_name(input a,input b, output cc...);
  //模块I/O说明
    reg [x:0] R1,R2, ...;   wire [x:0] W1,W2, ...;
    //内部信号说明

    assign a=b&c;     //声明语句,并行执行
    always (....)
      begin                         内部顺序执行
        if(clr) ....;
        else ...;

      end


endmodule

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 数据类型

# 数字表示

10 = 32'd10 = 32'b1010
<位宽><进制(B,O,D,H)><数字>

-1 = -32'd1 = 32'hFFFFFFFF
x 代表不定值,z 或?代表高阻值。

'BX = 32'BX = 32'BXXXXXXX…X
减号写在数字定义表达式的最前面。

"AB" = 16'B01000001_01000010
使用下划线分隔开数的提高可读性

# 参数

parameter e=25, f=29.2;

parameter byte_size=8, byte_msb=byte_size-1;

跨模块改变参数时使用defparam命令

# 变量

# 线网(wire)

wire 类型表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。如果没有驱动元件连接到 wire 型变量,缺省值一般为 "Z" (默认输出信号为 wire 型)

wire [n-1:0] 数据名1,数据名2,…数据名i;
//共有i条总线,每条总线位宽为n  ( ( n - 1 ) - 0 + 1 )
1
2

# 寄存器(reg)

寄存器表示是数据储存单元

  • 在"always"块内被赋值的每一个信号都必须定义成 reg 型.
reg [n-1:0] 数据名1,数据名2,… 数据名i;
//缺省值为不定值
1
2

# 向量

当位宽大于 1 时,wire 或 reg 即可声明为向量的形式

reg [n-1:0] qwq;
wire [0:31] art;
1
2

# 整数与实数

integer a; //默认为32位
real f;

initial begin
	f=3.8;
	a=f; //a=3 截尾
end

1
2
3
4
5
6
7
8

# 字符串

字符串保存在 reg 类型的变量中,每个字符占用一个字节(8bit)

reg [0: 25*8-1]       str ;
assign str = "www.fldpmpang.website";
1
2

# 数组

可声明 reg, wire, integer, time, real 及其向量类型的数组

integer [5:0] a [7:0];
reg [31:0] d_4d [11:0][3:0][3:0][255:0];

a[1] = 6'd0;
d_4d[0][0][0][15:0] = 15'd3;
1
2
3
4
5

# 编译指令

# 宏定义

`define DATA 32 #整个编译过程都有用,其他文件也可使用
`undef DATA
1
2
`ifdef       MCU51
    parameter DATA_DW = 8   ;
`elsif       WINDOW
    parameter DATA_DW = 64  ;
`else
    parameter DATA_DW = 32  ;
`endif

1
2
3
4
5
6
7
8

# 编译说明

`include "xxx.v"  #包含到设计文件

`timescale 1ns/1ps # 时间单位和时间精度,与实际时间相关联

1
2
3
4

# 运算符和表达式

# 运算符

语法,真值,优先级与 C 语言相同,

  • 算术运算符 +,-,×,/,%

整数除法结果截取整数,取模符号由被膜数决定

  • 赋值运算符=,<=

  • 关系运算符>,<,>=,<=

==和!= 当位是不定值 x 和高阻值 z,结果为不定值 x

=== 和!==比较时对位的不定值 x 和高阻值 z 也进行比较

  • 逻辑运算符&&,||,!

  • 条件运算符? :

  • 位运算符~,|,^,&,^~

不同长数据进行位运算时,将两者按右端对齐.位数少的操作数会在相应的高位用 0 填满

  • 移位运算符<<,>>

移位运算都用 0 来填补移出的空位

  • 拼接运算符{ }

还可以用重复法来简化表达式

# 赋值


b<=a
非阻塞:下一条语句与当前赋值语句同时进行(容易使用旧值)

b=a
阻塞:赋值后再执行下一条语句

1
2
3
4
5
6
7

# 连续赋值

wire 变量的连续赋值语句都是以 assign 开头

assign     LHS = RHS  ; # 右值发生变化时左值立即更新
1

# 语句

# 语句块

加入块名可以

  • 定义局部变量
  • 被块内语句调用
  • 块内变量地址固定

# 判断语句

# if-else

if(expression)
	do...
elif
	do..
else

1
2
3
4
5
6

# case

case (expression)
  expression1 : do..;
  expression2 : do..;
  expression3 : do..;
  .
  default : do...;

endcase
1
2
3
4
5
6
7
8

每一个 case 分项的分支表达式的值互不相同

执行完 case 分项后的语句,则跳出该 case 语句结构,终止 case 语句的执行

casez 不考虑 z 的比较,casex 不考虑 z 和 x 的比较

# 循环语句

# 无限循环

forever
begin
  ;
end
1
2
3
4

# 固定次数循环

repeat (expressions)
begin
  do_something
end

1
2
3
4
5

# for,while

以下的for,while两种循环等价(语法与 C 语言类似)

pre_do;
while(expressions)
  begin
    do_something;
    re_do;
  end



for (pre_do;expressions;re_do)
  begin
    do_something;
  end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#FPGA#Verilog
上次更新: 2021/10/26, 17:07:02
X86汇编语言学习(三)内存控制

← X86汇编语言学习(三)内存控制

最近更新
01
2021冬
11-09
02
X86汇编语言学习(三)内存控制
09-01
03
X86汇编语言学习(二)-Bochs使用与调试方法
08-10
更多文章>
Theme by Vdoing | Copyright © 2020-2021 @2021FLDPMpang

本网站由提供加速服务
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×