verilog语法--边沿检测

先看程序:
module count(out,data,load,reset,clk);
output[7:0] out;
input[7:0] data;
input load,clk,reset;
reg[7:0] out;
always @(posedge clk)
begin
if (!reset)
out = 8'h0;
else
if (load)
out = data;
else
out = out + 1;
end
endmodule
1.本想对clk计数,而此程序中不妥地方是只有在clk的上升沿时always才会被执行。如果clk没有变化则reset、load无效,且clk有变化但reset或load有效时将会漏掉计数。如果不采用更高的时钟对clk采样能否解决这个问题。
2.另外上面程序编译时会有如下警告Warning (10230): Verilog HDL assignment warning at count.v(63): truncated value with size 32 to match size of target (8)。双击时指向out = out + 1;不知道为什么

下面是VHDL语言的思路:
process(clk,reset,load) 三个信号中的任意一信号都会触发该进程
begin
if(reset='0')then 如果复位有效
out <= "00000000"; 清0
else
if(load='1')then 如果加载有效
out <= data;
else 否则计数
out <= out + 1;
end if;
end if;
end process;
我想用这verilog实现这种思想。如果有其它方法也很感谢大家能够提出。
VHDL那段程序有误,现改正如下
process(clk,reset,load) 三个信号中的任意一信号都会触发该进程
begin
if(reset='0')then 如果复位有效
out <= "00000000"; 清0
else
if(load='1')then 如果加载有效
out <= data;
else 否则
if(clk'event and clk='1')then 在clk的上升时计数
out <= out + 1;
end if;
end if;
end if;
end process;
-----------------------------------------
to 回答者: ttknw
谢谢您的解答,通过你的方法可以解决问题。
我想请教一下,verilog中有没有像VHDL这样的一种实现方法:
VHDL:在进程中process中还可以使用边沿检测语句if(clk'event and clk='1')。
Verilog:目前只知道能通过always@(posedge clk)实现边沿检测,或者就是你那种方法。而前者中,边沿检测功能只能处于最上层。请教,Verilog能实现VHDL那种方法吗。

第1个回答  推荐于2016-10-31
先回答你的第二个问题:因为你没有指定位宽,所以系统提示默认为32位
所以你将out <= out + 1 改为out <= out + 1'b1 就可以了。
另外注意:在时序电路里面要用<=

再回答你的第一个问题
只需要将load信号先进行上升沿检测,(即在上升沿装载)即可,这样即使load一直为高电平,也不会影响计数。至于你提到的当reset有效时漏掉计数是正确的,否则复位也就没有意义了。

module count(out,data,load,reset,clk);
output[7:0] out;
input[7:0] data;
input load,clk,reset;
reg[7:0] out;

//下面是进行load上升沿检测的代码,这样即使load一直为高电平,也不会影响计数

reg ld_r1,ld_r2;
wire load_p;

always @(posedge clk) begin
if (!reset) begin
ld_r1<=1'b0;
ld_r2<=1'b0;
end
else begin
ld_r1<=load;
ld_r2<=ld_r1;
end
end

assign load_p = ld_r1 & (~ld_r2);

//----------------------------------
always @(posedge clk) begin
if (!reset)
out <= 8'h0;
else
if (load_p) //这里需要改成 load_p
out <= data;
else
out <= out + 1'b1;
end
endmodule本回答被提问者采纳
第2个回答  2010-07-28
你第一个问题到底说的是什么?什么东西不妥?这个思路不是跟VHDL程序的思路完全一样么?
至于第二个问题,我不知道你用的是什么软件,反正我用ISE11.4综合没有提示warning

verilog中@posedge包含哪些情况?
在Verilog中,@posedge语句用于在特定边沿触发事件时执行操作。它能够检测四种边沿状态:0、1、x、z。那么@posedge包含哪些情况呢?根据Verilog-2005标准的9.7.2节Event control部分的定义:posedge在以下四种情况下会被检测到:从1到x、z或0,以及从x或z到0。同样,@negedge则在从1到x、z或0,以及...

Verilog hdl 如何检测时钟的上升沿和下降沿?
begin F1<=SCKr;\/\/需要检测的引脚 F2<=F1;end \/***\/ assign SCK_fallingedge = F2 && !F1;\/\/检测时钟的上升沿 assign SCK_risingedge = F1 && !F2;\/\/检测时钟的下降沿 always @(posedge CLK or negedge RSTn)if(!RSTn) begin ... end else if(SCK_fallingedge == 1)bi...

verilog hdl中有了posedge和negedge为什么还要用脉冲边沿检测?。
脉冲边缘检测方法更准确的说是实现有效脉冲边缘的检测,它实际上包含了无效脉冲边缘的滤除功能(俗称消抖)。因此,不能直接采用原始输入脉冲用negedge\/posedge语句来实现。当然,换句话说,如果你用该两条语句,但实际用的脉冲信号是经过消抖等处理的话,其实也是可以的。个人的看法,供参考。

请教关于verilog HDL语言中关于always语句块的问题?
rising_edge拉高时代表检测到上升沿 falling_edge拉高时代表检测到下降沿 rising_edge || falling_edge 代表检测到边沿 reg[1:0] sign_in_d;reg rising_edge;reg falling_edge;always@(posedge clk)sign_in_d <= {sign_in_d[0],sign_in};always@(posedge clk or negedge rstn)if...

Verilog HDL菜鸟学习笔记———五、一些基础知识
任务定义结构不能在过程块内,可以调用函数或任务。generate生成块动态生成Verilog代码,如生成模块、用户定义原语、门级语句等。(5) 用Verilog实现边沿检测电路:可实现上升沿、下降沿或双沿检测。使用边沿敏感的always块,根据时钟信号和触发信号的逻辑关系,判断信号变化的沿类型并输出检测结果。

使用Verilog如何设计一个上升沿检测器?
Posedge用来作为时钟使用的。相当于触发器的时钟输入端。要检测信号上升沿的话,可以采用以下方法:always@(posedge clk or negedge rst)if(!rst)begin sign_1b <= 1'b0; sign_2b <= 1'b0; end else begin sign_1b <= sign; sign_2b <= sign_1b; end always@(posedge clk or negedge ...

verilog,信号变量的保持问题
边沿检测,很简单的,特权《深入浅出玩转FPGA》的按键消抖例程里面原理讲的很清楚,你去找一下视频吧,网上很多的 大概的程序 always @(posedge sys_clk or negedge rst_n)begin if(!rst_n)key_r <= 0;else key_r <= key_in;end assign rise = key_in & ~key_r;当key_in有上升沿的...

求教一个理想adc veriloga模型问题
简单说,需要一个随输入实时变化的adc,不需要clock,DC仿真的时候也能工作 也可以,用cross语句可以实现边沿检测。。

verilog出现如下的问题如何解决
具体的我还要先调试一下再说。下周上班了到公司里调试了之后给你答复~~~楼下的说得很对,阻塞和非阻塞赋值一起不正确。上面的问题我查过了,在敏感信号里面可以是不同的信号的不同边沿一起存在,只是同一信号在一个敏感信号列表里不能同时检测上升沿和下降沿 ...

【从零开始学数字芯片-第二期】数字设计基础学习计划
经典数字设计问题包括:竞争冒险、亚稳态、同步设计、低功耗技术、时钟分频、无毛刺切换、异步复位同步释放、计数器、边沿检测、串并转换、跨时钟域处理、流水线技术、状态机、静态时序分析(STA)、存储单元设计(单双口RAM\/ROM)、低速通信协议(IIC、UART、SPI)、AMBA总线协议等。后续将陆续发布相关学习...

相似回答