0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog中clk为什么要用posedge,而不用negedge

FPGA设计论坛 来源:FPGA设计论坛 作者:FPGA设计论坛 2022-08-31 15:51 次阅读

取某个信号的上升沿或下降沿信号

取一个信号的上升沿或下降沿信号,可以通过将信号delay后,然后将原信号和delay信号,通过不同的与非操作,获取上升沿信号或下降沿信号: 阶段一: reg delay; // delay信号 always @ ( posedge clk or negedge rstn ) if( !rstn ) delay <= 0; else delay <= orig;   // orig是原信号 wire pos_signal = orig && ( ~delay ); // 原信号上升沿位置处产生的pulse信号 wire neg_signal = ( ~orig ) && delay; // 原信号下降沿位置处产生的pulse信号 阶段二: 上述操作会存在亚稳态问题,并且得到的上升沿信号pos_signal和下降沿信号neg_signal无法被原采样时钟clk采样。正确做法是,先将原信号用采样时钟delay 2次(打两拍),得到和采样时钟同时钟域的信号delay2,然后再按上述方法获取上升沿和下降沿信号,这时得到的上升沿或下降沿就可以被原采样时钟采样。 例句如下: reg ori_signal;// 需取上升沿或下降沿的原信号 reg delay1; reg delay2; always @ ( posedge clk or negedge rstn ) if( !rstn ) delay1 <= 0; else delay1 <= ori_signal;    always @ ( posedge clk or negedge rstn ) if( !rstn ) delay2 <= 0; else delay2 <= delay1;  // delay2 已与clk同域 reg delay3; always @ ( posedge clk or negedge rstn ) if( !rstn ) delay3 <= 0; else delay3 <= delay2;    wire pos_signal = delay2 && ( ~delay3 ); // 原信号上升沿位置处产生的pulse信号 wire neg_signal = ( ~delay2 ) && delay3; // 原信号下降沿位置处产生的pulse信号 上升沿电路如下:465c7812-2901-11ed-ba43-dac502259ad0.jpg        注意:前两个触发器的运用就是起同步作用,将某个信号同步到采样时钟域,以后要重点注意使用。 阶段三: 用阶段二的语句会比较繁琐,可以用下述语句简化: reg[2:0] delay; always @ ( posedge clk or negedge rstn ) if( !rstn ) delay <= 0; else delay <= { delay[1:0], ori_signal} ; // ori_signal是原信号 wire pos_signal = delay[1] && ( ~delay[2] ); // 原信号上升沿位置处产生的pulse信号 wire neg_signal = ( ~delay[1] ) && delay[2]; // 原信号下降沿位置处产生的pulse信号

Verilog中clk为什么要用posedge,而不用negedge

posedge是上升沿,电平从低到高跳变

negedge是下降沿,电平从高到低跳变

对于典型的counter逻辑

always @(posedge sys_clk or negedge sys_rst_n) begin

if(!sys_rst_n)

counter <= 24'd0;//十进制0

else if(counter < led_time) begin

flag_counter = 1'b0;

counter <= counter + 1'b1;

end

else begin

counter <= 24'd0;

flag_counter = 1'b1;

end

end

clk为什么要用posedge,而不用negedge呢?

一般情况下,系统中统一用posedge,避免用negedge,降低设计的复杂度,可以减少出错。

在ModelSim仿真中,时钟是很严格的,但是在真实的晶振所产生的clock却是不严格的,比如高电平和低电平的时间跨度不一样,甚至非周期性的微小波动。如果只使用posedge,则整个系统的节拍都按照clock上升沿对齐,如果用到了negedge,则系统的节拍没有统一到一个点上。上升沿到上升沿肯定是一个时钟周期,但是上升沿到下降沿却很可能不是半个周期。这都会出现问题。

FPGA特有的东西:Global CLK。FPGA内部有专门的CLK“线”,和一般的逻辑门的走法不一样,目的是为了保证整个FPGA片内的时钟一致,这个东西就叫GlobalCLK

467e5dce-2901-11ed-ba43-dac502259ad0.png

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110077
  • 触发器
    +关注

    关注

    14

    文章

    2000

    浏览量

    61134
  • 上升沿
    +关注

    关注

    0

    文章

    3

    浏览量

    1773

原文标题:Verilog学习笔记

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写

    ,seg_data_0}) ); always@(posedge clk or negedge rst_n) begin if(rst_n == 1\'b0) wr_cnt <= 10\'d0
    发表于 06-21 17:58

    关于Verilog的一些基本语法

    一、了解不同的变量类型 ①、wire和reg的区别 verilog的变量类型有wire类型和reg类型。在实际的电路wire类型对应的就是一根导线,只存在传输的作用。reg类型在
    发表于 05-31 18:31

    新手入门的简单小例子-05-重制版03基础计数模块

    :0] CNT; parameter CNT_MAX = 16\'d49999; always @(posedge clk or negedge rst_n)begin if( rst_n
    发表于 04-28 11:05

    新手入门的简单小例子-05-02

    clk or negedge rst_n) if( rst_n == 1\'b0 ) min_data <= 6\'b0; else if( (min_data == 6\'d59
    发表于 03-26 14:31

    新手入门的简单小例子-05-01

    ); parameter SEC_1S_MAX = 26\'d50_000_000; reg [25:0] count; //板载时钟转化为sec计数标志 always @(posedge clk
    发表于 03-26 11:41

    verilog实现卷积运算

    Verilog实现卷积运算,你可以使用以下示例代码。这里假设输入数据是有符号8位数,输出数据也是有符号8位数。卷积在数字信号处理通常指的是两个序列的逐元素乘积的和,也就是点乘。 module
    发表于 03-26 07:51

    Verilog 电子时钟实现

    Verilog实现一个简单的电子时钟,你可以使用一个计数器来周期性地递增一个计数值,然后根据这个计数值来显示时钟的不同时刻。以下是一个简单的例子: module clock_display
    发表于 03-26 07:48

    verilog语音实现浮点运算

    , mantissa} = a; // 将a的符号位、指数部分和尾数部分提取到对应变量 end always @(posedge clk) begin if (reset ==
    发表于 03-25 21:49

    8位串口收发器verilog语言实现

    end // FSM state flip-flops always @ (posedge clk or negedge rst_n) begin if (!rst_n
    发表于 03-25 21:45

    新手入门的简单小例子-04-2 建模实现

    ; regbit_flag; reg [7:0]data_req; //对应的1S计数 always @(posedge clk or negedge rst_n) if( rst_n == 1
    发表于 03-17 14:29

    芯片中的clk引脚是什么意思

    Clk引脚在芯片中是时钟信号的输入引脚。时钟信号在数字电路起着非常重要的作用,它用于同步芯片内各个模块的操作,确保它们按照正确的时间序列执行任务。 时钟信号的输入通常由外部晶振或振荡器提供,被接入
    的头像 发表于 03-08 16:41 8152次阅读

    veriloginput和output作用

    Verilog,input和output用于定义模块的输入和输出端口。它们是用于通信的关键元素,定义了模块与其它模块之间的数据传输接口。通过input和output端口,模块之间可以互相传递数据
    的头像 发表于 02-23 10:29 3148次阅读

    verilogfor循环是串行执行还是并行执行

    的for循环也是并行执行的。 Verilog的for循环可以用来实现重复的操作,例如在一个时钟周期中对多个电路进行操作。在循环内部,多个语句可以同时执行,不受循环次数的限制。这种并行执行的机制使得
    的头像 发表于 02-22 16:06 2909次阅读

    verilog function函数的用法

    Verilog 是一种硬件描述语言 (HDL),主要用于描述数字电子电路的行为和结构。在 Verilog ,函数 (Function) 是一种用于执行特定任务并返回一个值的可重用代码
    的头像 发表于 02-22 15:49 5560次阅读

    【每周一练】盘古1K开发板 练习六:时钟分频器设计

    always @ (posedge clk or negedge rst_n )//posedgenegedge
    发表于 12-24 18:10