首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

nios中如何获取外部脉冲记数?

nios中如何获取外部脉冲记数?

如何对外部脉冲进行记数?好象timer core不能对外部的脉冲进行记数的

请高手解答下 ,谢谢了!

做一个记数模块完成记数,并做成Avalon总线从设备,nios ii通过Avalon访问记数值

可以用中断,来一个脉冲就+1

用中断的方式不太好,如果计数很频繁会影响系统的稳定性.最好用硬件逻辑来计数,传送给nios.

在交流中前进,共同实现nios的应用。

写了个模块 ,调试时总是读不出来值,请大家知道下,鉴别下哪里出错了.

module counter(
reset_n,
clk_av,
io,

s_address,
s_chipselect,
s_read_n,
s_write_n,
s_writedata,
s_readdata
);
input reset_n;
input clk_av;
input io;
input [15:0] s_address;
input  s_chipselect;
input s_read_n;
input s_write_n;
input [15:0] s_writedata;
output [15:0] s_readdata;

reg [15:0] s_readdata;
reg [15:0] counter_reg;
reg [15:0] counter;
reg [15:0] start_reg;
reg [15:0] end_reg;

always@(posedge clk_av or negedge reset_n)
begin
 counter_reg <= counter;
 if(~reset_n)
 counter_reg <= 16'd0;
 else if(s_chipselect &(~s_write_n)&(s_address == 16'd0))
 counter_reg <= s_writedata;
end

always@(posedge clk_av or negedge reset_n)
begin
 if(~reset_n)
 start_reg <= 16'd0;
 else if(s_chipselect &(~s_write_n)&(s_address == 16'd1))
 start_reg <= s_writedata;
end

always@(posedge clk_av or negedge reset_n)
begin
 if(~reset_n)
 s_readdata <= 16'd0;
 else if(s_chipselect &(~s_read_n))
 begin
    case(s_address)
    16'd0:
        s_readdata <= counter_reg; //16'h00ff;//
    16'd1:
        s_readdata <= start_reg;
    default:
        s_readdata <= 16'dz;
    endcase
 end
 
end
always@(io)
begin
if(start_reg==16'd1)
counter <= counter + 1;
end
endmodule

always@(io)
begin
if(start_reg==16'd1)
counter <= counter + 1;
end

这段话你的计数器不用时钟驱动,那怎么计数呢??

在交流中前进,共同实现nios的应用。

改成

always@(posedge io)
begin
if(start_reg==16'd1)
counter <= counter + 1;
end

来一个脉冲增加一个值可以不?

计数器本来就是对脉冲技术的,你的其他模块都是用clk_av当成时钟,为什么这个计数器用io做时钟。
在交流中前进,共同实现nios的应用。

这个io是外部脉冲的输入阿 ,我要记下的就是这个外部脉冲的输入数

nios要读取这个计数值还是要clk_av来操作地址的吧

我是这样理解的。

一样可以改成同步的,只要外部始终比你的系统时钟要低些,你可以先用异步的试试.
在交流中前进,共同实现nios的应用。
返回列表