wolfe 发表于 2009-8-6 23:19:50

这个verilog的程序错在那里?

当输入的端口上数据有变化时,输出一个负脉冲到MCU,
        assignin_int = creat_int_function(read_reg,old_read_reg);
        function creat_int_function;
                input read_reg,old_read_reg;               
                if( old_read_reg == read_reg )
                        creat_int_function = 1'b1;
                else
                        creat_int_function = 1'b0;       
        endfunction

read_reg的数据是时时在更新的, old_read_reg是保存前一次read_reg的值;
当MCU读取read_reg的值后,更新old_read_reg;
1.初始时read_reg = old_read_reg;
2.in_int = 1;
3.当端口上数据有变化时,根据以上程序,in_int=0;
4.外部MCU检测到in_int下降沿,读取数据,这时CPLD使old_read_reg = read_reg,那么in_int = 1;

但是实际上并没有这个下降沿,也就是说,无论端口数据怎么变化,in_int 总是为1;

刚学习verilog,希望明白的能指点一下下,,

谢谢了,,

tiger1125 发表于 2009-8-7 02:14:27

assignin_int = creat_int_function(read_reg,old_read_reg);
function creat_int_function;
input read_reg,old_read_reg;
if( old_read_reg == read_reg )
creat_int_function = 1'b1;
else
creat_int_function = 1'b0;
endfunction
---------------------------------------------
你用的是函数的方法来实现,但是函数是要有返回值的,你现在的函数没有返回值,当然
assignin_int = creat_int_function(read_reg,old_read_reg); 这句就没有起到赋值作用了。
建议重新编写一下函数部分

wolfe 发表于 2009-8-7 11:41:56

谢谢楼上的答复.
函数有返回值
assignin_int = creat_int_function(read_reg,old_read_reg);

function creat_int_function;
input read_reg,old_read_reg;
if( old_read_reg == read_reg )
creat_int_function = 1'b1;    // 返回1
else
creat_int_function = 1'b0;    // 返回0
endfunction

想来想去都没错啊``怎么就不行呢

wolfe 发表于 2009-8-7 13:45:56

问题找出来了,其实还是程序错误
assignin_int = creat_int_function(read_reg,old_read_reg);

function creat_int_function;   
input read_reg;
input old_read_reg;// 这里应该指定位数,否则默认的只是1位,
                        // 若不指定位数,实际上传递进来的只read_reg和old_read_reg中的最低位   
if( old_read_reg == read_reg )   
creat_int_function = 1'b1;    // 返回1
else   
creat_int_function = 1'b0;    // 返回0
endfunction

tiger1125 发表于 2009-8-7 19:23:23

原来如此
页: [1]
查看完整版本: 这个verilog的程序错在那里?