-->

【代码】错误范例

2020-12-04 03:54发布

——————————————————————————————————————————————————————————————————

逻辑冲突

 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
led_flu
 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
clk_1s

以上是错误示例,由于语句的并行特性,会造成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
led_flu
 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
clk_1s

if-else 嵌套结构使每个条件下都只唯一执行,不会造成赋值冲突

 

Mico系统添加的top文件里边最后一行少了一个回车,产生error 2 的错误

。。

错误提示

 

 

 

模块名称和调用处的不一样或打错,导致 xxx module cannot expanded

 

缺少位宽定义导致的各种错误

各模块端口之间要对其连接

 

计数寄存器位数不够导致不能触发计数最大值,不产生期待的效果

 

标签: