基于FPGA的DW8051移植(二)

  基于上一篇博文继续,本来想换到oc8051,但是还是不甘心,弄了这么久还是没有弄出来,真是打击屎了。

  上一篇说3f进入了operation code所以判断是代码错误,后来发现不可以这么判断。 因为地址00开始进入 operation code 的数据也是02 00  26.可是程序成功的转跳到了26 这个地址,所以不可以简单的说3f当operation code处理了所以core就错了。

  最后采用的方法是屏蔽掉STARTUP.51A里面的初始化loop,就是将idatalength 改为0 ,这一改我就更懵了。

  在keile C 中调试窗口看到的程序执行顺序是00 01 02    26 27 28      29 2a 2b       19 1a     1b 1c    1d 1e     1f 20 21     03 04 05 06 07 0a 0b 0c 0d 0e      0f 10 11  12 13 14  15 16 17      0f 10 11  12 13 14  15 16 17       03  04 05 06 07 08 0a 0b 0c 0d 0e 0f 10 一直到16     。。。。。。。。。。。。循环了。在modelsim中看到的是相同的,

还有一种调试时发现了有点区别,不知道是不是应该是这么执行的(如果真的是按照上面调试的方法执行那有些地址里面的数据就没执行)

同一个C 程序,在调试的时候为什么有两种执行方式呢,哪里出错了?

为了进一步探求程序,所以又写了测试4

  1 `timescale 1us/100ns
  2
  3 module dw8051_tb ;
  4
  5 reg         clk ,            reset ;
  6 reg         int0_n,        int1_n ;
  7 reg      rxd0_in ,   rxd1_in ;
  8 reg      t0 ,        t1     ;
  9
 10 wire         rst_out_n ;
 11 wire         stop_mode_n,   idle_mode_n ;
 12 wire     rxd0_out ,     txd0    ;
 13 wire     rxd1_out ,     txd1    ;
 14 wire     t0_out  ,      t1_out  ;
 15
 16 integer i ;
 17
 18 DW8051_top  cpu_core(
 19
 20              .clk (clk)         ,
 21              .reset (reset)       ,
 22              .rst_out_n (rst_out_n)    ,
 23              .stop_mode_n (stop_mode_n) ,
 24              .idle_mode_n (idle_mode_n) ,
 25
 26            //int
 27              .int0_n (int0_n)      ,
 28              .int1_n (int1_n)      ,
 29
 30            //serial port
 31              .rxd0_in (rxd0_in)     ,
 32              .rxd0_out (rxd0_out)    ,
 33              .txd0 (txd0)        ,
 34
 35              .rxd1_in (rxd1_in)      ,
 36              .rxd1_out (rxd1_out)    ,
 37              .txd1 (txd1)        ,
 38
 39            //timer/counter input/output
 40              .t0 (t0)          ,
 41              .t1 (t1)          ,
 42              .t0_out (t0_out)       ,
 43              .t1_out (t1_out)      ,
 44
 45
 46        //sfr interface
 47                .sfr_data_in () ,
 48              .sfr_addr ()    ,
 49              .sfr_data_out () ,
 50              .sfr_wr ()      ,
 51              .sfr_rd ()      ,
 52
 53            //external ram interface or user-defined peripheral reg
 54                .mem_data_in () ,
 55              .mem_addr ()    ,
 56              .mem_data_out (),
 57              .mem_wr_n ()     ,
 58              .mem_rd_n ()
 59             );
 60
 61 always #10 clk = ~clk ;
 62
 63 initial   begin
 64     i = 0  ;
 65     clk = 0 ;     reset =0 ;
 66     int0_n=0 ;    int1_n=0 ;
 67     rxd0_in=0 ;   rxd1_in=0 ;
 68     t0 =  0  ;    t1  = 0   ;
 69     #180 reset =1 ;
 70
 71
 72
 73 //**********测试1 : 发现无论如何修改idata初始化空间大小,程序都会进入29-2a-2b-2c 这个循环,无法跳出
 74       // while (i<‘h1ff) begin
 75               // @(cpu_core.irom_addr == 16‘h0029)   i = i+1 ;
 76               // if (i>‘h100) begin
 77                       // $display ("rom loop at 0029 is over 01 00h time ");
 78                       // $display ("  i = %d \n", i );
 79                       // end
 80               // end
 81 //---------------------------------------------------------------------------------------
 82
 83 /**********测试2: 依据测试1追查27这个地址上的循环次数数值去了哪里
 84     1,@(cpu_core.core.irom_addr == 16‘h0027) 测试发现跑到最后一个displays里面去了 ,屏蔽掉所有的if
 85 打印具体数据信息结果显示 cpu_core.core.i_cpu.biu_instr == 8‘h78
 86 而cpu_core.core.i_cpu.biu_data_in == 8‘h00
 87     2,@(cpu_core.core.irom_addr == 16‘h0028) 测试发现cpu_core.core.i_cpu.biu_instr == 8‘h3f而
 88 cpu_core.core.i_cpu.biu_data_in == 8‘h00。由1和2对比可知数据有一个周期的停滞期
 89 */
 90 //@(cpu_core.core.irom_addr == 16‘h0028) begin
 91 //        //if (cpu_core.core.int_rom_data_out == 8‘h3f) begin
 92 //                //if (cpu_core.core.i_cpu.biu_instr == 8‘h3f)
 93 //                        $display ("the rom data 3f have get to biu_instr = %h  \n ",cpu_core.core.i_cpu.biu_instr );
 94 //                //if (cpu_core.core.i_cpu.biu_data_in == 8‘h3f)
 95 //                        $display ("the rom data 3f have get to biu_data_in  = %h\n", cpu_core.core.i_cpu.biu_data_in);
 96 //                end
 97 //        else  begin
 98 //                $display ("operation error ! rom data 3f at address 27 have not load in ");
 99 //                end
100 //                end
101 //-----------------------------------------------------------------------------------------------------------
102
103
104 /********测试3 依据测试2追查内核执行情况 ,发现7f进入了operation——操作码,于是断定是核错误,可是后来追溯到最开始
105 的程序那一段 02 00 26 可以成功转跳到26这个地址,而26也进入了operation 操作码里面,这么一说,不可以简单的说由于3f
106 进入了operation 操作码段而断定核错误。
107 最后修改了STARTUP.51A 里面的idata length 为0 ,即不执行ram初始化,通过观测ram地址发现程序进入了用户程序段。
108 */
109
110  // $display ("display  data  :  \n");
111  // $monitor ("%h",cpu_core.core.i_cpu.i_opdec.op);
112  // #8000 $stop ;
113 //-------------------------------------------------------------------------------------------------------------
114
115
116 /********测试4 既然测试3已经进入了用户程序,依据keilC里面显示,main函数入口地址19,子函数入口地址03,子函数
117 出口地址18,LED翻转地址22, 再一起进入子函数main的保存地址为 1B,所以有了下面的测试程序,结果发现只有前面三个
118 出来了,后面两个都不见了程序就进入了stop,加大了时长还是不行哦
119 */
120     @(cpu_core.irom_addr == 16‘h0019)
121     $display ("enter customer code ");
122
123     @(cpu_core.irom_addr == 16‘h0003)
124     $display ("enter delay loop ");
125
126     @(cpu_core.irom_addr == 16‘h0018)
127     $display ("break delay loop ");
128
129     @(cpu_core.irom_addr == 16‘h0022)
130     $display ("continue customer code ");
131
132     @(cpu_core.irom_addr == 16‘h001b)
133     $display ("continue main ");
134 end
135
136
137 initial  begin
138         #80000 ;
139         #80000 ;
140         #80000 ;
141         #80000 ;
142         #80000 ;
143         #80000 ;
144         $stop ;
145
146 end
147
148 endmodule 

都没有人给我指点一二,还要不要人活了啊。

追查第三个display输出 后这个地址是怎么变的

你丫这是想干啥 ,我这是个什么地址,执行个什么程序啊

后续补充  ..............

时间: 2024-11-06 10:59:46

基于FPGA的DW8051移植(二)的相关文章

基于FPGA的DW8051移植(三)

总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了idata区间初始化循环中跳转不出来,没有进入用户程序这一块. 2) http://www.cnblogs.com/sepeng/p/4141072.html 基于FPGA的DW8051移植(二)里面将idata区间初始化去掉,程序进入了用户程序却发现在执行DelayMs 函数的时候,循环执行完毕,在最后

基于FPGA的VGA显示设计(二)

上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层模块: 1 /**************************************************** 2 * Module Name : VGA_color_all.v 3 * Author : yllinux 博客:http://www.cnblogs.com/yllinux/

基于FPGA的图像开发平台 其他摄像头附件说明(OV5642 OV9655)

基于FPGA的图像开发平台 其他摄像头附件说明 FPGA_VIP_V101 编者 奇迹再现 个人博客 http://www.cnblogs.com/ccjt/ 联系邮箱 [email protected] 淘宝网址 http://ccjt.taobao.com 修订记录 见下页 版权归奇迹再现所有,抄袭请注明出处, 参考文献:CrazyBingo原创相关文档.请尊重原创. 前言: 本系统方案理论适合DVP绝大部分摄像头测试,调试及开发,针对其他摄像头,因为寄存器参数不同,需要进行相应移植. 目前

基于FPGA的VGA可移植模块终极设计【转】

本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯 基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事,一般的单片机是办不到的:由于FPGA的速度,以及并行的优势,加上可现场配置的优势,VGA的配置,只有俺们FPGA可以胜任,也只有FPGA可以随心所欲地配置(当然ARM也可以,应用比较高吧). 初学者就是喜欢看炫的效果,往往会忍不住想玩.尤其玩FPGA的,没玩VGA就感到跟单片机没啥提升,因此VGA的驱动

基于FPGA的RGB565_YCbCr_Gray算法实现

前面我们讲了基于FPGA用VGA显示一副静态图片,那么接下来我们就接着前面的工程来实现我们图像处理的基础算法里最简单的一个那就是彩色图像转灰度的实现. 将彩色图像转化为灰度的方法有两种,一个是令RGB三个分量的数值相等,输出后便可以得到灰度图像,另一种是转化为YCbCr格式,将Y分量提取出来,YCbCr格式中的Y分量表示的是图像的亮度和浓度所以只输出Y分量,得到的图像就是灰度图像了.我在这里选择第二种方法实现. YCBCr是通过有序的三元组来表示的,三元由Y(Luminance).Cb(Chro

基于FPGA的Sobel边缘检测的实现

前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Canny算子边缘检测.腐蚀和膨胀等.那么这篇文章我们将来实现基于FPGA的Sobel边缘检测. 图像边缘:简言之,边缘就是图像灰度值突变的地方,亦即图像在该部分的像素值变化速度非常之快,这就好比在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,在技术

基于FPGA的均值滤波算法实现

我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于FPGA的一系列图像处理基础算法. 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素.椒盐噪声是一种因为信号脉冲强度引起的噪声,产生清楚该噪声的算法也比较简单. 均值滤波的方法将数据存储成3x3的矩阵

基于FPGA的VGA显示静态图片

终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为一直看人家的代码,到后来难免有点空虚.所以说自己狠下心来,报了一个线上培训班,重新学习一下,自己设计Sobel边缘检测,势要摆脱抄别人代码的魔咒.所以这次图像显示部分和在彩色条纹中显示一副图片的代码,全部是我自己设计的,虽然不是什么大工程,但是还是满满的成就感,这次用的时间比较久,因为使用的是新板子

基于FPGA的均值滤波算法的实现

前面实现了基于FPGA的彩色图像转灰度处理,减小了图像的体积,但是其中还是存在许多噪声,会影响图像的边缘检测,所以这一篇就要消除这些噪声,基于灰度图像进行图像的滤波处理,为图像的边缘检测做好夯实基础. 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素.椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单. 均值滤波的方法将数据存储成3x3的矩阵,然后求这个矩阵.在图像上对目标像素给