FPGA实现双向IO口与时钟芯片的例子
更新时间:2023-07-24 23:55:01 阅读量: 实用文档 文档下载
黑金开发板建模篇的实验十三。这个例子包含了IO口的使用、状态机以及完成状态标志的巧妙用法,可以多参考一下其写法。我认为这个例程包含了建模篇大部分的精华和常用方法。 下面将这个例子的全部内容拷贝下来,以备不时之需。也可以提供给需要的网友来参考。
各.v文件的组成架构如下图所示。
module exp13_demo
(
CLK, RSTn,
RST,
SCLK,
SIO,
LED
);
input CLK;
input RSTn;
output RST;
output SCLK;
inout SIO;
output [3:0]LED;
reg [3:0]i;
reg [7:0]isStart;
reg [7:0]rData;
reg [3:0]rLED;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 4'd0;
isStart <= 8'd0;
rData <= 8'd0;
rLED <= 4'd0;
end
else
case( i )
0:
if( Done_Sig ) begin isStart <= 8'd0; i <= i + 1'b1; end
else begin isStart <= 8'b1000_0000; rData <= 8'h00; end
1:
if( Done_Sig ) begin isStart <= 8'd0; i <= i + 1'b1; end
else begin isStart <= 8'b0100_0000; rData <= { 4'd1, 4'd2 }; end
2:
if( Done_Sig ) begin isStart <= 8'd0; i <= i + 1'b1; end
else begin isStart <= 8'b0010_0000; rData <= { 4'd2, 4'd2 }; end
3:
if( Done_Sig ) begin isStart <= 8'd0; i <= i + 1'b1; end
else begin isStart <= 8'b0001_0000; rData <= { 4'd2, 4'd2 }; end
4:
if( Done_Sig ) begin rLED <= Time_Read_Data[3:0]; isStart <= 8'd0; i <= 4'd4; end
else begin isStart <= 8'b0000_0010; end
endcase
wire Done_Sig;
wire [7:0]Time_Read_Data;
ds1302_module U1
(
.CLK( CLK ),
.RSTn( RSTn ),
.Start_Sig( isStart ),
.Done_Sig( Done_Sig ),
.Time_Write_Data( rData ),
.Time_Read_Data( Time_Read_Data ),
.RST( RST ),
.SCLK( SCLK ),
.SIO( SIO )
);
assign LED = rLED;
Endmodule
module ds1302_module
(
CLK, RSTn,
Start_Sig,
Done_Sig,
Time_Write_Data,
Time_Read_Data,
RST,
SCLK,
SIO
);
input CLK;
input RSTn;
input [7:0]Start_Sig;
output Done_Sig;
input [7:0]Time_Write_Data;
output [7:0]Time_Read_Data;
output RST;
output SCLK;
inout SIO;
wire [7:0]Words_Addr;
wire [7:0]Write_Data;
wire [1:0]Access_Start_Sig;
cmd_control_module U1
(
.CLK( CLK ),
.RSTn( RSTn ),
.Start_Sig( Start_Sig ), // input - from top
.Done_Sig( Done_Sig ), // output - to top
.Time_Write_Data( Time_Write_Data ), // input - from top .Time_Read_Data( Time_Read_Data ), // output - to top .Access_Done_Sig( Access_Done_Sig ), // input - from U2 .Access_Start_Sig( Access_Start_Sig ), // output - to U2 .Read_Data( Read_Data ), // input - from U2 .Words_Addr( Words_Addr ), // output - to U2
.Write_Data( Write_Data ) // output - to U2
);
wire [7:0]Read_Data;
wire Access_Done_Sig;
function_module U2
(
.CLK( CLK ),
.RSTn( RSTn ),
.Start_Sig( Access_Start_Sig ), // input - from U1 .Words_Addr( Words_Addr ), // input - from U1
.Write_Data( Write_Data ), // input - from U1
.Read_Data( Read_Data ), // output - to U1
.Done_Sig( Access_Done_Sig ), // output - to U1
.RST( RST ), // output - to top
.SCLK( SCLK ), // output - to top
.SIO( SIO ) // output - to top
);
Endmodule
module cmd_control_module
(
CLK, RSTn,
Start_Sig,
Done_Sig,
Time_Write_Data,
Time_Read_Data,
Access_Done_Sig,
Access_Start_Sig,
Read_Data,
Words_Addr,
Write_Data
);
input CLK;
input RSTn;
input [7:0]Start_Sig;
output Done_Sig;
input [7:0]Time_Write_Data;
output [7:0]Time_Read_Data;
input Access_Done_Sig;
output [1:0]Access_Start_Sig;
input [7:0]Read_Data;
output [7:0]Words_Addr;
output [7:0]Write_Data;
reg [7:0]rAddr;
reg [7:0]rData;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
rAddr <= 8'd0;
rData <= 8'd0;
end
else
case( Start_Sig[7:0] )
8'b1000_0000 : // Write unprotect begin rAddr <= { 2'b10, 5'd7, 1'b0 }; rData <= 8'h00; end
8'b0100_0000 : // Write hour
begin rAddr <= { 2'b10, 5'd2, 1'b0 }; rData <= Time_Write_Data; end
8'b0010_0000 : // Write minit begin rAddr <= { 2'b10, 5'd1, 1'b0 }; rData <= Time_Write_Data; end
8'b0001_0000 : // Write second
begin rAddr <= { 2'b10, 5'd0, 1'b0 }; rData <= Time_Write_Data; end
8'b0000_1000 : // Write protect begin rAddr <= { 2'b10, 5'd7, 1'b0 }; rData <= 8'b1000_0000; end
8'b0000_0100 : // Read hour begin rAddr <= { 2'b10, 5'd2, 1'b1 }; end
8'b0000_0010 : // Read minit begin rAddr <= { 2'b10, 5'd1, 1'b1 }; end
8'b0000_0001 : // Read second begin rAddr <= { 2'b10, 5'd0, 1'b1 }; end
endcase
reg [1:0]i;
reg [7:0]rRead;
reg [1:0]isStart;
reg isDone;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 2'd0;
rRead <= 8'd0;
isStart <= 2'b00;
isDone <= 1'b0;
end
else if( Start_Sig[7:3] ) // Write action
case( i )
0 :
if( Access_Done_Sig ) begin isStart <= 2'b00; i <= i + 1'b1; end
else begin isStart <= 2'b10; end
1 :
begin isDone <= 1'b1; i <= i + 1'b1; end
2 :
begin isDone <= 1'b0; i <= 2'd0; end
endcase
else if( Start_Sig[2:0] ) // Read action
case( i )
0 :
if( Access_Done_Sig ) begin rRead <= Read_Data; isStart <= 2'b00; i <= i + 1'b1; end
else begin isStart <= 2'b01; end
1 :
begin isDone <= 1'b1; i <= i + 1'b1; end
2 :
begin isDone <= 1'b0; i <= 2'd0; end
endcase
assign Done_Sig = isDone;
assign Time_Read_Data = rRead;
assign Access_Start_Sig = isStart;
assign Words_Addr = rAddr;
assign Write_Data = rData;
Endmodule
module function_module
(
CLK, RSTn,
Start_Sig,
Words_Addr,
Write_Data,
Read_Data,
Done_Sig,
RST,
SCLK,
SIO
);
input CLK;
input RSTn;
input [1:0]Start_Sig;
input [7:0]Words_Addr;
input [7:0]Write_Data;
output [7:0]Read_Data;
output Done_Sig;
output RST;
output SCLK;
inout SIO;
parameter T0P5US = 5'd24;//50M*(0.5e-6)-1=24
reg [4:0]Count1;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Count1 <= 5'd0;
else if( Count1 == T0P5US )
Count1 <= 5'd0;
else if( Start_Sig[0] == 1'b1 || Start_Sig[1] == 1'b1 ) Count1 <= Count1 + 1'b1;
else
Count1 <= 5'd0;
reg [5:0]i;
reg [7:0]rData;
reg rSCLK;
reg rRST;
reg rSIO;
reg isOut;
reg isDone;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 6'd0;
rData <= 8'd0;
rSCLK <= 1'b0;
rRST <= 1'b0;
rSIO <= 1'b0;
isOut <= 1'b0;
isDone <= 1'b0;
end
else if( Start_Sig[1] )
case( i )
0 :
begin rSCLK <= 1'b0; rData <= Words_Addr; rRST <= 1'b1; isOut <= 1'b1; i <= i + 1'b1; end
1, 3, 5, 7, 9, 11, 13, 15 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSIO <= rData[ (i >>
1) ]; rSCLK <= 1'b0; end
2, 4, 6, 8, 10, 12, 14, 16 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSCLK <= 1'b1; end
17 :
begin rData <= Write_Data; i <= i + 1'b1; end
18, 20, 22, 24, 26, 28, 30, 32 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSIO <= rData[ (i >>
1) - 9 ]; rSCLK <= 1'b0; end
19, 21, 23, 25, 27, 29, 31, 33 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSCLK <= 1'b1; end
34 :
begin rRST <= 1'b0; i <= i + 1'b1; end
35 :
begin isDone <= 1'b1; i <= i + 1'b1; end
36 :
begin isDone <= 1'b0; i <= 6'd0; end
endcase
else if( Start_Sig[0] )
case( i )
0 :
begin rSCLK <= 1'b0; rData <= Words_Addr; rRST <= 1'b1; isOut <= 1'b1; i <= i + 1'b1; end
1, 3, 5, 7, 9, 11, 13, 15 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSIO <= rData[ (i >>
1) ]; rSCLK <= 1'b0; end
2, 4, 6, 8, 10, 12, 14, 16 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSCLK <= 1'b1; end
17 :
begin isOut <= 1'b0; i <= i + 1'b1; end
18, 20, 22, 24, 26, 28, 30, 32 : if( Count1 == T0P5US ) i <= i + 1'b1;
else begin rSCLK <= 1'b1; end
19, 21, 23, 25, 27, 29, 31, 33 : if( Count1 == T0P5US ) begin i <= i + 1'b1; end
else begin rSCLK <= 1'b0; rData[ (i >> 1) - 9 ] <= SIO; end
34 :
begin rRST <= 1'b0; isOut <= 1'b1; i <= i + 1'b1; end
35 :
begin isDone <= 1'b1; i <= i + 1'b1; end
36 :
begin isDone <= 1'b0; i <= 6'd0; end
endcase
assign Read_Data = rData;
assign Done_Sig = isDone;
assign RST = rRST;
assign SCLK = rSCLK;
assign SIO = isOut ? rSIO : 1'bz;
endmodule
正在阅读:
FPGA实现双向IO口与时钟芯片的例子07-24
高分子物理电子教案07-10
社保基数核定办法、技巧、详细图解06-20
BIBR 1532_321674-73-1_MSDS_MedChemExpress06-02
人大财金学院考博分享-财政学招生人数考试难度分析经济学综合考04-06
2011年3月新行员培训——理财卡、财富卡和私人银行卡06-07
最新人教版三年级趣味数学附答案-精品12-31
腐蚀环境下锈层的成分及分类12-13
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 双向
- 时钟
- 芯片
- 例子
- 实现
- FPGA
- 2013年最新建设工程施工合同(示范文本)
- 2011小学数学课程标准模拟试题与答案
- 美国审计独立的现状及思考
- 1任务-偿债能力分析
- 16届宁夏银川一中高三第一次文综政治
- 党校入党积极分子培训班结业考试试题库(566个单项选择题)
- 浅析《乞力马扎罗的雪》中的象征
- 部编版二年级语文下册第一次月考试卷(课后练习)
- 2012年电气工程师供配电考试辅导
- 西藏拉萨中学2016届高三汉语文上学期第三次月考试题
- 信息系统评价体系及评价方法
- 麻疯树油制备生物柴油的酯交换工艺研究
- 西部有机农业产品流通平台可行性报告
- 13、狼牙山五壮士
- 柴油发电机维修保养标准作业规程
- 产品设计中的人性化关怀
- 第七章 城市交通与道路系统
- 2010年胫腓骨骨折中医诊疗方案
- 围巾的八种漂亮打法
- 机械式停车设备事故案例分析