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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2525|回复: 8

[求助] Verilog代码问题

[复制链接]
发表于 2016-6-2 08:45:39 | 显示全部楼层 |阅读模式

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

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

x




  1. [code]module sram_wraddr(


复制代码

     input                sram_wrclk,
          input               rst_n,
          input               cmos_vsync,
          input               bit_detach_de,
          output  reg[14:0]   sram_wraddr,
          output  reg[1:0]     sram_wraddr_de
    );
parameter  [3:0]
        START=0,                                                  //开始状态
        IDLE=1,                                                  //复位状态
        WAIT_NEWD=2,                                             //等待新的数据状态
        NEW_DATA=3,                                             //新的数据到来状态
        SRAM_WR=4 ;
        //写SRAM状态
  reg             [14:0]                wraddr_count;                   //写SRA计数器,后面将计数器的值赋给SRAM地址
  reg      [1:0]                current_state,next_state;
  
  
//---------- sram_write  second   course-----------          SRAM写过程第一进程
always@(posedge sram_wrclk or negedge rst_n)
  begin
        if(!rst_n)
                begin
                current_state<=START;
                end
        else
                begin
                current_state<=next_state;
                end
end
   
//---------- sram_write  second   course-----------         SRAM写过程第二进程
always@(*)begin
  next_state=START;
  case(current_state)
  START:          begin
       if(!rst_n)
                 next_state=IDLE;
                 else
                 next_state=START;
                 end
  IDLE:            begin
       if(cmos_vsync==0)
         next_state=WAIT_NEWD;
       else
         next_state=IDLE;       
       end                       

WAIT_NEWD:       begin
       if(cmos_vsync==1)
         next_state=NEW_DATA;
       else
         next_state=WAIT_NEWD;       
       end                       

NEW_DATA:         begin
       if(bit_detach_de==1)
         next_state=SRAM_WR;
       else
         next_state=NEW_DATA;       
       end
  
SRAM_WR:         begin
       if(wraddr_count==30720)
         next_state=NEW_DATA;
       else
         next_state=WAIT_NEWD;       
       end
  
  default:       begin
          next_state=IDLE;
             end
        endcase
       
end

//--------------sram_write   third  course---------------   SRAM写过程第二进程
always@(posedge  sram_wrclk or negedge rst_n)
   begin
                if(!rst_n)
                begin
                  wraddr_count<=0;
                  sram_wraddr_de<=0;
                  sram_wraddr<=0;
                end
                else if(current_state==SRAM_WR)
                begin
                          if(wraddr_count==30720)
                             begin
                                  wraddr_count<=0;
                                  sram_wraddr_de<=0;
                                  end
                             else
                                  begin
                                  wraddr_count<=wraddr_count+1;
                                  sram_wraddr_de<=1;
                                  sram_wraddr<=wraddr_count;
                                  end
                                  
                end
               
        end
endmodule
[/code]
测试testbench文件




  1. module sram_wraddr_tb;

  2.         // Inputs
  3.         reg sram_wrclk;
  4.         reg rst_n;
  5.         reg cmos_vsync;
  6.         reg bit_detach_de;

  7.         // Outputs
  8.         wire [14:0] sram_wraddr;
  9.         wire sram_wraddr_de;

  10.         // Instantiate the Unit Under Test (UUT)
  11.         sram_wraddr uut (
  12.                 .sram_wrclk(sram_wrclk),
  13.                 .rst_n(rst_n),
  14.                 .cmos_vsync(cmos_vsync),
  15.                 .bit_detach_de(bit_detach_de),
  16.                 .sram_wraddr(sram_wraddr),
  17.                 .sram_wraddr_de(sram_wraddr_de)
  18.         );
  19.    parameter                  CYCLE= 20;
  20.         parameter                  RST_TIME= 3;
  21.         initial  begin
  22.                 sram_wrclk = 0;
  23.                 forever
  24.                 #(CYCLE/2)
  25.                 sram_wrclk=~sram_wrclk;
  26.                 end
  27.         initial  begin
  28.                 rst_n=0;
  29.            #(CYCLE*RST_TIME)
  30.                 rst_n=1;
  31.                 end
  32.         initial  begin
  33.             cmos_vsync=0;
  34.                  bit_detach_de=0;
  35.            #(5*CYCLE)
  36.                  cmos_vsync = 1;
  37.                  bit_detach_de = 1;
  38.                 end
  39.        
  40. endmodule



复制代码


测试出波形不对,输出的地址计数器一直为0,没有变化。
请大家帮忙看下,我写的这个代码,或是测试代码出现什么问题,刚开始写代码没多久,希望大家多多指点。
发表于 2016-6-2 13:57:42 | 显示全部楼层
SRAM_WR的跳出状态的控制有问题。按上面写法进入SRAM_WR状态下一个cycle就跳出这个状态了。
 楼主| 发表于 2016-6-2 14:31:23 | 显示全部楼层
回复 2# chnlw111


   我给发下流程图,你能帮我看下吗??

模块

模块

流程图

流程图
发表于 2016-6-2 16:31:46 | 显示全部楼层
你这个流程似乎没问题,但是你这个代码写得和你的图不一样。原因就是2L说的那样
发表于 2016-6-3 00:27:14 | 显示全部楼层
回复 4# cxhy

而且他这个代码好像时序还有问题,建立时间和保持时间做过分析吗
发表于 2016-6-3 08:58:46 | 显示全部楼层
回复 3# 黎释注册
你可以参考下面链接中我写的双端口读写的代码

http://bbs.eetop.cn/viewthread.p ... p;extra=&page=5
 楼主| 发表于 2016-6-3 21:54:56 | 显示全部楼层
回复 5# yitengzeng


  没有,完全新手,还有好多要学习,望大家多多指点
 楼主| 发表于 2016-6-3 22:02:14 | 显示全部楼层
回复 5# yitengzeng


   建立时间和保持时间,还没分析,现在只想先试试这段程序能不能跑通,还有好多工作要弄。
发表于 2016-6-8 13:44:37 | 显示全部楼层
本帖最后由 iyama 于 2016-6-8 13:48 编辑

START:          begin
   //    if(!rst_n) 这些都没用
                 next_state=IDLE;
  //               else
  //               next_state=START;
  end
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-26 16:07 , Processed in 0.027702 second(s), 10 queries , Gzip On, Redis On.

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