您的位置: EDA中国门户网站 >> 论坛 >> HDL语言 >> 查看帖子
字体: 小 中 大 | 打印 发表于: 2008-8-11 17:37 作者: edazoujie 来源: EDA中国门户网站
QUOTE:
原帖由 edazoujie 于 2008-8-12 12:23 发表 其实这个题目还是很有推敲的: (1) 这个中断XINT只能是在某个IO出现从高到低的跳变才出现从高到低的跳变,是一个边沿触发逻辑,用时钟检测是不可取的,如果有一个IO本来就是低电平的话,就不能触发中断,一定要从 ...
最新回复
windzjy (2008-8-11 17:46:24)
你判断XINT的下降延,并且读取寄存器之后为高就是了,可能没有明白你的意思
qingchuyu (2008-8-11 18:29:52)
yuananr (2008-8-11 22:16:34)
fwang (2008-8-11 22:27:32)
qinxg (2008-8-12 11:21:04)
edazoujie (2008-8-12 12:23:45)
(1) 这个中断XINT只能是在某个IO出现从高到低的跳变才出现从高到低的跳变,是一个边沿触发逻辑,用时钟检测是不可取的,如果有一个IO本来就是低电平的话,就不能触发中断,一定要从高到低的跳变才能触发XINT,如果要用时钟检测就要用类似MCU检测外部中断的方式了
(2)如何在DSP响应后使XINT拉高?这个很麻烦,
ql_smbj (2008-8-12 12:46:05)
设置一个状态寄存器state_reg[7..0],用于DSP与FPGA之间的通讯状态。DSP读完中断,并判别出是哪个IO有跳变之后, 向状态寄存器state_reg[7..0]发送命令,使得state_reg(0)=1,在FPGA内部可以命令: XINT <= XINT + state_reg(0)(可以设置state_reg[7..0]的初始状态为0xff)。
raulyrx (2008-8-12 12:46:51)
QUOTE:
针对(1),可以用时钟检测,而且也是比较好的解决方案,就是类似gpio一样,进来的信号delay 1ff(一般delay 2ff or 3ff for romving glitch),之后与原信号取反相与,就可以把跳变的沿可以产生一个clock cycle的宽度,当然就可以判断是否产生中断信号并写入中断寄存器.只是这个中断信号是由高电平变到低电平而已.(2)不管运用什么总线,一般的中断寄存器是用2个reg做的,一个叫中断状态寄存器,一个叫中断mask寄存器,只要读取了该中断状态寄存器,该中断寄存器可以采用自动clear,就是只要被读取了,,就自动clear掉,或者写1来clear.至于mask主要是做系统需要的,可以把一些不必要的中断屏蔽掉.
同意5楼的,说的已经很清楚了.
edazoujie (2008-8-12 13:08:47)
tspen (2008-8-12 15:32:26)
cryinrain_cug (2008-8-12 22:23:36)
其实找几个总线挂ip处理中断的例子看看会明白不少的
ilove314 (2008-8-12 23:02:58)
zfhlj (2008-8-12 23:33:36)
ighost (2008-8-13 19:30:54)
谢谢
lflin (2008-8-15 16:50:51)
case(current_state)
idle:
if(system_status != system_status_reg)
next_state = int_out;
else
next_state = idle;
int_out:
if((!bus.lbc_cs) && (!bus.lbc_oe) && (bus.lbc_addr == int_reg_1_addr))
next_state = int_reg_out;
else
next_state = int_out;
int_reg_out:
if((!bus.lbc_cs) && (!bus.lbc_oe) && (bus.lbc_addr == int_reg_1_addr))
next_state = int_reg_out;
else
next_state = int_clr;
int_clr:
next_state = idle;
default:
next_state = idle;
endcase
这个应该不是很麻烦吧,前几天刚做了这么个咚咚;
neptune1983 (2008-9-26 15:59:43)
lightzhou (2008-10-06 11:34:08)
可以用一个状态机去控制
bupt_skywalker (2008-11-15 11:19:55)
module detecting (i0,i1,i2,i3,i4,i5,i6,i7,clk,rst_n,xint,data,addr);
parameter DSIZE = 8;
parameter IDLE =0,INT_OUT=1,REG_OUT=2,INT_CLR=3;
input i0;
input i1;
...
output xint;
outout [DSIZE-1:0] data;
reg i0_d;
always@(posedge clk )
i0_d<=i0;
assign i0_pulse=(i0==1) and (i0_d==0);
...
assign pulse =i0_pulse |i1_pulse |i2_pulse |i3_pulse |i4_pulse |i5_pulse |i6_pulse |i7_pulse;
reg [1:0] current_state,next_state;
always@(posedge clk or negedge rst_n)
begin
if (rst_n==0)
current_state<=IDLE;
else current_state<=next_state;
end
always@(current_state)
begin
next_state= current_state;
case(current_state)
IDLE: begin
if (pulse==1) next_state=INT_OUT;
else next_state= IDLE;
end
INT_OUT: begin
if (addr==reg_addr) next_state=REG_OUT;
else next_state = INT_OUT;
end
REG_OUT:begin
if (addr==reg_addr) next_state=REG_OUT;
else next_state = INT_CLR;
end
INT_CLR: next_state = IDLE;
DEFAULT:next_state = IDLE;
end case
end
always@()
begin
if (current_state==INT_OUT)
xint=1'b1;
else if (current_state== INT_CLR)
xint=1'b0;
end
end module
yage1981 (2008-11-15 12:07:51)
yuananr (2008-11-15 13:48:33)