什么是 Verilog 语言
Verilog
一般指Verilog HDL。Verilog HDL
是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
Verilog 语言要素
Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。这是因为C语言在Verilog设计之初,已经在许多领域得到广泛应用,C语言的许多语言要素已经被许多人习惯。一种与C语言相似的硬件描述语言,可以让电路设计人员更容易学习和接受。不过,Verilog与C语言还是存在许多差别。另外,作为一种与普通计算机编程语言不同的硬件描述语言,它还具有一些独特的语言要素,例如向量形式的线网和寄存器
、过程中的非阻塞赋值
等。总的来说,具备C语言的设计人员将能够很快掌握Verilog硬件描述语言。
Verilog基本语法
Verilog基本结构
/* 模块声明 */
module flowing_light(
/* 端口定义 */
input clk,
input rst,
output [15:0] led
);
/* 信号类型声明 */
reg [29:0] cnt_reg;
reg [15:0] light_reg;
always@ (posedge clk) begin
/* 功能描述 */
if(!rst)
cnt_reg <= 0;
else if (cnt_reg >= 100000000)
cnt_reg <= 0;
else
cnt_reg += 1;
end
always@ (posedge clk) begin
/* 功能描述 */
if(!rst)
light_reg <= 16'h0001;
else if(cnt_reg == 29'd100000000) begin
if(light_reg == 16'h8000)
light_reg <= 16'h0001;
else
light_reg <= light_reg << 1;
end
end
assign led = light_reg;
/* 模块结束声明 */
endmodule
Verilog 常用信号类型
wire型
输出始终随输入的变化而变化的变量,表示结构实体,如门店了之间的物理连接。
reg型
对应具有状态保持作业的电路元件,如触发器、寄存器等。
Always 块
always块的基本说明
- 主要描述逻辑功能的块
- 括号内为敏感信号表
组合逻辑快块
always (*) begin
/* 逻辑语句 */
end
时序逻辑块
always (posedge clk) begin
/* 逻辑语句 */
end
带异步下降沿复位的时序逻辑块
always (posedge clk or negedge rst) begin
/* 逻辑语句 */
end
always@(*)和always不加@的区别
- 若没有@,则是一般在teastbench 中产生时钟信号,指不会满足特定的条件,执行完一次后立马继续执行下一次,一直重复执行。
- 有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行。
所以说:当使用always块生成时钟信号时,不用加上@,加上之后编译会发生错误。
模块例化
/* 模块定义 */
module add(
input a,b;
output c;
assign c=a+b);
endmodule
/* 模块定义 */
module double_add(
input d,e,f,
output g
);
/* 模块例化1 */
/* add:模块名;add_inst1:例化名称 */
add add_inst1(
/* 端口映射 */
.a(d),
.b(e),
.c(temp)
);
/* 模块例化2 */
add add_inst2(
/* 端口映射 */
.a(f),
.b(temo),
.c(g)
);
endmodule
网友评论