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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2961|回复: 9

信号使能问题

[复制链接]
发表于 2008-5-10 10:08:47 | 显示全部楼层 |阅读模式

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

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

x
请教高人:
   首先两个输入信号a,b一个输出信号c;
      现在要求是 只有当a 从0变为1时, 将 c <= b;
            之后,a将不起作用!即a为一个开始信号,并不是结束信号!
     请高手帮小弟解决!不胜感激!
发表于 2008-5-10 13:26:34 | 显示全部楼层
状态机啊。
发表于 2008-5-10 15:36:35 | 显示全部楼层
/***************************************************************
说明:假设a,b,c信号均在clk domain,即同步信号
code中状态机除非reset,没有返回IDLE的路径,通
常应该设置一个返回的控制信号.不知道满足不满足
楼主的需求,没有经过仿真,仅供参考
***************************************************************/
module test(
         c,
         a,
         b,         
         clk,
         rst_n
);
//===========================
//parameter declaration
//===========================
parameter     UDLY = 1;
parameter     IDLE = 1'b0;
parameter     START = 1'b1;
//===========================
//ports declaration
//===========================
output c;
input  a;
input  b;
input  clk;
input  rst_n;
//===========================
//signals declaration
//===========================
reg  cur_st;
reg  nxt_st;
reg  a_delay;
wire a_pose_edge;
wire c;
//===========================
//main code
//===========================
//a from 0 to 1
always@(posedge clk or negedge rst_n)
  begin
   if(!rst_n)
    a_delay <= 1'b0;
   else
    a_delay <= #UDLY a;
  end  
assign a_pose_edge = !a_delay & a;  
//state machine
always@(cur_st or a_pose_edge)
   begin
     case(cur_st)
        IDLE:
           if(a_pose_edge)
              nxt_st = START;
           else
              nxt_st = IDLE;
        START:  
              nxt_st = START;
        default:
           nxt_st = IDLE;
      endcase                    
   end
always@(posedge clk or negedge rst_n)
   begin
      if(!rst_n)
         cur_st <= IDLE;
      else
         cur_st <= #UDLY nxt_st;   
   end   
assign c = (cur_st == START)? b : 1'b0;
//=========================end code========================
endmodule

[ 本帖最后由 volcanozhd 于 2008-5-10 17:15 编辑 ]
发表于 2008-5-10 16:00:46 | 显示全部楼层

简单一点的

always @(posedge clk or negedge rst_n) begin
  if (rst_n == 1'b0)
    a_dly <= 1'b0;
    start  <= 1'b0;
    c        <= 1'b0;
  end
  else begin
    a_dly <= a;

    if (a == 1'b1 && a_dly == 1'b0)
        start <= 1'b1;

    if (start == 1'b1)
      c <= b;
  end
发表于 2008-5-10 17:12:39 | 显示全部楼层
楼上的好,呵呵.
发表于 2008-5-12 08:54:45 | 显示全部楼层
我觉的把c赋给b,和开始信号变为一应该同时发生,不应该差一个时钟周期
发表于 2008-5-12 10:04:29 | 显示全部楼层
一般都是用第二种方法了。
这个在华为的一个硬件设计规范里头,分别给出了使能信号的开始和结尾信号的抽取的方式,都是按这种方式写的了。
 楼主| 发表于 2008-5-12 14:25:53 | 显示全部楼层
谢谢热心的兄弟们!本人用的vhdl ,不过从verilog中也看出了点门道,能不能不用clk周期直接判断?
该语句想放到进程这外!以达到最快的速度传递。现本人将该问题,放入状态机中解决!但感觉不是太舒服!
我们再来讨论下,看能不能将这个问题很好的处理!毕竟在项目中这类的问题不少
发表于 2008-5-13 09:00:06 | 显示全部楼层
没有搞太明白,楼主的意思是a信号上升沿触发对D信号采样么?
发表于 2008-5-20 23:05:26 | 显示全部楼层
这用状态机是最容易的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-12 20:53 , Processed in 0.027841 second(s), 7 queries , Gzip On, Redis On.

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