作者henry666666 (雨四光)
看板Electronics
标题Re: [请益] verilog如何在一个always判断触发源?
时间Sun Apr 5 18:40:51 2009
※ 引述《tkhan (脑残绿吱吱)》之铭言:
: 标题: Re: [请益] verilog如何在一个always判断触发源?
: 时间: Fri Apr 18 00:27:29 2008
:
: ※ 引述《icetofux (豆腐)》之铭言:
: : input in0,in1;
: : reg a;
: : always@(in0)
: : begin
: : a=0;
: : end
: : always@(in1)
: : begin
: : a=1;
: : end
: : 在软体模拟上,compile会通过,也能进行波形模拟,但是以donwload用的软体去进行
: : compile,则会告诉不能让两个always叙述去变动同一个变数值。
: : 如果我想改成:
: : always@(in0 or in1)
: : begin
: : ...
: : end
: : 我要怎麽去判断到底是in0有动作还是in1有动作而进入always叙述呢?
:
: always @(in0 or in1)
: begin
: if(in0)
: a=0;
: else if(in1)
: a=1;
: else
: a=0;
: end
: 上课要认真..
: 这是基础中的基础..
上课不认真的来问问题了:
//程式如下
module test(in0,in1,a);
input in0,in1;
output a;
reg a;
always @(in0 or in1)
begin
if(~in0)
a=0;
else if(~in1)
a=1;
else
a=0;
end
endmodule
我希望能做到,
当in0改变的时候,执行a=0
当in1改变的时候,执行a=1
但是这样写……
当我按下in0的时候
进入always里面,然後进入if判断,a=0。
到此都没有问题。
但我in0还没放开(~in0还是==1)时,
我又按下in1
这时候虽然是因为in1改变进入always里面
不过它仍会执行a=0。
所以请问是:
a.要避免这种行为?
b.有其它写法?
///////////题外话///////////
为什麽会用到这个呢,
原因就是我们的fpga板子的七段显示器
它一次只能控制一个数字,所以要一次显示4个数字的时候(EX:1142)
要先跳到第一个七段显示器
然後显示1
接着跳到第二个
然後显示1
……
刷快一点就像1142了
现在的问题是我想要更改数字,
七段显示器在两种情况下会改值
一是它很快的刷刷刷
二是因为我按下更改数字的按钮
他在刷的时候,触发的是clock
改数字的时候,触发的是按钮
这不同的两个情况,要对同一个值(七段显示器)作不一样的变更动作
如果always可以分开写就好了……
--
尽管生命的起源只是一种化学反应
尽管人类的存在只是记忆数据的影子
尽管灵魂并不存在,精神只是神经细胞的火花
尽管世上没有神,人一定要靠一己之力在这残酷的世界中挣扎求存
我还是......
我还是...... 要以意识之名命令你───「活下去」
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.216.126
※ 编辑: henry666666 来自: 140.114.216.126 (04/05 18:41)
1F:推 arksbubble:写一个case怎麽样? 针对in0 in1的四种组合做判断 04/05 18:53
2F:→ arksbubble:这样应该就可避掉in0还没放开时 输入in1的问题了 04/05 18:54
3F:推 finalhaven:因为你in0先按了阿,所以他就一直作到in0条件成立 04/05 18:55
4F:→ finalhaven:他就跳出那个always回圈了@@,当然不会跳到in1里面去 04/05 18:56
5F:→ finalhaven:就如上面大大讲得用Case就可避免XD 04/05 18:56
还是不会写Q__Q
case({in1,in0})
有以下几种排列
00
01
10
11
那这个00呢,
究竟是 10 (in0按住不放) 的时候按下「in1」变成的,
还是 01 (in1按住不放) 的时候按下「in0」变成的?
前者的话是in1 trigger的,後者相反呢……
※ 编辑: henry666666 来自: 140.114.216.126 (04/05 19:05)
6F:推 ksmrt0123:把输入(按钮处理与register值变更)与输出(把register值 04/05 20:25
7F:→ ksmrt0123:以scan方式在7-seg显示)分别写成两个blocks 04/05 20:26
这样写会过吗?
串一下这篇文章开头,似乎不行呢
还是我理解错误?
……
或者指的是下面这种方法
显示器为D[7:0]
然後暂存是r1[7:0] r2[7:0] r3[7:0] r4[7:0]
scan的block里
更改D对应到r1 r2 r3 r4
再来一个block
更改r1 r2 r3 r4里的值
然後因为改的东西不一样,就会过
是这吗?
※ 编辑: henry666666 来自: 140.114.216.126 (04/05 21:03)
scan应该可以用回圈写的说……嗯
※ 编辑: henry666666 来自: 140.114.216.126 (04/05 21:05)
8F:推 ksmrt0123:嗯... 就是这样 04/05 21:33
目前scan的问题已经解决了,用上面的方法
9F:→ ksmrt0123:补充一下, 你code问题不在分block, 分block也无法解决 04/06 00:12
10F:→ ksmrt0123:multiple drivers for a net 的问题... 问题在那你没给 04/06 00:13
11F:→ ksmrt0123:完整的code看不太出来... 可能是 scan 的处理没弄好, 04/06 00:14
12F:→ ksmrt0123:也可能是"改数字的时候,触发的是按钮"这句话... 04/06 00:15
^^^^^^^^^^^^^^^^^^^^^^^^^^
其实是改数字的时候,触发的是按钮
可是if判断成clock
--
那如果回到上面的code
(叫multiple drivers for a net?)
是不可能办到的吗?
※ 编辑: henry666666 来自: 140.114.216.126 (04/06 12:56)
13F:推 ksmrt0123:抱歉 multiple drivers 是最上面的code 不是你的 头昏了 04/06 21:40