做一些关于Verilog的简要笔记,方便日后快速复习,如有错漏希望您能够不吝赐教
1. 功能定义
首先搬上一份原子哥的流水灯代码便于对照
module flow_led(input sys_clk, //系统时钟
input sys_rst_n, //低电平有效的系统复位
output reg [3:0] led //4个LED灯
);
reg [23:0] counter;
/***************main code(功能定义)**************/
always @(posedge sys_clk or negedge sys_rst_n)begin
if (!sys_rst_n)
counter <= 24'd0;
else if(counter < 24'd1000_0000)
counter <= counter + 1'b1;
else
counter <= 24'd0;
end
always @(posedge sys_clk or negedge sys_rst_n )begin
if (!sys_rst_n)
led <= 4'b0001;
else if(counter == 24'd0000_0000)
led[3:0] <= {led[2:0],led[3]};
else
led <= led;
end
endmodule
功能定义的三种方式
1.assign描述组合逻辑
2.always描述组合/时序逻辑(always块中,逻辑为顺序执行)
3.实例化元件
上述三种语句块之间为并行执行
2. 元件例化
还是先以一段代码举例
/***************底层模块**************/
module time_counter(input clk,
input rst_n
output reg flag
);
parameter MAX_NUM = 50000_0000;
...
endmodule
/***************上层模块**************/
module seg_led( input sys_clk,
input sys_rst_n,
ouput [7:0] seg
);
parameter TIME_SHOW 25'd25000_000;
wire change_flag; //变化通知信号
//例化元件
time_counter #(.MAX_NUM (TIME_SHOW))
my_counter( .clk (sys_clk),
.rst_n (sys_rst_n),
.flag (change_flag)
);
...
endmodule
//例外一种例化方式
time_counter #(.MAX_NUM (TIME_SHOW))
my_counter( sys_clk,
sys_rst_n,
change_flag
);
或许你还注意到了参数的改变,实际上这样的参数修改方式增强了低层元件的可移植性,所以设计一定的参数有利于系统的移植,便于上层修改