作者FTICR (FT-ICR)
看板Electronics
标题[问题] Verilog 用 data edge 作为讯号输入
时间Sun Jan 3 00:25:26 2016
各位板友好
想问一个基本的问题
一般verilog 常见的写法可能是这样
//sequentail part
always@(posedge clock) begin
if (rst) begin //synchronous reset
state <= state_1;
...
end
else begin
state <= next_state;
...
end
end
//combinational part
always@(*) begin
case(state)
state_1: begin
if (a==1) begin
next_state = state_2;
end
end
…
endcase
end
但如果如果想用一个讯号的 edge 来进到下个 state (asynchronous) 不知道怎麽作比较好
以下写法我知道不太合理
//sequentail part
always@(posedge clock) begin
if (rst) begin
state <= state_1;
...
end
else begin
state <= next_state;
...
end
end
//combinational part
always@(*) begin
case(state)
state_1: begin
if (
posedge a) begin
next_state = state_2;
end
end
…
endcase
end
请问各位前辈,正确的可以实现上面这个功能写法应该怎麽作?
谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.77.56
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1451751928.A.BE0.html
1F:推 kyo547896321: 照你这写法,还是得等clk才能换state吧? 01/03 01:51
这个写法连 ncVerilog 都不过 (更不用说合成了)
2F:→ kyo547896321: 如果是要和这block本身的clk不同步的话,那把你的a 01/03 01:53
3F:→ kyo547896321: 当作另一个DFF的clk来写,a的edge一来就能换state 01/03 01:54
确实觉得可能需要灌进去 clock,但 Verilog 有办法合成出这样的电路吗?
4F:→ kyo547896321: 不知道有没有误会你想问的问题就是了 01/03 01:54
5F:推 kyo547896321: 毕竟你的code和你描述的作法不是同一件事情 01/03 02:02
6F:→ kyo547896321: 1.用posedge a改next_state 2.用posedge a改state 01/03 02:07
7F:→ kyo547896321: 你的code是1但你的描述看起来像2 01/03 02:09
1的功能应该是 synchronous (在state_1时,如果a==1,posedge clock时会到state_2)
8F:→ kyo547896321: 要不要先说一下你的"进到下一个state" 01/03 03:56
9F:→ kyo547896321: 是改变state还是next_state 01/03 03:57
10F:→ kyo547896321: 如果是改state,那将a当作另一个DFF的clk是可行的 01/03 04:02
11F:→ kyo547896321: 毕竟不同block本来就可能用到不同的clk 01/03 04:03
12F:→ kyo547896321: 只是你得考虑multiple clk domain面临的麻烦就是 01/03 04:04
当然是改变 state,只是先在 conbinational part 输出到DFF的D,在sequentail part
posedge clock 时存进去(D → Q)
13F:→ Baneling: 建议你先有能力把基本能合成的code直接变成电路的能力 01/03 14:30
14F:→ Baneling: 再来想这些... 不过通常你弄懂电路的概念之後, 大概就知 01/03 14:31
15F:→ Baneling: 到你现在乱写code的"点"在哪了 01/03 14:31
我想把 Verilog code 画成电路这我作的到
想了一段时间,不知道 sequentail part 这样写是不是一个方法?
//sequentail part
always@(posedge clock or posedge a) begin
if (rst) begin //synchronous reset
state <= state_1;
...
end
else if (a && state==state_1) begin
state <= state_2;
end
else begin
state <= next_state;
...
end
end
※ 编辑: FTICR (219.70.169.149), 01/03/2016 16:07:20
16F:推 ptta: 就是把一个 之 comb signal当成 clock,可以合成,十年前就看 01/03 17:11
17F:→ ptta: 过了 01/03 17:11
18F:推 Leadgen: Comb signal当clock,不怕有glitch吗? 01/04 00:04
19F:推 obov: 理论上可以 实务上非常不建议 01/04 02:32
20F:推 Battie: a要glitch free,然後再delay,造出个pulse,才能sample自己 02/15 00:52
21F:→ Battie: state要gray code过,而且会常常sample到不是当下的state 02/15 00:55
22F:→ Battie: 不如全部改成同步设计 02/15 00:55