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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10419|回复: 3

[求助] verilog反馈结构求助 折腾两星期了

[复制链接]
发表于 2013-5-20 11:16:44 | 显示全部楼层 |阅读模式

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

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

x
wenjian.jpg

如上面的机构图,MEMr存储器存储(深度128)上半部分为大于0的整数,下半部分为0,所有数和为深度128,它是PMEM存储器对应数据需要复制的次数(这个复制次数对应的PMEM地址储存在MEMi存储器里)。次模块实现的关键就是控制单元的设计(图红线部分),从MEMr里依次取出数据,得到iMEM的地址信号。
比如MEMr第一个数据为4,则iMEM的地址信号依次为0,127,126,125(相当于把0号数据覆盖到最底层的位置)
再取出下一个MEMr数据2,则iMEM的地址信号依次为1,124,
再取出下一个MEMr数据1,则iMEM的地址信号依次为2,
再取出下一个MEMr数据3,则iMEM的地址信号依次为3,123,122,
。。。。。。。。
求助:这个控制单元该怎么编写,参考的论文好像在控制单元里面用了一个递减计数器,好用的异步信号标记,开始时用一个时钟的启动脉冲来取出MEMr的第一个数,当MEMr数据为0时,整个模块停止。折腾很久了还是没搞出来,总是出问题。。。
wenjian.jpg
发表于 2013-5-22 21:31:00 | 显示全部楼层
问题出在那里,可以把波形或代码贴出来好帮你查看
 楼主| 发表于 2013-5-22 23:02:06 | 显示全部楼层
本帖最后由 yong19891101 于 2013-5-22 23:08 编辑

回复 2# ivor_kandy
我是这样做的 ,先给一个启动脉冲pulse,启动en1信号从rMEM读出第一个数x后,先判断x是否大于1,如大于1,则把x-1送入k_down计数器,如等于1,则马上启动en1信号 读出rMEM下一个数
k_down计数器的输出k_out等于1时启动en1信号
en2信号基本就是en1的取反了。

以下是代码:
module sample1(clk,set,en1,en2,ena,pulse,r_up,d_down,r_out,k_out,addrb,wea,addra,dina
    );


input clk,set,wea,pulse,ena;

input[6:0]addra,dina;

output [6:0]r_up,d_down,addrb,r_out(存储器输出),k_out;

output en1,en2,r_ready,down_en,up_en;

reg [6:0]r_up,d_down,addrb,k_out;


//counter_r_up

always@(posedge clk)
  begin
        if(set)           begin
             r_up<=0;
           end

        else if(en1==1)
          begin
           r_up<=r_up+1;
           end
end

    //counter_d_down

always@(posedge clk)

   begin

     if(set)
          begin
          d_down<=7'd127;
         end
      else if(en2==1)
        begin
           d_down<=d_down-1;
          end
  end


  //选择器

always@(posedge clk)

   begin
       if(set)
           begin
                addrb<=0;
          end
        else if(en2==1)
               begin
             addrb<=d_down;
                end
         else
            begin
              addrb<=r_up;
           end

end
  //en1和en2信号赋值
  assign    en1=((r_out==1)||pulse||(k_out==1))?1:0;
  assign     en2=(r_out>1)&&(k_out!==1)&&(!pulse);


   
  //counter_k_down #######感觉这部分有问题
  always@(posedge clk)
     begin
        if(set)
           begin
                k_out<=0;
           end

        else if(en1==1)
           begin
                k_out<=r_out-1;
           end

        else if(en2==1)
           begin
            k_out<=k_out-1;

             end
  end



  //rMEM 存储器例化
rMEM MYrMEM (
  .clka(clk), // input clka
  .ena(ena), // input ena
  .wea(wea), // input [0 : 0] wea
  .addra(addra), // input [6 : 0] addra
  .dina(dina), // input [6 : 0] dina
  .clkb(clk), // input c // input [6 : 0] addra
  .rstb(set), // input rstb
  .enb(en1), // input enb
  .addrb(addrb), // input [6 : 0] addrb
  .doutb(r_out) // output [6 : 0] doutb
);


endmodul


这里的en1、en2信号该用时序还是逻辑的??有些做成时序的可以延时
 楼主| 发表于 2013-5-23 20:05:16 | 显示全部楼层
回复 2# ivor_kandy


   已重新发了个贴,希望帮忙,非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-25 14:38 , Processed in 0.017614 second(s), 9 queries , Gzip On, Redis On.

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