【代码】错误范例
——————————————————————————————————————————————————————————————————
逻辑冲突
1 //定义模块输入输出 2 module LED_LIGHT 3 ( 4 input clk_in, 5 input rst_n_in, 6 output [7:0]led 7 ); 8 //****************************************************** 9 parameter CLK_DIV_PERIOD = 25_000_000;//频率25Mhz 10 11 reg [7:0]state; 12 reg [3:0]cnt; 13 //******************************************************** 14 clk_1s U1 //1s模块 15 ( 16 .clk_in(clk_in), 17 .rst_n_in(rst_n_in), 18 .clk_1s(clk_1s) 19 ); 20 //************************************************************ 21 always@(posedge clk_1s or negedge rst_n_in) 22 begin 23 if(!rst_n_in) 24 begin 25 state<=1'd0; 26 cnt<=0; 27 end 28 else 29 begin 30 state<=state+1'b1; 31 cnt<=cnt+1; 32 if(cnt==8) 33 state<=1'd0; 34 end 35 end 36 //*************************************************************** 37 always@(posedge clk_in) 38 begin 39 case (state) 40 0:begin state<=8'b00000001;end 41 1:begin state<=8'b00000010;end 42 2:begin state<=8'b00000100;end 43 3:begin state<=8'b00001000;end 44 4:begin state<=8'b00010000;end 45 5:begin state<=8'b00100000;end 46 6:begin state<=8'b01000000;end 47 7:begin state<=8'b10000000;end 48 default: begin state<=8'b00000000;end 49 endcase 50 end 51 /****************************************************/ 52 assign led=~state; 53 54 endmodule 55 56 不在电脑前?没关系,QQ手机版让你随时随地接收消息!立刻安装 57 张慢慢 14:35:44 58 module clk_1s 59 ( 60 input clk_in, 61 input rst_n_in, 62 output clk_1s 63 ); 64 65 parameter CLK_PERIOD = 25_000_000; //频率25Mhz 66 67 reg [25:0]cnt; 68 reg pulse; 69 70 assign clk_1s=pulse; 71 72 always@(posedge clk_in or negedge rst_n_in) 73 begin 74 if(!rst_n_in) 75 cnt<=1'b0; 76 else 77 cnt<=cnt+1'b1; 78 if(cnt==(CLK_PERIOD-1)) 79 pulse<=1'b0; 80 if(cnt <(CLK_PERIOD/2)) pulse<=1'b0; 81 else pulse<=1'b1; 82 end 83 endmodule
1 module clk_1s 2 ( 3 input clk_in, 4 input rst_n_in, 5 output clk_1s 6 ); 7 8 parameter CLK_PERIOD = 25_000_000; //频率25Mhz 9 10 reg [25:0]cnt; 11 reg pulse; 12 13 assign clk_1s=pulse; 14 15 always@(posedge clk_in or negedge rst_n_in) 16 begin 17 if(!rst_n_in) 18 cnt<=1'b0; 19 else 20 cnt<=cnt+1'b1; 21 if(cnt==(CLK_PERIOD-1)) 22 pulse<=1'b0; 23 if(cnt <(CLK_PERIOD/2)) pulse<=1'b0; 24 else pulse<=1'b1; 25 end 26 endmodule
以上是错误示例,由于语句的并行特性,会造成reg赋值时冲突,产生不确定状态
下面是优化后的代码
1 //定义模块输入输出 2 module LED_LIGHT 3 ( 4 input clk_in, 5 input rst_n_in, 6 output [7:0]led 7 ); 8 //****************************************************** 9 parameter CLK_DIV_PERIOD = 25_000_000;//频率25Mhz 10 11 reg [7:0]state;//一个寄存器只能在一个always内赋值 12 reg [3:0]cnt; 13 14 wire clk_1s; 15 //******************************************************** 16 clk_1s U1 //1s模块 17 ( 18 .clk_in(clk_in), 19 .rst_n_in(rst_n_in), 20 .clk_1s(clk_1s) 21 ); 22 //************************************************************ 23 always@(posedge clk_1s or negedge rst_n_in) 24 if(!rst_n_in) 25 cnt<=0; 26 else if(cnt==7) 27 cnt<=0; 28 else 29 cnt<=cnt+1'd1; 30 31 //*************************************************************** 32 always@(posedge clk_in ) 33 case (cnt) 34 0: state<=8'b00000001; 35 1: state<=8'b00000010; 36 2: state<=8'b00000100; 37 3: state<=8'b00001000; 38 4: state<=8'b00010000; 39 5: state<=8'b00100000; 40 6: state<=8'b01000000; 41 7: state<=8'b10000000; 42 default: state<=8'b00000000; 43 endcase 44 45 /****************************************************/ 46 assign led=~state; 47 48 endmodule
1 module clk_1s 2 ( 3 input clk_in, 4 input rst_n_in, 5 output clk_1s 6 ); 7 8 parameter CLK_PERIOD = 25_000_000; //频率25Mhz 9 10 reg [25:0]cnt; 11 reg pulse; 12 13 assign clk_1s=pulse; 14 15 always@(posedge clk_in or negedge rst_n_in) 16 begin 17 if(!rst_n_in) 18 cnt<=1'b0; 19 else if(cnt==(CLK_PERIOD-1)) 20 begin cnt<=1'b0; pulse<=1'b1; end 21 else 22 begin cnt<=cnt+1'b1; pulse<=1'b0; end 23 24 25 end 26 endmodule
if-else 嵌套结构使每个条件下都只唯一执行,不会造成赋值冲突
Mico系统添加的top文件里边最后一行少了一个回车,产生error 2 的错误
。。
错误提示
模块名称和调用处的不一样或打错,导致 xxx module cannot expanded
缺少位宽定义导致的各种错误
各模块端口之间要对其连接
计数寄存器位数不够导致不能触发计数最大值,不产生期待的效果