ICode9

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

计数器阶段9 - 练习一

2022-03-19 21:04:18  阅读:183  来源: 互联网

标签:soid en soic clk 练习 计数器 阶段 rst reg


题目:

 

 

 

把时序画的具体点:

 

 

 设计关键点:

(1)、需用到两个计数器,计数器cnt0 用于产生1M的soic时钟计数,系统100M,产生1M,需计数100次; 计数器cnt1用于对bit位数进行计数,需发送12bit。

(2)、增加flag_add,用于标出需要计数的阶段。

(3)、 soic 在cnt1=0和cnt1=11期间,需保持为高,不能拉低,用于产生起始位和停止位。

(4)、soid 是在soic低电平中间改变,soic高电平期间保持不变。

代码:

  1 module sccb(
  2                 clk,
  3                 rst_n,
  4                 en,
  5                 
  6                 soic,
  7                 soid
  8 );
  9 parameter     SOIC_1M = 100;
 10 
 11 input            clk;
 12 input            rst_n;
 13 input            en;
 14     
 15 output             soic;
 16 output            soid;
 17     
 18 wire             add_cnt0;
 19 wire             end_cnt0;
 20 wire             add_cnt1;
 21 wire             end_cnt1;
 22 wire [12-1:0]    data;
 23 
 24 reg             flag_add;
 25 reg             soic;
 26 reg             soid;
 27 
 28 reg    [8-1:0]        cnt0;
 29 reg    [4-1:0]        cnt1;
 30 
 31 assign data = {1'b0,8'h5a,1'b1,1'b0,1'b1};  //将数据拼接好,起始位、8bit数据、ack位、停止位、还有最后将soid拉高
 32 
 33 always @(posedge clk or negedge rst_n)begin
 34     if(!rst_n)begin
 35         cnt0 <= 0;
 36     end
 37     else if(add_cnt0)begin
 38         if(end_cnt0)begin
 39             cnt0 <= 0;
 40         end
 41         else begin
 42             cnt0 <= cnt0 + 1;
 43         end
 44     end
 45 end
 46 
 47 assign add_cnt0 = flag_add;
 48 assign end_cnt0 = add_cnt0 && cnt0 == SOIC_1M - 1;
 49 
 50 always @(posedge clk or negedge rst_n)begin
 51     if(!rst_n)begin
 52         cnt1 <= 0;
 53     end
 54     else if(add_cnt1)begin
 55         if(end_cnt1)begin
 56             cnt1 <= 0;
 57         end
 58         else begin
 59             cnt1 <= cnt1 + 1;
 60         end
 61     end
 62 end
 63 
 64 assign add_cnt1 = end_cnt0;
 65 assign end_cnt1 = add_cnt1 && cnt1 == 12 - 1;
 66 
 67 always @(posedge clk or negedge rst_n)begin
 68     if(!rst_n) begin
 69         flag_add <= 0;
 70     end
 71     else if(en)begin
 72         flag_add <= 1;
 73     end
 74     else if(end_cnt1)begin
 75         flag_add <= 0;
 76     end
 77 end
 78 
 79 //soic 在cnt1=0和cnt1=11期间,需保持为高,不能拉低,产生起始位和停止位
 80 always @(posedge clk or negedge rst_n)begin
 81     if(!rst_n) begin
 82         soic <= 1;
 83     end
 84     else if(add_cnt0 && cnt0 == SOIC_1M/2 &&  cnt1 != 0 && cnt1 != 11)begin
 85         soic <= 0;
 86     end
 87     else if(end_cnt0)begin
 88         soic <= 1;
 89     end
 90 end
 91 
 92 //soid 是在soic低电平中间改变,soic高电平期间保持不变
 93 always @(posedge clk or negedge rst_n)begin
 94     if(!rst_n)begin
 95         soid <= 1;
 96     end
 97     else if(add_cnt0 && cnt0 == 75-1)begin // && cnt1 >= 0 && cnt1 < 12
 98         soid <= data[11-cnt1];
 99     end
100 end
101 
102 endmodule

仿真代码:

 1 module sccb_sim;
 2 
 3 reg     clk;
 4 reg     rst_n;
 5 reg     en;
 6 
 7 wire    soic;
 8 wire    soid;
 9 
10 parameter CLK_CYCLE = 10;  //100M,时钟周期是10ns 
11 
12 initial begin
13         clk = 0;
14         forever #(CLK_CYCLE/2) clk = ~clk;
15 end
16 
17 initial begin
18         #1;
19         rst_n = 0;
20         #(CLK_CYCLE*10);
21         rst_n = 1;
22 end
23 
24 initial  begin
25         #1;
26         en = 0;
27         #(CLK_CYCLE*15);
28         repeat(10)begin
29             en = 1;
30             #(CLK_CYCLE);
31             en = 0;
32             #(CLK_CYCLE*$urandom_range(1300,1500));
33         end
34 end
35 
36 sccb    sccb_inist(
37                         .clk(clk),
38                         .rst_n(rst_n),
39                         .en(en),
40                         
41                         .soic(soic),
42                         .soid(soid)
43                 );
44 
45 
46 endmodule 

仿真波形:

 

标签:soid,en,soic,clk,练习,计数器,阶段,rst,reg
来源: https://www.cnblogs.com/wen2376/p/16027914.html

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

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

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

ICode9版权所有