FPGA学习笔记(四)——Verilog基本语法
###### 【该随笔部分内容转载自小梅哥】 #########
- 组合逻辑: 多路选择器、加法器、译码器、乘法器
- 时序逻辑: 计数器、分频器、定时器、移位寄存器
一、Verilog文件的基本结构
//模块描述方式一(先列出端口,再描述端口类型)
//此方式虽然行数多,但是方便后面例化端口,推荐使用
module name(
,
,
//最后一个不需要“,”
);
//端口类型描述
//功能描述
endmoule
//模块描述方式二(端口列表和端口类型一起描述)
module name(
//端口列表 + 类型描述
);
//功能描述
endmoule
二、数据类型
- 线与型wire(默认值z—高阻) 寄存器型reg
//一般格式:
reg[n-1 : 0] 存储器名[N-1 : 0];
//定义位宽为n,深度为N的寄存器组
- parameter型(常量参数)
三、数据表示
assign x = 4'b1001; //二进制
assign x = 4'd9; //十进制
assign x = 4'hc; //十六进制
四、运算
五、组合逻辑电路功能的描述
-
- 方式1:用assign描述,用阻塞赋值=
-
- 方式2:用always@(*)描述,用非阻塞赋值<=
-
- 方式1:三目运算符 ? : ;
-
- 方式2:if…else if…..else(分级)
-
- 方式3:switch…case….default…(并行)
//方式1(先列出端口,后定义端口属性)
module mux2(
a,
b,
sel,
out
);
//端口属性定义(输入/输出,位宽)
input [7:0]a;
input [7:0]b;
input sel; //sel = 0,out输出a
output [7:0]out; //位宽8位
//功能描述
//阻塞赋值语句
assign out = (sel == 0)?a:b;
//assign out = (!sel)?a:b;
//assign out = sel?b:a;
endmodule
//方式2(在声明端口的同时定义属性)
module mux2(
//端口属性定义
input [7:0]a,
input [7:0]b,
input sel,
output [7:0]out //此处没有分号
);
//功能描述
//阻塞赋值语句
assign out = (sel == 0)?a:b;
endmodule
例2.三态门控制
//三态门控制
assign oe = sel;
assign io = oe?out[0]:1'bz; //z高阻态(输入)
六、时序逻辑电路设计
例1.四位计数器(同步使能、异步复位)
module counter(clk,en,rst);
input clk; //时钟信号
input en; //使能信号
input rst; //清零信号
reg [3:0]cnt; //4位寄存器,用于计数
//同步清零和异步清零的问题
always@(posedge clk,negedge rst)
if(!rst)
cnt <= 4'd0;
else if(en)begin
cnt <= cnt + 1'b1;
else
cnt <= cnt;
end
endmodule
//1.取某一位直接操作
wire [2:0]m;
assign m = out[5:3];
//2.循环移位(移位寄存器)
reg [7:0] shift_a;
always@(posedge clk)
shift_a <= {shifta[0],shift[7:1]};
reg [7:0] shift_a;
wire data;
always@(posedge clk)
shift_a <= {data,shift[7:1]};
reg [7:0] shift_a;
wire data;
always@(posedge clk)
shift_a <= {shift[7:1],data};
//3、拼接
wire [3:0]x;
wire [3:0]y;
wire [7:0]z;
wire [31:0]n;
assign z = {x,y};
assign n = {x,7{x}};