文章目录
前言
Verilog程序模块主要分为三个部分,下面我将详细介绍三个部分的主要内容,同时给出流水灯的实现代码
一、Verilog注释
1.//开头,表示以//开始到本行结束都是注释语句
2./* */多行注释(和java不一样)
二、Verilog关键字
常见的关键字,要熟悉
三、Verilog模块
1.Verillog的基本设计单元是**“模块”(block)**
2.一个模块是由两部分组成,一部分是描述接口,另一部分描述逻辑功能.
3.每个Verilog模块包括4个主要部分:
端口定义、IO说明 、内部信号定义、功能定义.
module block(a,b,c,d);// 端口定义
input a,b;
output c,d; //IO说明
assign c = a|b;
assign d = a&b; //功能定义
endmodule
assign是给线网数据类型进行赋值的方法
端口默认的是wire类型的变量
4.举例-流水灯
流水灯设计
module flow_led(
input sys_clk; //系统时钟
input sys_rst_in //系统复位,低电平有效
output reg[3:0] led //4个led灯
);
reg[23:0] counter; //这是内部信号,定义了一个变量
//计数器对系统时钟计数,计时0.2
always @ (posedge sys_rst or negedge sys_rst_in)
begin
if(!sys_rst_in)
counter <= 24'd0;
else if (counter<24'd1000_0000)
counter <= counter + 1'b1;
else
counter <= 24'd0;
end
//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @ (posedge sys_clk or negedge sys_rst_in)
begin
if(!sys_rst_in)
led <= 4'b0001;
else if(counter<24'd1000_0000)
led[3:0] <= {led[2:0],led[3]};
else
led <= led;
end
endmodule
5.功能定义部分有三种方法:
1.assign语句
描述组合逻辑
2.always语句
描述组合/时序逻辑
3.例化实例元件
如:and #2 u1(q,a,b);
上诉三种逻辑功能是并行的
需要注意的是 在always语句中,逻辑是顺序执行的,而多个always语句之间是并行的
6.模块的调用
在调用模块时,信号通过模块端口在模块之间传递
两个传递的信号之间位宽需要保持一致;
在例化子模块时.需要将子模块重新命名;
举例
module seg_led_static_top(
input sys_clk,
input sys_rst_n,
output[5:0] sel,
output[7:0] seg_led
);
//parameter define
parameter TIME_SHOW = 25'd25000_000;
//wire define
wire add_flag;
/*
main code
*/
//没隔 0.5s产生一个时钟周期的脉冲信号
time_count #(
.MAX_NUM (TIME_SHOW) //这是参数传递
) u_time_count(
.clk (sys_clk),//位宽保持一致
.rst_n (sys_rst_n),//输入可以是wire,也可以是reg
.flag (add_flag) //必须是wire类型
);
//time_count 模块
module time_count(
input clk,
input rst_n,
output reg flag
);
//parameter define
parameter MAX_NUM = 50000_000;
//reg define
reg [24:0] cnt;
另一种端口连接方式,不推荐
这种连接方式需要端口信号严格按照顺序排列(按照top模块的信号定义顺序)
time_count #(
.MAX_NUM (TIME_SHOW)
) u_time_count(
sys_clk,
sys_rst_n,
add_flag
);
标签:led,sys,程序模块,Verilog,模块,rst,input,流水 From: https://blog.csdn.net/2301_76707170/article/details/140593072