Verilog设计初步

Verilog 代码模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//语句关键字字母都为小写字母,大小写敏感
//硬件思维来写代码
//命名不能以数字开头

module <顶层模块名> (输入输出端口列表) //定义输入输出端口列表
output 输出端口列表; //输出端口生声明
input 输入端口列表; //输入输出端口生命

/*定义数据类型,功能定义,函数实现*/
reg 信号名;

//逻辑功能定义
assign<结果信号名> = <表达式>;

//用always块描述逻辑功能
always @(<敏感信号>)
begin
//过程赋值运算
//语句,if else while task
end
//调用其他模块
<调用模块名module_name><例化模块名>(<端口列表>);

//门元件例化
门元件关键字<例化门元件名>(<端口列表port_list>);
endmodule

四位选择器

1
2
3
4
5
6
7
8
9
module mux4_1(out,in0, in1, in2,in4,sel);
output out;
input in0,in1,in2,in3;
input[1:0]
reg out;

always @(in0 or in1 or in2 or in3 or sel)
begin
case(sel)

数据类型及运算符

  • 整数类型
    • 构成是:字符宽度+进制+数值。
    • 例如:2’0xd5; 宽度为2的十六进制d5。
  • 逻辑类型
    • 高低电平 1 0,电路里体现为电压的区间
    • x:未知
    • z: 高阻
  • net类型
    • 常用的是wire。用法是 wire[7:0] databus。 //databus宽度8
  • 寄存器类型
    • reg
    • integer
    • time
    • real
    • realtime
  • parameter参数
    • 用来定义符号常量。 parameter sel = 8’ha3。
  • 向量类型
  • 逻辑运算符
  • 位运算符
  • 三目运算
  • 位拼接运算符

下例采用数据流方式描述1位全加器。

在本例中,有两个连续赋值语句。这些赋值语句是并发的,与其书写的顺序无关。只要
连续赋值语句右端表达式中操作数的值变化(即有事件发生), 连续赋值语句即被执行。如果A
变化,则两个连续赋值都被计算,即同时对右端表达式求值,并将结果赋给左端目标。

语句

  • initial
  • always @(敏感信号)
    • @ (posedge clk) 上升沿
    • @ (negedge clk) 下降沿触发
  • 赋值语句
    • 连续赋值语句assign 只要连续赋值语句右端表达式中操作数的值变化, 连续赋值语句即被执行。
    • 阻塞赋值 a = b; ————-非时序赋值(组合)
    • 非阻塞赋值 a<=b ————时序赋值中使用
    • 时序和组合在电路上的表现是时序赋值过程中需要等待时钟沿来触发。

函数

设计特点

层次化模块化

顶层模块和底层模块的设计方法,将模块细分为若干个子模块,在底层实现子模块功能,在顶层组合各个子模块。