verilog复习与vhdl入门
1.Verilog回顾
-
基本结构
verilog以module为单位,module的基本结构:
(1)模块声明(内含端口定义),如:
module (
input wire clk,
input wire rst_n,
output reg q
);
…
endmodule
(2)内部信号定义,内部参数定义,如:
reg [7:0] cnt;
parameter IDLE = 3‘b001;
(3)逻辑功能实现,如:
always @ (a or b) begin
if (!a) b <= 0;
else b <= 1;
end (组合逻辑)
always @ (posedge clk) begin
if (cnt == 3’b000) q <= 1;
end (时序逻辑)
assign data = a & b; (线网赋值)
(4)元件例化,如:
and a3 (
.clk (clk),
.rst_n (rst_n),
.q (q)
); (端口映射,用信号名关联)
-
常用语句
(1)逻辑实现
条件语句(组合逻辑记得写else),case语句(组合逻辑记得写default),
always语句(电平敏感——组合逻辑;边沿敏感——时序逻辑,一个always只处理一个信号)
(2)仿真实现
initial块(给输入信号赋初值/构建输入波形),always语句(此处只有延时,用于时钟创建),
元件例化(写testbench就是写一个模块去调用要仿真的模块)
(3)注释:// 和/* */
-
编程重要思想
(1)计数器
初步理解,常用于控制时序,利用计数的值实现在特定时间做某些动作
已尝试的场合:结合case语句,在计数到某个值时做特定动作
(2)有限状态机
初步理解,解决多状态事件常用,一般步骤:
根据具体问题,抽象出事件发展时的所有状态;
选择起始状态,并使用合适的状态编码;
画出状态转换图,标出转换条件与输出;
根据此图写描述代码,常用两段式(状态转换+输出处理),注意未用到状态的处理;
常用语句:case语句,if语句,always语句
(3)流水线
未使用。
2.VHDL回顾
3.Verilog与VHDL的联系
-
相同的层次化设计思想
无论是哪种语言,设计一个规模不小的电路,层次化设计的方法论是必须的,
其中两大核心:模块划分和模块重用,总是适用的。
模块划分原则:
(1)模块功能单一,与其他模块相对独立
(2)模块间的连接要简单
(3)设计参数化的模块,根据参数的不同,实现结构类似功能不同的一类电路,
而参数值的改变,在上层模块调用下层模块时可进行值的覆盖。
模块重用:
类似与软件编程中的函数,使代码功能专门化,但不同的是,由于设计的是硬件电路,即使需要的都是同样的功能,只是在不同的地方使用,在电路中也要复制出相应数量的物理实体,这从RTL网表中可以看出。
-
相同的并行处理思想
两种语言的并行处理源自于硬件电路的并行性,HDL代码对应的都是电路中的模块,只要电路一上电,各个模块就会同时开始各自的工作,即使有时钟的控制。钟控使得模块可以按照一定的节奏执行动作,但实际上并行没有改变。
举个不太生动的例子:
组合逻辑好比往没有阀门的水管通水,数据流一旦进入,就会立即被处理,然后输出,中间没有等待;
而时序逻辑好比在管子上加了许多阀门,像竹子一般,所有阀门同开同闭,水流是一节一节地往外走;
两个过程中,各部分水管的工作不会相互阻碍,像流水线一般,每个工人都在干活,没有停下的。
-
always vs process
verilog中的always,vhdl中的process,都是一个模块中逻辑功能实现的主要手段,两种语句都表现出相似的四种特性:反复执行,多个之间并行执行,块内顺序执行,需要触发
反复执行与需要触发:
always和process中的语句执行都要有条件:电平敏感/边沿敏感,通常的执行过程是:等待触发——触发——执行动作——挂起并等待下一次触发,这个过程从系统上电开始,直到系统掉电结束。
多个之间并行与块内顺序执行:
由于都是模块功能实现语句,多个always/process之间的关系就像电路中各个模块之间的关系,相互之间既有信号交流,又互不干扰,各自工作。
-
阻塞赋值与变量赋值,非阻塞赋值与信号赋值
这两种情况不是完全类似,但主要特性十分相似。
阻塞赋值与变量赋值都是立即生效的,在赋值号右边的表达式值计算完成,便立即被赋予到左边的信号中;
非阻塞赋值和信号赋值都具有延迟,在计算表达式值后,更新信号这个事件会挂起,直到整个过程块执行完毕,信号才会更新。