我觉得是不可以没有temp的,至少temp应该是1bit
wwthappy 发表于 2010-12-28 17:27 http://linux.chinaunix.net/bbs/images/common/back.gif
不要用软件的思维去思考硬件,硬件不像软件那么回事 回复 11# cjaizss
不是软件硬件的问题啊,确实得要用交换啊,要不怎么整呢?用verilog写估计也得这么写:
always @(posedge clk)
begin
temp = a;
a = b;
b =temp;
end
这里module没有写端口(只有a,b和clk),只是一个程序块。综合后生成的硬件就能完成xchg指令。这个代码综合后至少需要2个周期才能完成交换,(阻塞赋值非阻塞忘记了,好久没用了,用错请见谅)估计没有指令能在一个周期完成交换吧!
这里的temp综合后就是一个芯片内部的寄存器,但是没有引出端口,硬件对程序员就不可见,仅次而已。 只要一个变量是内存, 那么考虑处理器内部时钟频率和处理器内部总线频率和外部总线频率就不应该有一个时钟搞定这种想法.
从现在体系结构和工艺上讲,一个次搞定根本不可能.
至于是否存在2个寄存器直接对换的技术. 不考虑寄存器重命名. 而是考虑直接数据交换技术的话
先从系统思维角度来看.数据真正的存储状态,在触发器中.确切的说在门电路元件中,再确切在漏电流电压对栅极的影响.
如果是直接对换,那么不应该是非主从触发器.因为如果输入状态能瞬时影响输出状态,那么2组数据会相互串扰,当然可以通过电路延时来做到精确一致,防止不确定情况发生,但是过于依赖电气的精确必然工艺要求非常搞.
而所谓主从触发器也不过是将时钟二分频的一种做法.这实际在触发器级别-比寄存器级别更低级别上-有临时存储.而且不只增加一个TEMP是个2个TEMP. 本帖最后由 cjaizss 于 2010-12-29 12:22 编辑
回复cjaizss
不是软件硬件的问题啊,确实得要用交换啊,要不怎么整呢?用verilog写估计也得这么 ...
wwthappy 发表于 2010-12-28 21:41 http://linux.chinaunix.net/bbs/images/common/back.gif
这么写可以,阻塞写法,但注意这只是写法而已,实际并不是那么回事,我在前面说了,两个D触发器互换值就是D,Q对接
另外,对于verilog,非阻塞的写法更接近硬件行为
关键要明白是如何综合的.
对于CPU这样的复杂电路,xchg指令并不一定会马上导致两个寄存器值互换,只要语意上对就行了,但这个已经和硬件上的寄存器互换不一样了.
always@(...posedge clk)
...
else if(xchg)
begin
A<=B;
B<=A;
end 回复 13# epegasus
不信8051能在一个机器周期内完成的人可以看下面的连接(注意里面的"XCH A, @Ri"指令,就是1个cycle完成):
http://blog.163.com/qian-fly19870810/blog/static/515490782009917403096/
8051是intel在上个世纪70年代设计出的一款mcu核,相信现在的处理器都可以做到最短指令时间完成。 回复 15# garyv
查了下.上面写的周期叫机器周期.
8051有时钟周期 机器周期 指令周期 ,从下到上的分级别. 一个机器周期包含多个时钟周期.
并且XCH能操作内部RAM. 8051分内部RAM和外部RAM2种.虽然都统一编制,但是明显内部RAM很有限.而且可以对位寻址. 它更像是处理器内部的寄存器. 回复 16# smalloc
你说的是对的,8051的一个机器周期=12个振荡周期,1个振荡周期=1/(Core clk),它的最短指令执行时间是一个机器周期或12个振荡周期。
页:
1
[2]