Verilog程序模块
模块的结构
? ?Verilog基本设计单元**“模块”(block)**
? ?模块由两部分组成,一部分描述接口,一部分描述逻辑功能
? ?每个Verilog程序主要包括4个部分:
? 端口定义、IO说明、内部信号声明、功能定义
module block(a,b,c,d);// 模块名(端口定义)//端口描述intput a,b;output c,d;//功能定义assign c = a | b;assign d = a & b;endmodule
? 功能定义部分有三种方法:
? ?1、assign语句 描述组合逻辑
? ?2、always语句 描述组合/时序逻辑
? ?3、例化实例元件 and #2 u1(q,a,b);
?上述三种逻辑功能并行执行。
always快中,逻辑是顺序执行的,多个always块之间是并行的。
module flow_led(intput sys_clk;input sys_rst_n;output reg [3:0] led;
);//内部信号声明
//reg define
reg [23:0] counter;//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negegde sys_res_n) beginif(!sys_rst_n)// <= 为非阻塞执行赋值counter <= 24'd0;else if (Counter < 24'd1000_0000)counter <= counter + 1'b1;elsecounter <= 24'd0;
end//通过移位寄存器控制IO口的高低电平,从而改变LED显示状态
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)led <= 4'b0001;else if(counter == 24d'1000_0000)//LED状态流水led[3:0] <= {led[2:0],led[3]};elseled <= led;
endendmodule;
模块的调用
? ?在模块调用时,信号通过模块端口在模块之间传递。
module time_count(input clk,input rst_n,output reg flag
);
parameter MAX_NUM = 50000_000;
reg [24:0] cnt;
//top顶层模块
module seg_led_static_top(intput sys_clk;intput sys_rst_n;output [5:0] sel;output [7:0] seg_led;
);parameter TIME_SHOW = 25d'25000_000;wire add_flag;
//每隔0.5s产生一个时钟周期的脉冲信号
//端口连接方式
time_count #(.MAX_NUM (TIME_SHOW) //参数传递
) u_time_count(//例化模块名.clk (sys_clk ),.rst_n (sys_rst_n ),.flag (add_flag )
);/*
//另一种端口连接方式
time_count #(.MAX_NUM (TIME_SHOW)
) u_time_count(sys_clk,sys_rst_n,add_flag
);
*///每当脉冲信号到达时,使数码管显示的数值加1
seg_led_static u_seg_led_static(.clk (sys_clk ),.rst_n (sys_rst_n ),.add_flag (add_flag ),.sel (sel ),.sel_led (seg_led )
);endmodule