Altera杯"第五届全国研究生电子设计竞赛样板
“Altera杯”第五届全国研究生电子设计竞赛
上机考试报告
参赛队对照码____ EDACODE31________
题号_____1_________
中国·北京·清华大学
2005年8月
目录
I. 设计要求 .............................................. 2 II.
设计工具 ............................................ 2
III. 总体设计思路 ........................................ 2 IV. V. VI.
系统结构与模块划分 ................................... 4 模块设计与信号定义 ................................... 5 测试平台 ............................................ 7
VII. 功能仿真结果 ........................................ 7 VIII. 综合结果 ........................................... 12 IX.
附录 .................................................... 13
结论 .............................................. 13
I. 设计要求
设计一计时器模块,具有下列功能 1. 16bit定时器/ETU计数器。 2. 具有3种可配置工作模式。 3. 定时器/计数器中断请求输出。 4. 内存寄存器的编程(读/写)。
II. 设计工具
III. 总体设计思路
一、总体设计关键点
本题要求设计一个CPU的外设Timer。通过分析,本题有以下三个关键点: 1、
通过对Timer输入信号的判断,时序CPU与Timer的通信,实现对Timer的内部寄存器的编程。
2、
根据CPU对内部寄存器的编程值,得到时钟信号的参数,从而由外部时钟ext_clk正确产生技术时钟etu_clk。
3、
根据对Timer内部特殊寄存器的值,对定时器进行相应的配置,并输出相应的结果。
二、总体设计思路说明
整个设计采用了分层的设计思想,各模块描述如下:
1、
模块CPU_interface:该模块作为外设Timer与CPU模块的接口,实现CPU对外设Timer的特殊寄存器的编程。
2、
模块register_Bank:此模块的功能是将特殊寄存器放在一起,并对它们进行编程(读/写)。
3、
模块ETU_clk:此模块的功能是,根据特殊寄存器的相应值,得到外部时钟EXT_clk,分频产生的etu_clk时钟,另外CPU时钟cpu_clk也由此模块接入,此模块根据配置情况,以决定外设Timer采用时钟cpu_clk或者时钟etu_clk。
4、
模块timer0:定时/计数器0,此模块根据配置情况完成定时或者计数功能。
5、
模块timer1:定时/计数器1,此模块根据配置情况完成定时或者计数功能。
三、设计特色
1、多模块化设计:如果整个设计作为一个模块,处理将较为困难;而当把设计分成多模块后后,各层模块独立设计,通过约定的标志位进行模块间通信,上层模块可以使用底层模块所提供的信号标志,将三个设计关键点分解到多个模块中,便于难点的解决。
2、专门用interface模块来处理cpu的读写时序,因此便于在不同的总线时序间,进行移植,因此代码可重用性高。
3、用寄存器组的概念提高了代码的可读性。
系统的输入输出端口定义。
IV. 系统结构与模块划分
总体设计的框图如图1。
图1 总体设计框图
模块划分:
1、 Interface模块:这个模块负责处理与cpu总线的接口。它根据地址往对应寄存器中写值,或者从对应地址的寄存器中读出值。 2、 Register bank:寄存器组。它是timer 中所有寄存器的集合。
3、 Etu_clk产生模块:这个模块对外部时钟ext_clk分频,产生etu_clk时钟。分频的倍数由scnt和scon[7]共同决定。
4、 Timer0/1:这就是timer的核心模块。这个模块根据TMOD寄存器的对应位来采取不同的工作模式。
总体设计思路为:由interface模块来负责整个模块与cpu总线的接口。总线上的数据可以写到寄存器组的相应寄存器中,也可以把寄存器组中的某一个寄存器的值读到总线上。而etu_clk模块来产生etu_clk时钟。Timer0/1可以对cpu时钟和外部时钟计数。根据TMOD的对应位,Timer0/1可以有不同的工作状态。
V. 模块设计与信号定义
一、各传输线上的数据:
1、Interface模块用数据线和地址线从寄存器组中读取/写入数据。
2、interface模块往etu_clk模块送外部时钟信号ext_clk。 3、etu_clk模块产生etu_clk时钟。
4、timer0/1受TMOD的控制。并对Tclk0/1计数。
二、具体设计中,各模块的功能的功能和实现方法如下:
1、Interface模块:这个模块包括读、写操作。写操作的实现如下所示:
always @(posedge clk_cpu or posedge arst) begin
if (arst) // reset is active begin
scon
else // posedge clk_cpu begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0420) ) // write to SCON scon
读输出时,为三态输出:
always @(posedge clk_cpu or posedge arst) begin
if (arst) // reset is active begin
out_reg
else // posedge clk_cpu begin
if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0410)) begin // read TCON out_reg
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0420)) begin // read SCON out_reg
………………..
assign sfr_data_out = (tri_state_enb)? out_reg : 16'hz; // tri_state output
从上可以看到always块往out_reg中写数据。而assign语句则为三态输出。
2、etu_clk的产生:
//------------------- ETU_CLK generation ------------------------- reg[5:0] count_etu_clk_scnt; reg ext_clk_div1;
always @(posedge ext_clk or posedge arst) begin
if (arst) // reset begin ……………. end
else // posedge ext_clk begin
if (scon[3] ) begin // "RE" enable
if (count_etu_clk_scnt == scnt[5:0]) begin
count_etu_clk_scnt
count_etu_clk_scnt
end // end of "if (scon[3])" end
//------------------- 以上为对scnt[5:0]的分频 ――――――――――――――― reg[4:0] count_FI3; reg etu_clk;
always @(posedge ext_clk or posedge arst) begin
if (arst) // reset begin …………………. end
else // posedge ext_clk begin
if (ext_clk_div1) begin
if (scon[7] && count_FI3==5'd31) etu_clk
else if ( (!scon[7]) && count_FI3 == 5'd30 ) begin etu_clk
etu_clk
end // end of "if (ext_clk_div1)" end // end of else end
//----------------------- 以上为30或31分频 -----------------------
VI. 测试平台
测试平台采用modelsim,测试方案和波形见“功能仿真结果”部分。
VII. 功能仿真结果
一、 验证方案
要验证外设Timer是否正常工作,需要确认以下几点: 1、
时钟模块etu_clk能否工作正常,并根据配置的情况是否能在
cpu_clk与etu_clk之间进行切换,以提供给后面的timer0或者timer1提供输入时钟信号。
2、 CPU能否对外设Timer编程(读/写),具体体现在CPU通过
cpu_interface,模块时序对Register_Bank模块内部特殊寄存器是否能配置。 3、
Timer0,Timer1模块是否能根据相应的配置情况,实现计数或者
定时。
二、 测试波形
针对题目的具体要求,设置以下测试点。 1. 测试点一
cpu通过对模块cpu_interface模块实现对内部特殊寄存器的写数据。为了测试数据写入是否正确,向scnt寄存器写入数据16’h000,那么内部寄存器scnt的值应该是8’h01。从下图中可以看到,实际的输出与预想一致。本设计可以正常的向外设timer内部特殊寄存器写入数据。
2.
测试点二
为了测试etu_clk模块能否产生正确的分频信号,可以通过对外设timer的内部特殊寄存器进行配置,让etu_clk信号等于外部时钟信号ext_clk信号的31*2分频,波形如下图所示,从图可见,实际的输出和预想一致,本设计可以产生正确的分频信号。
3、测试点三
为了测试CPU能否通过模块cpu_interface模块实现对外设Timer内部特殊寄存器的读操作,可以读取特殊寄存器th0,tl0的值,如下图所示。由图可见,读到的信号出现在sfr_data_out总线上,其值是ffe6。
4、测试点四
为了测试外设Timer工作在定时器状态下,能否在不同的模式间进行切换,可以通过对其内部特殊寄存器的配置改变其工作模式,有以下几种情况, (1)在模式0状态下,打开定时器0,定时器开始定时工作,信号th0,tl0在时钟的触发下进行变化。状态如下图。
下图为上图部分细节的放大,由图可见,在计数器溢出的时候计数器进行重载数据。
(2)在模式1状态下,打开定时器,定时器开始定时操作,信号th0,tl0在时钟的触发下进行变化。如下图所示。由图可见,在此模式下,溢出后定时器不进行重载操作。
(3)在模式2状态下,打开定时器,定时器开始定时操作,信号th0,tl0在时钟的触发下进行变化。如下图所示。由图可见,在此模式下,溢出后定时器进行重载操作并且只对低位tl0进行重载,th0不变。
具体重载方法见下图,在timer0_int后tl0重载。
5、测试点五
为了测试在定时器溢出的情况下,cpu能否直接对外设Timer的内部寄存器TCON中的溢出标志位进行人为清零,如下图所示。由图可见,TCON的值在timer0int_clr信号上升沿由8’h30变为8’h10,实现人为清除中断标志位。
6、测试点六
下图为对外部时钟ext_clk计数时并且处于模式0下的波形。
7、测试点七
下图为对外部时钟ext_clk计数时并且处于模式1下的波形。
8、测试点八
下图为对外部时钟ext_clk计数时并且处于模式2下的波形。
VIII. 综合结果
图7.1 quartus综合结果
图7.2 quartus时间分析结果
IX. 结论
由测试的波形可以看出,本设计完成了题目的所有设计要求。并且有一定的新颖性和特色。
本报告到此结束,以下为附录部分,内容可作参考
附录
1、 源代码
///////////////////////////////////////////////////////////////////
// //
// Project Name: timer // // Design Module Name: timer.v // // Version: 1.0 // // Update Time: 8/19/2005 // // Description: Implement "timer" // // //
///////////////////////////////////////////////////////////////////
module timer (// input
arst, clk_cpu, ext_clk, size, sfr_rd, sfr_wr, sfr_addr, timer0int_clr, timer1int_clr, sfr_data_in,
// output
timer0_int, timer1_int, sfr_data_out);
input arst, clk_cpu, ext_clk, size, sfr_rd, sfr_wr, timer0int_clr, timer1int_clr;
input[15:0] sfr_addr;
input[15:0] sfr_data_in;
output timer0_int, timer1_int;
output[15:0] sfr_data_out;
reg timer0_int, timer1_int;
//-------------------------------------
//---------------------------------------------
// register bank
reg[7:0] tmod; // TMOD register
reg[7:0] tcon; // TCON register
reg[7:0] tl0; // TL0 register
reg[7:0] th0; // TH0 register
reg[7:0] tl1; // TL1 register
reg[7:0] th1; // TH1 register
reg[7:0] rtl0; // RTL0 register
reg[7:0] rth0; // RTH0 register
reg[7:0] rtl1; // RTL1 register
reg[7:0] rth1; // RTH1 register
reg[7:0] scon; // SCON register
reg[7:0] scnt; // SCNT register
//---------------------------------------------
wire tclk0, tclk1;
wire flag;
reg flag1;
//---------------------------------------------------------- // "CPU interface" block
//---------------------- Write operation ------------------------- always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
tmod
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h045c) ) // write to TMOD
tmod
end
end
always @(posedge clk_cpu or posedge arst or posedge tclk0 or posedge tclk1)
begin
if (arst) // reset is active
begin
tcon
end
else if (clk_cpu && !tclk0)
flag1
if (clk_cpu && !flag) // posedge clk_cpu
begin
if (timer0int_clr) begin
tcon[5] = 1'b0;
end
else if (!tclk0)
flag1
else if (timer1int_clr) begin
tcon[7] = 1'b0;
end
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0410) ) // write to TCON
tcon
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0450) ) // write to TL0
tl0
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0451) ) // write to TH0
th0
else if (sfr_wr && (size==1'b1) && (sfr_addr==16'h0450)) // write to TH0 & TL0
begin
th0
tl0
end
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0452) ) // write to TL1
tl1
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0453) ) // write to TH1
th1
else if (sfr_wr && (size==1'b1) && (sfr_addr==16'h0452)) // write to TH1 & TL1
begin
th1
tl1
end
end // posedge clk_cpu
else if (tclk0 && !flag1) // posedge tclk0 // Timer0 =======================
begin
if (tcon[4]) begin
if (timer0int_clr) begin
tcon[5] = 1'b0;
end
else if (timer1int_clr) begin
tcon[7] = 1'b0;
end
//-------------------------------------------------------- if (tmod[1:0]== 2'b00) begin // Timer0 in Mode0
if ({th0,tl0}==16'd65535) begin // Mode0 overflow
tcon[5]
{th0,tl0}
end
else begin
timer0_int
end
end
else if (tmod[1:0]== 2'b01) begin // Timer0 in Mode1 if ({th0,tl0}==16'd65535) begin // Mode1 overflow
tcon[5]
{th0,tl0}
end
else begin
timer0_int
end
end
else if (tmod[1:0]== 2'b10) begin // Timer0 in Mode2 if (tl0==8'd255) begin // Mode2 Overflow
tcon[5]
tl0
end
else begin
timer0_int
end
//---------------------------------------
end
end
else // posedge tclk1 // Timer1 =======================
begin
if (tcon[6]) begin
//-------------------------------------------------------- if (tmod[5:4]== 2'b00) begin // Timer1 in Mode0
if ({th1,tl1}==16'd65535) begin // Mode0 overflow
tcon[7]
{th1,tl1}
end
else begin
timer1_int
end
else if (tmod[5:4]== 2'b01) begin // Timer1 in Mode1 if ({th1,tl1}==16'd65535) begin // Mode1 overflow
tcon[7]
end
else begin
timer1_int
end
else if (tmod[5:4]== 2'b10) begin // Timer1 in Mode2 if (tl1==8'd255) begin // Mode2 Overflow
tcon[7]
tl1
end
else begin
timer1_int
end
end
//---------------------------------------
end
end
end
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
scon
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0420) ) // write to SCON
scon
end
end
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
scnt
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0462) ) // write to SCNT
scnt
end
end
/*
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
th0
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0450) ) // write
to TL0
tl0
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0451) ) // write to TH0
th0
else if (sfr_wr && (size==1'b1) && (sfr_addr==16'h0450)) // write to TH0 & TL0
begin
th0
tl0
end
end
end*/
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
rth0
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0454) ) begin // write to RTL0
rtl0
tl0
end
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0455) ) begin // write to RTH0
rth0
th0
end
else if (sfr_wr && (size==1'b1) && (sfr_addr==16'h0454)) // write to RTH0 & RTL0
begin
rth0
rtl0
th0
tl0
end
end
end
/*
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
th1
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0452) ) // write to TL1
tl1
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0453) ) // write to TH1
th1
else if (sfr_wr && (size==1'b1) && (sfr_addr==16'h0452)) // write to TH1 & TL1
begin
th1
tl1
end
end
end*/
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
rth1
end
else // posedge clk_cpu
begin
if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0456) ) // write to RTL1
rtl1
else if (sfr_wr && (size==1'b0) && (sfr_addr==16'h0457) ) // write to RTH1
rth1
else if (sfr_wr && (size==1'b1) && (sfr_addr==16'h0456)) // write to RTH1 & RTL1
begin
rth1
rtl1
end
end
end
//---------------------- Write operation is OVER ! -------------------------
//---------------------- Read operation ------------------------- reg[15:0] out_reg; // output register
reg tri_state_enb; // tri_state output enable
always @(posedge clk_cpu or posedge arst)
begin
if (arst) // reset is active
begin
out_reg
end
else // posedge clk_cpu
begin
if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0410)) begin // read TCON
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0420)) begin // read SCON
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0462)) begin // read SCNT
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0450)) begin // read TL0
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0451)) begin // read TH0
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0452)) begin // read TL1
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0453)) begin // read TH1
out_reg
end
else if (sfr_rd && (size==1'b1) && (sfr_addr==16'h0450)) begin
// read TH0 & TL0
out_reg
end
else if (sfr_rd && (size==1'b1) && (sfr_addr==16'h0452)) begin // read TH1 & TL1
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0454)) begin // read RTL0
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0455)) begin // read RTH0
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0456)) begin // read RTL1
out_reg
end
else if (sfr_rd && (size==1'b0) && (sfr_addr==16'h0457)) begin // read RTH1
out_reg
end
else if (sfr_rd && (size==1'b1) && (sfr_addr==16'h0454)) begin // read RTH0 & RTL0
out_reg
end
else if (sfr_rd && (size==1'b1) && (sfr_addr==16'h0456)) begin // read RTH1 & RTL1
out_reg
end
else begin // no read operation
out_reg
end
end // end of "else"
end
assign sfr_data_out = (tri_state_enb)? out_reg : 16'hz; // tri_state output
//---------------------- Read operation is OVER ! -------------------------
//------------------ "CPU interface" block is OVER ! --------------------------------------
//------------------- ETU_CLK generation -------------------------
reg[5:0] count_etu_clk_scnt;
reg ext_clk_div1;
always @(posedge ext_clk or posedge arst)
begin
if (arst) // reset
begin
count_etu_clk_scnt
ext_clk_div1
end
else // posedge ext_clk
begin
if (scon[3] ) begin // "RE" enable
if (count_etu_clk_scnt == scnt[5:0]) begin
count_etu_clk_scnt
end
else begin
count_etu_clk_scnt
end
end // end of "if (scon[3])"
end
end
reg[4:0] count_FI3;
reg etu_clk;
always @(posedge ext_clk or posedge arst)
begin
if (arst) // reset
begin
count_FI3
etu_clk
end
else // posedge ext_clk
begin
if (ext_clk_div1) begin
if (scon[7] && count_FI3==5'd31)
etu_clk
else if ( (!scon[7]) && count_FI3 == 5'd30 ) begin
etu_clk
end
else begin
etu_clk
end
end // end of "if (ext_clk_div1)"
end // end of else
end
assign tclk0 = (tcon[0])? etu_clk : clk_cpu;
assign tclk1 = (tcon[2])? etu_clk : clk_cpu;
assign flag = (tcon[4]==1'b1);
//----------------------------------------------------------
endmodule
2、 testbench
`timescale 10ns/100ps
module timer_tb(arst,clk_cpu,ext_clk,size,sfr_rd,sfr_wr,sfr_addr,
timer0int_clr,timer1int_clr,sfr_dataout,timer0_int,
timer1_int,sfr_datain);
output arst,clk_cpu,ext_clk,size,sfr_rd,sfr_wr;
output[15:0] sfr_addr;
output[15:0] sfr_dataout;
output timer0int_clr,timer1int_clr;
input timer0_int,timer1_int;
input[15:0] sfr_datain;
reg arst,clk_cpu,ext_clk,size,sfr_rd,sfr_wr;
reg[15:0] sfr_addr;
reg[15:0] sfr_dataout;
reg timer0int_clr,timer1int_clr;
reg clk_tmp;
//------------------------------------------
//
timer timer (// input
.arst(arst), .clk_cpu(clk_cpu), .ext_clk(ext_clk), .size(size), .sfr_rd(sfr_rd), .sfr_wr(sfr_wr), .sfr_addr(sfr_addr),
.timer0int_clr(timer0int_clr),.timer1int_clr(timer1int_
clr),
.sfr_data_in(sfr_dataout),
// output
.timer0_int(timer0_int), .timer1_int(timer1_int), .sfr_data_out(sfr_datain));
//---------------------------------------------
always #5 clk_tmp=~clk_tmp; ///10M
initial
clk_tmp=1'b0;
///clk_cpu
initial
begin
#1 arst = 1;
#10 arst =0;
end
//always #5 clk_cpu=~clk_cpu;////10M
//initial
//# 0.5 clk_cpu=1'b0;
always@(clk_tmp)
begin
#0.5
clk_cpu=clk_tmp;
end
///ext_clk
always #10 ext_clk=~ext_clk;///5M
initial
#15 ext_clk=1'b0;
initial
begin
//////////idle
@(negedge clk_cpu)
begin
sfr_addr=16'd0;
sfr_dataout=16'd0;
sfr_wr=1'b0;
size=1'b0; end #100 //scnt @(posedge clk_tmp) begin sfr_addr=16'h0462; sfr_dataout=16'd1;///31&& valid size=1'b0; sfr_wr=1'b1; end //////////idle @(negedge clk_cpu) begin sfr_addr=16'd0; sfr_dataout=16'd0; sfr_wr=1'b0; size=1'b0; end #100 //scon @(posedge clk_tmp) begin sfr_addr=16'h0420; sfr_dataout=16'h0008;///31&& valid size=1'b0; sfr_wr=1'b1; end //////////idle @(negedge clk_cpu) begin sfr_addr=16'd0; sfr_dataout=16'd0; sfr_wr=1'b0; size=1'b0; end #100 //clk ext or cpu,close or open the timer and handle the overfolw
@(posedge clk_tmp) // tcon
begin
sfr_addr=16'h0410;
sfr_dataout=16'h0000;///31&& valid
size=1'b0;
sfr_wr=1'b1;
end
//////////idle
@(negedge clk_cpu)
begin
sfr_addr=16'd0;
sfr_dataout=16'd0;
sfr_wr=1'b0;
size=1'b0;
end
#100
//chose mode
@(posedge clk_tmp)
begin
sfr_addr=16'h045c;
sfr_dataout=16'h0002;///timer0 and mode 0
size=1'b0;
sfr_wr=1'b1;
end
//////////idle
@(negedge clk_cpu)
begin
sfr_addr=16'd0;
sfr_dataout=16'd0;
sfr_wr=1'b0;
size=1'b0;
end
#100
//data of reg
@(posedge clk_tmp)
begin
sfr_addr=16'h0454;
sfr_dataout=16'hffe0;///timer0 and the lower bit
size=1'b1;
sfr_wr=1'b1;
end
//////////idle
@(negedge clk_cpu)
begin
sfr_addr=16'd0;
sfr_dataout=16'd0;
sfr_wr=1'b0;
size=1'b0;
end
#100
//clk ext or cpu,close or open the timer and handle the overfolw @(posedge clk_tmp) // tcon
begin
sfr_addr=16'h0410;
sfr_dataout=16'h0011;///31&& valid
size=1'b0;
sfr_wr=1'b1;
end
//////////idle
@(negedge clk_cpu)
begin
sfr_addr=16'd0;
sfr_dataout=16'd0;
sfr_wr=1'b0;
size=1'b0;
end
#100
#50000 $stop;
end
////clr timer0_int
initial
begin
timer0int_clr = 0;
timer1int_clr = 0;
#920;
@(posedge timer0_int)
#10 timer0int_clr = 1;
#20 timer0int_clr = 0;
end
initial
begin
sfr_rd = 0;
#725;
@(posedge clk_tmp)
begin
sfr_rd= 1;
size= 1;
sfr_addr = 16'h0450;
end
@(negedge clk_cpu)
begin
sfr_rd =0 ;
size = 0;
sfr_addr = 0;
end
end
endmodule