我是Verilog的新手,这可能是一个愚蠢的问题,但Verilog解决此问题的首选代码流是什么:
简单计数器,将外部clk(INP)计数到特定值。如果计数器与该值匹配,则它会在一个clk周期内上升输出线(DRDY),然后将其降低为0.有一个外部输入(SR),我想设置比较值,因此如果SR = 0 ,那么计数最多为500000,如果SR = 1则最多为1000000.我可以用一个值来完成,但是我想扩展我的模块的功能。
提前谢谢。
到目前为止,我的代码只有一个值比较:
module ec(INP, RST, SR, DRDY, DRDY2);
input INP, RST, SR;
output reg DRDY, DRDY2;
reg [23:0] Q;
always @(posedge INP or negedge RST)
begin
if(!RST)
begin
Q <= 24'd0;
DRDY <= 1'b0;
end
else if( Q == 24'd1000000)
begin
Q <= 24'd0;
DRDY <= 1'b1;
DRDY2 <=~DRDY2;
end
else
begin
Q <= Q + 1;
DRDY <= 1'b0;
end
end
endmodule
答案 0 :(得分:0)
处理2个选项的简单方法是展开if语句:
always @(posedge INP or negedge RST) begin
if(!RST) begin
Q <= 24'd0;
DRDY <= 1'b0;
end
else if(
( (SR ==1'b0) && (Q == 24'd1000000) ||
(SR ==1'b1) && (Q == 24'd500000)
) begin
//...
end
else begin
//..
end
这在代码中看起来很混乱,因此可以分成计数目标逻辑,如果要支持更多选项,则切换到case语句而不是if。
reg [23:0] cnt_target ;
always @* begin
if (SR == 1'b1) begin
cnt_target = 24'd1000000 ;
else begin
cnt_target = 24'd500000 ;
end
end
always @(posedge INP or negedge RST) begin
if(!RST) begin
Q <= 24'd0;
DRDY <= 1'b0;
end
else if( Q == cnt_target) begin
//...
end
else begin
//..
end
注意:如果SR动态更改,您可能需要考虑使用Q >= cnt_target
,而不必等待Q溢出。对于我来说,加>=
的合成往往小于==
。