在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2140|回复: 2

[求助] 求大神助我完成作业

[复制链接]
发表于 2013-4-23 21:31:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
作业要求编写可综合模块能把符合I2C串行总线要求的地址和数据信号,在只有sda和scl两个信号的前提下转换为并行的数据和地址信号。


作业是要参考下面这个程序进行的,我不太明白,在M1这个模块里,完成了串行数据流sdabuf的传输,但是这个变量却不是一个端口,串行数据不应该是个output么?
还有上面的作业我一头雾水啊,求大神指导!!!



夏宇闻《Verilog 数字系统设计教程》P216

设计两个可综合电路模块:M1模块能把4位的并行数据转换为符合以下协议的串行数据流,数据流用scl和sda两条线传输,sclk为输入的时钟信号,data[3:0]为输入数据,ack为M1的请求M0发新数据信号。第二个模块M2能把串行数据流内的信息接收到,并转换为相应16条信号线的高电平,即若数据为1,则第一条线路为高电平,数据为n,则第n条数据线为高电平。M0为 测试用的信号发生模块,该模块接收M1发出的ack信号,并产生新的测试数据data[3:0]。

通信协议:scl为不断输出的时钟信号,如果scl为高电平时,sda由高变低时刻,串行数据流开始;如果scl为高电平时,sda由低变高时刻,串行数据流结束。sda信号的串行数据位必须在scl为低电平时变化,若变为高则为1,否则为0。

M1模块的代码如下


  1 `timescale 1ns/1ns
  2 module ptosda
  3 (
  4
input sclk,
  5
input rst_n,
  6
input [3:0] data,
  7
output
reg ack,
  8
output
reg scl,
  9
output sda
10 );
11
12 reg link_sda;
13 reg sdabuf;
14 reg [3:0] databuf;
15 reg [7:0] state;
16
17 parameter ready =
8'b0000_0001,
18         start =
8'b0000_0010,
19         bit1  =
8'b0000_0100,
20         bit2  =
8'b0000_1000,
21         bit3  =
8'b0001_0000,
22         bit4  =
8'b0010_0000,
23         bit5  =
8'b0100_0000,
24         stop  =
8'b1000_0000,
25         idle  =
8'b0000_0000;
26
27 assign sda = link_sda?sdabuf:1'bz;
28
29 always @ (posedge sclk,negedge rst_n)
30 begin
31
if(!rst_n)    scl <=
1'b1;
32
else            scl <=
~scl;
33 end
34
35 always @ (posedge ack)
36 begin
37     databuf <= data;
38 end
39
40 always @ (negedge sclk or
negedge rst_n)
41 begin
42
if(!rst_n)
43
begin
44         link_sda<=1'b0;
45         state <= ready;
46         sdabuf<=1'b1;
47         ack<=1'b0;
48
end
49
else
50
begin
51
case(state)
52         ready:
53
if(ack)
54
begin
55                 link_sda<=1'b1;
56                 state <= start;
57
end
58
else
59
begin
60                 link_sda<=1'b0;
61                 state<=ready;
62                 ack<=1'b1;
63
end
64         start:
65
if(scl && ack)
66
begin
67                 sdabuf<=1'b0;
68                 state<=bit1;
69
end
70
else        state<= start;
71         bit1:
72
if(!scl)
73
begin
74                 sdabuf<=databuf[3];
75                 state<=bit2;
76                 ack<=1'b0;
77
end
78
else        state<=bit1;
79         bit2:
80
if(!scl)
81
begin
82                 sdabuf<=databuf[2];
83                 state<=bit3;
84
end
85
else        state<=bit2;
86         bit3:
87
if(!scl)
88
begin
89                 sdabuf<=databuf[1];
90                 state<=bit4;
91
end
92
else        state<=bit3;
93         bit4:
94
if(!scl)
95
begin
96                 sdabuf<=databuf[0];
97                 state<=bit5;
98
end
99
else        state<=bit4;
100         bit5:
101
if(!scl)
102
begin
103                 sdabuf<=1'b0;
104                 state<=stop;
105
end
106
else        state<=bit5;
107         stop:
108
if(scl)
109
begin
110                 sdabuf<=1'b1;
111                 state<=idle;
112
end
113
else        state<=stop;
114         idle:
115
begin
116                 link_sda<=1'b0;
117                 state<=ready;
118
end
119
default:
120
begin
121                 link_sda<=1'b0;
122                 sdabuf<=1'b1;
123                 state<=ready;
124
end
125
endcase
126
end
127 end
128
129 endmodule


M2模块的代码如下


  1 `timescale 1ns/1ns
  2
module out16hi
  3 (
  4
input scl,
  5
input sda,
  6
output
reg [15:0] outhigh,
  7
output
reg [3:0] pdata,
  8
output
reg [3:0] pdatabuf,
  9
output
reg start_flag,
10
output
reg end_flag,
11
output
reg [5:0] mstate
12 );
13
14
//reg [5:0] mstate;/* synthesis preserve*/
15
//reg [3:0] pdatabuf;
16
//reg start_flag,end_flag;
17

18 always @ (negedge sda)
19 begin
20
if(scl)   
21         start_flag<=1'b1;
22
else
if(end_flag)   
23         start_flag<=1'b0;
24 end
25
26 always @ (posedge sda)
27 begin
28
if(scl)
29
begin
30         end_flag<=1'b1;
31         pdatabuf<=pdata;
32
end
33
else
34         end_flag<=1'b0;
35 end
36
37 parameter ready =
6'b00_0000,
38             bit0  =
6'b00_0001,
39             bit1  =
6'b00_0010,
40             bit2  =
6'b00_0011,
41             bit3  =
6'b00_0100,
42             bit4  =
6'b00_0101;
43
44 always @ (pdatabuf)
45 begin
46
case(pdatabuf)
47
4'b0001 : outhigh = 16'b0000_0000_0000_0001;
48
4'b0010 : outhigh = 16'b0000_0000_0000_0010;
49
4'b0011 : outhigh = 16'b0000_0000_0000_0100;
50
4'b0100 : outhigh = 16'b0000_0000_0000_1000;
51
4'b0101 : outhigh = 16'b0000_0000_0001_0000;
52
4'b0110 : outhigh = 16'b0000_0000_0010_0000;
53
4'b0111 : outhigh = 16'b0000_0000_0100_0000;
54
4'b1000 : outhigh = 16'b0000_0000_1000_0000;
55
4'b1001 : outhigh = 16'b0000_0001_0000_0000;
56
4'b1010 : outhigh = 16'b0000_0010_0000_0000;
57
4'b1011 : outhigh = 16'b0000_0100_0000_0000;
58
4'b1100 : outhigh = 16'b0000_1000_0000_0000;
59
4'b1101 : outhigh = 16'b0001_0000_0000_0000;
60
4'b1110 : outhigh = 16'b0010_0000_0000_0000;
61
4'b1111 : outhigh = 16'b0100_0000_0000_0000;
62
4'b0000 : outhigh = 16'b1000_0000_0000_0000;
63
endcase
64 end
65
66 always @ (posedge scl)
67 begin
68
if(start_flag)
69
case(mstate)
70         bit0:
71
begin
72                 mstate <= bit1;
73                 pdata[3] <= sda;
74                 $display("I am is sda bit0");
75
end
76         bit1:
77
begin
78                 mstate <= bit2;
79                 pdata[2] <= sda;
80                 $display("I am is sda bit1");
81
end
82         bit2:
83
begin
84                 mstate <= bit3;
85                 pdata[1] <= sda;
86                 $display("I am is sda bit2");
87
end
88         bit3:
89
begin
90                 mstate <= bit4;
91                 pdata[0] <= sda;
92                 $display("I am is sda bit3");
93
end
94         bit4:
95
begin
96                 mstate <= bit0;
97                 $display("I am is sda stop");
98
end
99
default:
100                 mstate <= bit0;
101
endcase
102
else
103        mstate <= bit0;
104 end
105
106 endmodule


信号测试模块:

[size=1em]?

[size=1em]1


[size=1em]2


[size=1em]3


[size=1em]4


[size=1em]5


[size=1em]6


[size=1em]7


[size=1em]8


[size=1em]9


[size=1em]10


[size=1em]11


[size=1em]12


[size=1em]13


[size=1em]14


[size=1em]15


[size=1em]16


[size=1em]17


[size=1em]18


[size=1em]19


[size=1em]20


[size=1em]21


[size=1em]22


[size=1em]23


[size=1em]24


[size=1em]25


[size=1em]26


[size=1em]27


[size=1em]28


[size=1em]29


[size=1em]30


[size=1em]31


[size=1em]32


[size=1em][size=1em]`timescale 1ns/1ns
[size=1em]`define half 50
[size=1em]module sigdata
[size=1em](
[size=1em]    input ask_for_data,
[size=1em]    output reg rst_n,
[size=1em]    output reg sclk,
[size=1em]    output reg [3:0] data
[size=1em]);
[size=1em]//parameter half=50;
[size=1em]initial
[size=1em]begin
[size=1em]    rst_n=1;
[size=1em]    #10 rst_n=0;
[size=1em]    #(`half*2+3) rst_n=1;
[size=1em]end

[size=1em]initial
[size=1em]begin
[size=1em]    sclk=0;
[size=1em]    data=0;
[size=1em]    #(`half*1000) $stop;
[size=1em]end

[size=1em]always #(`half) sclk =~sclk;

[size=1em]always @ (posedge ask_for_data)
[size=1em]begin
[size=1em]    #(`half/2+3) data=data+1'b1;
[size=1em]end

[size=1em]endmodule



顶层模块:

1 `timescale 1ns/1ns
2
module top;
3 wire [3:0] data;
4 wire sclk,scl,sda;
5 wire rst_n;
6 wire [15:0] outhigh;
7 wire [3:0] pdata;
8 wire [3:0] pdatabuf;
9 wire start_flag,end_flag;
10 wire [5:0] mstate;
11
12 sigdata M0
13 (
14     .rst_n(rst_n),
15     .sclk(sclk),
16     .data(data),
17     .ask_for_data(ack)
18 );
19
20 ptosda M1
21 (
22     .rst_n(rst_n),
23     .sclk(sclk),
24     .ack(ack),
25     .scl(scl),
26     .sda(sda),
27     .data(data)
28 );
29
30 out16hi M2
31 (
32     .scl(scl),
33     .sda(sda),
34     .outhigh(outhigh),
35     .pdata(pdata),
36     .pdatabuf(pdatabuf),
37     .start_flag(start_flag),
38     .end_flag(end_flag),
39     .mstate(mstate)
40 );
41
42 endmodule

发表于 2013-4-24 09:13:40 | 显示全部楼层
本帖最后由 alq3126780 于 2013-4-24 09:14 编辑

共同学习下 我没太懂你得意思 你得意思是在只有SDA和SCL 线的情况下 将数据和地址都变成并行的?
我现在手里面有i2c的完成了读写的程序...不知道能帮上忙不
发表于 2013-4-24 15:26:38 | 显示全部楼层
M1模块sdabuf只是一个串行数据暂存寄存器,通过link_sda控制,传递信号到(串行输出寄存器/output端口)sda
M2模块先把sda数据还原为4bit并行数据,再通过case语句完成4-16译码,输出16bit并行数据

夏老的源码都在那了...仔细看么...
你的作业更简单,仅仅把M2中串转并部分4bit并行数据的位宽改为你题目要求的地址和数据位宽,代码再适当调整下就完了,连后面译码都不需要了.......

自己好好研究下吧..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-17 05:18 , Processed in 0.019863 second(s), 11 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表