我想以一个例子来说明:LED的闪烁灯,下面是我摘抄的一位同学的代码:
module LED(clk, rst_n, led); //clk = 50M
input clk ;
input rst_n ;
ouput led ;
reg led ;
reg [24:0] cnt ;
always @ (posedge clk or negedge rst_n)
begin
if (rst_n == 1'b0)
begin
cnt <= 25'b0;
led <= 1'b0 ;
end
else if(cnt == 25'd25000000)
begin
cnt <= 25'b0;
led <= ~led ;
end
else
begin
cnt <= cnt + 1'b1;
end
end
endmodule
这段代码并不难,可以说非常简单,大概意思是,让LED亮500ms,然后再熄灭500ms,如此循环。程序下载能正常运行。但是这样的代码风格我并不能苟同,这样的风格有软件编程的风格,而没有硬件的层次风格。如果程序再大一点,一个always块中,做这事又做那事,我想读代码的人会头晕。我想说的是一个always块中尽量干一件事,尽量有硬件电路的层次感。就像组合逻辑要和时序逻辑分开编码一样,组合逻辑一块,时序逻辑一块,非常有层次感。下面我改写上面的程序,将计数器电路和LED状态电路分开编码在两个always块中:
module LED(clk, rst_n, led); //clk = 50M
input clk ;
input rst_n ;
ouput led ;
reg led ;
reg [24:0] cnt ;
wire cnt_500ms = (cnt == 25'd25000000); //计数到500ms
always @ (posedge clk or negedge rst_n)
begin
if (rst_n == 1'b0) cnt <= 25'b0;
else if (cnt_500ms == 1'b1) cnt <= 25'b0;
else cnt <= cnt + 1'b1;
end
always @ (posedge clk or negedge rst_n)
beign
if (rst_n == 1'b0) led <= 1'b0;
else if (cnt_500ms == 1'b1) led <= ~led;
end
endmodule
我不敢说,我的这样的风格是最好的,但是可以说层次很清楚,哪些电路在前,哪些在后,非常清晰,欢迎大家批评指正。
用户1516747 2010-2-11 00:07