作者arclitetank (More than meet the eye!)
看板Electronics
标题Re: [问题] veriog撰写问题
时间Wed Aug 5 23:33:17 2009
小弟在这里补上自己的想法
其实这电路应该不需要这麽复杂
除非我会错意了@@"
module add_sub(clk,reset,mod_n,incr,decr);
input clk,incr,decr,reset;
output [12:0] mod_n;
reg [12:0] mod_n;
always@(posedge clk)
begin
if(reset)
mod_n <= 13'd2000;
else
mod_n <= incr ? mod_n-13'd10 :
decr ? mod_n+13'd10 : mod_n;
end
endmodule
is this you want?
是的话有两件小东西你需要留意:
1. incr and decr 同时为high 会执行 mod_n - 13'b10.
2. reset可能需要另外做电路和clk synchronize起来
※ 引述《felghana (adol)》之铭言:
: module add_sub(clk,reset,mod_n,incr,decr);
: input clk,incr,decr,reset;
: output[12:0] mod_n;
: reg [1:0] state,next_state;
: reg [12:0] mod_n;
: parameter s0=2'd0,s1=2'd1,s2=2'd2,s3=2'd3;
: always@(posedge clk)
: begin
: if(reset)
: state=s0;
: else
: state=next_state;
: end
: //s0:重置用 s1:增加mod_n s2:减少mod_n s3:维持mod_n
: always@(state)
: begin
: case(state)
: s0:mod_n=13'd2000;
: s1:mod_n=mod_n+13'd10;
: s2:mod_n=mod_n-13'd10;
: default:;
: endcase
: end
: //当incr变为high时增加mod_n
: //当decr变为high时减少mod_n
: always@(state or incr or decr)
: begin
: case(state)
: s0:
: next_state=s3;
: s1:
: if(decr)
: next_state=s1;
: else
: next_state=s3;
: s2:
: if(incr)
: next_state=s2;
: else
: next_state=s3;
: s3:
: if(incr)
: next_state=s2;
: else if(decr)
: next_state=s1;
: else
: next_state=s3;
: default:
: next_state=s0;
: endcase
: end
: endmodule
: 上面是我写的verilog 程式码
: 目的是把mod_n传到除频器当除频参数
: 所以藉由控制mod_n可以决定除频後的频率
: 我目前的问题是 使用quartus II烧录至FPGA後
: 电路的动作完全错误 和我所撰写的完全不同
: 想问版上的高手
: 我的code是不是有容易被合成软体误解的地方
: 我已经改了很多次还是一样
: 麻烦好心的高手指点一下 谢谢
--
● NY B D A ¯︶¯ NY S J
⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙
— — — — — — — — —
郭勇志 勇维拉 宝贝勇 祖马勇 勇-ROD 勇巴西亚 勇塔那 King勇 勇乐迪
张伯勇 冈岛勇树 勇盾
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.165.98
1F:推 felghana:感谢 看起来意思是一样的 是我想太复杂了 08/05 23:57
2F:推 felghana:耶 等等 不太对 因为我想要incr或decr变high时只加一次 08/06 00:03
3F:→ felghana:你这样只要是clk正缘触发 会一直加 这样不行 08/06 00:04
4F:→ felghana:要等到incr变回low之後 再下一次变为high才能再加10 08/06 00:05
了解 如果是我的话我给incr和decr加 rising detector
always@(posedge clk)
if (reset)
incr_p0 <= 1'b0;
else
incr_p0 <= incr;
wire incr_trig = incr & ~incr_p0;
同理 decr 也是
mod_n就变成:
mod_n <= incr_trig ? mod_n-13'd10 :
decr_trig ? mod_n+13'd10 : mod_n;
※ 编辑: arclitetank 来自: 118.160.165.98 (08/06 00:11)