ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

阶段2-计数器练习15

2022-02-19 23:32:30  阅读:164  来源: 互联网

标签:15 clk 练习 en1 计数器 rst input reg dout


 

 还是需两个计数器,一个变量Z,计数器加1条件改为 dout !=0,这样可以省点资源

 1 module cnt_test(
 2                 clk,
 3                 rst_n,
 4                 en1,
 5 //                en2,
 6 //                en3,
 7                 dout
 8 );
 9 
10 input     clk;
11 input     rst_n;
12 input      en1;
13 //input      en2;
14 //input      en3;
15 
16 output [2:0] dout;
17 
18 reg [2:0]    dout;
19 //reg         flag_add;
20 
21 reg [3:0] cnt0;
22 reg [3:0] cnt1;
23 //reg [3:0] x;
24 //reg [3:0] y;
25 reg [3:0] z;
26 //reg [3:0] flag_sel;
27  
28 wire add_cnt0;
29 wire end_cnt0;
30 
31 wire add_cnt1;
32 wire end_cnt1;
33 
34 always @(posedge clk or negedge rst_n)begin
35     if(!rst_n)begin
36         cnt0 <= 0;
37     end
38     else if(add_cnt0)begin
39         if(end_cnt0)begin
40             cnt0 <= 0;
41         end
42         else begin
43             cnt0 <= cnt0 + 1;
44         end
45     end
46 end
47 
48 assign add_cnt0 = (dout != 0); //计数器条件,直接使用dout != 0;
49 assign end_cnt0 = add_cnt0 && cnt0 == 5 - 1; 
50 
51 always @(posedge clk or negedge rst_n)begin
52     if(!rst_n)begin
53         cnt1 <= 0;
54     end
55     else if(add_cnt1)begin
56         if(end_cnt1)begin
57             cnt1 <= 0;
58         end
59         else begin
60             cnt1 <= cnt1 + 1;
61         end
62     end
63 end
64 
65 assign add_cnt1 = end_cnt0;
66 assign end_cnt1 = add_cnt1 && cnt1 == 3 - 1; 
67 
68 always @(posedge clk or negedge rst_n)begin
69     if(!rst_n)begin
70         dout <= 0;
71     end
72     else if(en1)begin
73         dout <= z;
74     end
75     else if(end_cnt0)begin
76         dout <= 0;
77     end
78 end
79 
80 always @(*)begin
81     if(cnt1 == 0)begin
82         z = 1;
83     end
84     else if(cnt1 == 1)begin
85         z = 2;
86     end
87     else begin //省去if(cnt1 == 2) 
88         z = 3;
89     end
90 end
91 
92 endmodule

测试文件:

 1 module top_sim();
 2 
 3 reg clk;
 4 reg rst_n;
 5 reg en1;
 6 //reg en2;
 7 //reg en3;
 8 wire dout;
 9 
10 parameter CLK_CYCLE    = 20;
11 
12 initial begin
13     clk = 0;
14     forever begin
15         #(CLK_CYCLE/2);
16         clk = ~clk;
17     end
18         
19 end
20 
21 initial begin
22     #1;
23     rst_n = 0;
24     #(CLK_CYCLE*2);
25     rst_n = 1;
26 end
27 
28 initial begin
29     #1;
30     en1 = 0;
31 //    en2 = 0;
32 //    en3 = 0;
33     repeat(20)begin
34         #(10*CLK_CYCLE);
35         en1 = 1;
36         #(1*CLK_CYCLE);
37         en1 = 0;
38         #(10*CLK_CYCLE);
39         en1 = 1;
40         #(1*CLK_CYCLE);
41         en1 = 0;
42         #(10*CLK_CYCLE);
43         en1 = 1;
44         #(1*CLK_CYCLE);
45         en1 = 0;
46     end
47 end
48 
49 
50 cnt_test        u1(    
51                         .clk(clk),
52                         .rst_n(rst_n),
53                         .en1(en1),
54 //                        .en2(en2),
55 //                        .en3(en3),
56                         .dout(dout)
57                         
58 );
59 
60 endmodule 
View Code

仿真波形:

 

 还是利用之前的flag_add条件来计数:

  1 module cnt_test(
  2                 clk,
  3                 rst_n,
  4                 en1,
  5 //                en2,
  6 //                en3,
  7                 dout
  8 );
  9 
 10 input     clk;
 11 input     rst_n;
 12 input      en1;
 13 //input      en2;
 14 //input      en3;
 15 
 16 output [2:0] dout;
 17 
 18 reg [2:0]    dout;
 19 reg         flag_add;
 20 
 21 reg [3:0] cnt0;
 22 reg [3:0] cnt1;
 23 //reg [3:0] x;
 24 //reg [3:0] y;
 25 reg [3:0] z;
 26 //reg [3:0] flag_sel;
 27  
 28 wire add_cnt0;
 29 wire end_cnt0;
 30 
 31 wire add_cnt1;
 32 wire end_cnt1;
 33 
 34 always @(posedge clk or negedge rst_n)begin
 35     if(!rst_n)begin
 36         cnt0 <= 0;
 37     end
 38     else if(add_cnt0)begin
 39         if(end_cnt0)begin
 40             cnt0 <= 0;
 41         end
 42         else begin
 43             cnt0 <= cnt0 + 1;
 44         end
 45     end
 46 end
 47 
 48 assign add_cnt0 = flag_add; //引入一个信号flag_add
 49 assign end_cnt0 = add_cnt0 && cnt0 == 5 - 1; 
 50 
 51 always @(posedge clk or negedge rst_n)begin
 52     if(!rst_n)begin
 53         cnt1 <= 0;
 54     end
 55     else if(add_cnt1)begin
 56         if(end_cnt1)begin
 57             cnt1 <= 0;
 58         end
 59         else begin
 60             cnt1 <= cnt1 + 1;
 61         end
 62     end
 63 end
 64 
 65 assign add_cnt1 = end_cnt0;
 66 assign end_cnt1 = add_cnt1 && cnt1 == 3 - 1; 
 67 
 68 //得多用一组时序逻辑对flag_add进行赋值,增加寄存器
 69 always @(posedge clk or negedge rst_n)begin
 70     if(!rst_n)begin
 71         flag_add <= 0;
 72     end
 73     else if(en1)begin
 74         flag_add <= 1;
 75     end
 76     else if(end_cnt0)begin //注意,变为0的条件不是end_cnt1
 77         flag_add <= 0;
 78     end
 79 end
 80 always @(posedge clk or negedge rst_n)begin
 81     if(!rst_n)begin
 82         dout <= 0;
 83     end
 84     else if(en1)begin
 85         dout <= z;
 86     end
 87     else if(end_cnt0)begin
 88         dout <= 0;
 89     end
 90 end
 91 
 92 always @(*)begin
 93     if(cnt1 == 0)begin
 94         z = 1;
 95     end
 96     else if(cnt1 == 1)begin
 97         z = 2;
 98     end
 99     else begin //省去if(cnt1 == 2) 
100         z = 3;
101     end
102 end
103 
104 endmodule

仿真波形结果一样:

 

标签:15,clk,练习,en1,计数器,rst,input,reg,dout
来源: https://www.cnblogs.com/wen2376/p/15914110.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有