精华内容
下载资源
问答
  • Verilog中clk为什么要用posedge,而不用negedge

    万次阅读 多人点赞 2020-02-05 21:15:59
    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...
    • 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片内的时钟一致,这个东西就叫Global CLK

    技术分享图片

     

     

    展开全文
  • 取一个信号的上升沿或下降沿信号,可以通过将信号delay后,然后将原信号和delay信号,通过不同的与非操作,获取上升沿...always @ ( posedge clk or negedge rstn )  if( !rstn )  delay  else  delay   wire

    取一个信号的上升沿或下降沿信号,可以通过将信号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信号


    上升沿电路如下:



    注意:前两个触发器的运用就是起同步作用,将某个信号同步到采样时钟域,以后要重点注意使用


    阶段三:

    用阶段二的语句会比较繁琐,可以用下述语句简化:

    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语言入门

    千次阅读 多人点赞 2019-10-20 19:53:17
    基础 #号后面加延迟时间,单位为一个单位时间 ...Verilog 数值集合由:0 代表逻辑 0 或假状态,1 代表逻辑 1 或真状态,X 代表逻辑不定态,Z 代表高阻态 表示格式:<位宽>’<基数><数值&...

    基础

    • #号后面加延迟时间,单位为一个单位时间
    • b 表示二进制、d 表示十进制、o 表示八进制、h 表示十六进制
    • 十进制可以表示 0-9,其他三种除了原有的表示外新增了 X->逻辑不定态,Z->高阻态
    • Verilog 数值集合由:0 代表逻辑 0 或假状态,1 代表逻辑 1 或真状态,X 代表逻辑不定态,Z 代表高阻态
    • 表示格式:<位宽>’<基数><数值>
      • 位宽:描述常量所含位数的十进制整数,可选项
      • 基数:可选项,B 为二进制,O 为八进制,H 为十六进制,D 为十进制,默认此项缺省为十进制
      • 数值:对于基数为 D 或者 d 的情况,数值符可以为任何十进制数,但不可以是 X 或 Z
    • 约减运算符:同一个数的低位->高位依次参加位运算,得到的结果为 1 位的二进制数
    • 移位运算符:<<左移运算符,>>右移运算符,补 0

    Verilog 内置门级结构:

    门声明语句格式:
    <门的类型>[<驱动能力><延时>]<门实例 1>[,<门实例 2>,…<门实例 n>];

    1. and 与门
    2. nand 与非门
    3. nor 或非门
    4. or 或门
    5. xor 异或门
    6. xnor 异或非门
    7. buf 缓冲器
    8. not 非门

    wire 与 reg 的区别

    根据语义进行理解,wire 是连线,表示内部节点或者连线,assign语句中被赋值的信号必须是wire类型;reg 为 register 也就是寄存器,可以用来暂存内容,而且在always块中被赋值的信号必须定义为reg型。

    always @()的使用

    • always @ (posedge CLK or negedge RSTn):当 CLK 上升沿或者 RSTn 下降沿触发。(比较符合我们对基础的时序逻辑电路如触发器的一贯触发条件理解)
    • always @ (A):当 A 变化的时候触发,在 A 的前面没有加上 posedge 或者 negedge 的时候,表示 A 变化会触发,无上升下降等条件限制。
    • always @(*):跟正则表达式中 *的理解一致,代表所有,也即是在所有时候都触发了,这时也就可以看做是组合逻辑电路。

    推荐的用法模板

    always @ ( posedge CLK or negedge RSTn )
        if( !RSTn )
            begin
            i <= 4'd0;
            ....... end
        else
            case( i )
                0:
                ....... 
            endcase
    

    因为在Verilog语言中,程序是并发执行的,如果我们去看一大段并发执行的代码,估计够呛,所以这里我也认真思考了作者提供的“基于仿顺序操作想法”的模板,我们可以清晰的分析出在每个不同的条件下会触发哪些语句的实现并且有条理的将这些语句联想出一个功能。

    =赋值以及<=赋值

    下面一段是作者原话:

    基本上要搞懂这两个赋值操作符号的作用,就必须把“时序”的概念搞懂先。
    一般上,参考书只是告诉我们一个是非阻塞,一个是非阻塞 .... 说实话,
    当笔者把厚厚的参考书吃完以后,笔者完全还搞不懂究竟参考书都在说什么。
    如果从笔者的角度去理解的话,只有在时序的活动中才可以很清楚的看清它们的区别。
    宏观上,如同参考书中所说的一样;
    微观上,在时序中“=”是引发“即时事件”,“<=”则是引发“时间点事件”。
    

    可是貌似在看完这段话后,我发现还是没有理解透彻。。。因此自己去查阅了其他的资料。

    概念理解

    • 阻塞:如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能执行,就像被阻塞了一样,因此称为阻塞赋值方式。
    • 非阻塞:多条非阻塞语句赋值在过程快中同时完成赋值操作,多条语句相当于同时执行。

    示例

    • 阻塞示例
    module ifblock(clk,a,b,c);
    input clk,a;
    output b,c;
    reg rb = 0,rc = 0;
    assign c = rc;
    assign b = rb;
    always @(posedge clk)
        begin
            rb = a;//阻塞赋值
            rc = rb;
        end
    endmodule
    
    • 阻塞RTL视图
      在这里插入图片描述
    • 非阻塞示例
    module ifblock(clk,a,b,c);
    input clk,a;
    output b,c;
    reg rb = 0,rc = 0;
    assign c = rc;
    assign b = rb;
    always @(posedge clk)
        begin
            rb <= a;//非阻塞赋值
            rc <= rb;
        end
    endmodule
    
    • 非阻塞RTL视图
      在这里插入图片描述
    展开全文
  • Verilog 边沿检测电路

    千次阅读 2019-11-21 21:42:24
    边沿检测电路是 Verilog 数字电路设计中较为常用的电路,主要作用是在 clk 的驱使下,检测另一个信号的上升/下降沿电路; 检测的原理是记录指定信号前一个时钟和当前时钟的信号,并做对比,看看是否存在 1->0 ...

    边沿检测电路是 Verilog 数字电路设计中较为常用的电路,主要作用是在 clk 的驱使下,检测另一个信号的上升/下降沿电路;

    检测的原理是记录指定信号前一个时钟和当前时钟的信号,并做对比,看看是否存在 1->0 或者是 0->1 的变化;

    所以,实现的时候,需要两个触发器,一个用于记录当前 clk 时钟来临的时候,指定信号的数据,另一个记录上个时钟周期指定信号的数据;

    代码如下:

    module edge_detect(
        input clk,
        input n_rst,
        input data_in,
        output pos_edge,
        output neg_edge,
        output both_edge
        );
    	
    	reg data_in_0;
    	reg data_in_1;
    	
    	always @ (posedge clk or negedge n_rst)
    	if (!n_rst) begin
    		data_in_0 <= 1'b0;
    		data_in_1 <= 1'b0;
    	end
    	else begin
    		data_in_0 <= data_in;
    		data_in_1 <= data_in_0;
    	end
    	
    	assign pos_edge = data_in_0 & (~data_in_1);
    	assign neg_edge = data_in_1 & (~data_in_0);
    	assign both_edge = data_in_0 ^ ( data_in_1);
    
    endmodule

    每个时钟周期,首先将上一次的触发器数据打入 将数据打入 data_in_1 触发器,同时将当前输入的 data_in 打入 data_in_0;

    时刻对比 data_in_0 和 data_in_1 ;查看位的变化:

    1、如果从 0->1 说明是上升沿,那么 data_in_1 此刻是 0,data_in_0 此刻是 1,得出来 pos_edge 为 1,并且维持一个时钟周期

    2、如果从 1->0 说明是下降沿,那么 data_in_1 此刻是 1,data_in_0 此刻是 0,得出来 neg_edge 为 1,并且维持一个时钟周期

    3、上升沿,下降沿同时检测,也是一样的。不再多说,还是维持一个时钟周期;

    仿真文件 testbench 为:

    module tb;
    
        // Inputs
        reg clk;
        reg n_rst;
        reg data_in;
    
        // Outputs
        wire pos_edge;
        wire neg_edge;
        wire both_edge;
    
        // Instantiate the Unit Under Test (UUT)
        edge_detect uut (
            .clk(clk), 
            .n_rst(n_rst), 
            .data_in(data_in), 
            .pos_edge(pos_edge), 
            .neg_edge(neg_edge), 
            .both_edge(both_edge)
        );
    always #20 clk = ~clk;
        initial begin
            // Initialize Inputs
            clk = 0;
            n_rst = 0;
            data_in = 0;
    
            // Wait 100 ns for global reset to finish
            #100;
            
            // Add stimulus here
            n_rst = 1;
            
            #60;
            data_in = 1'b1;
            #60;
            data_in = 1'b0;
            #60;
            data_in = 1'b1;
            #60;
            data_in = 1'b0;
            #60;
            data_in = 1'b1;
            #60;
            data_in = 1'b0;
            #60;
            data_in = 1'b1;
            #60;
            data_in = 1'b0;
            #60;
            data_in = 1'b1;
            #60;
            data_in = 1'b0;
            #60;
            data_in = 1'b1;
            #60;
            data_in = 1'b0;
        end
          
    endmodule

    仿真波形:

     

    展开全文
  • verilog 综合注意事项

    万次阅读 多人点赞 2016-07-29 15:46:40
    verilog
  • Verilog入门基础知识

    2020-02-23 20:08:38
    当你看完下面内容后,应该就可以看懂一些基本的用Verilog语言编写的组合和数字电路了。 1.Verilog的数据类型 寄存器、线网数据类型和参数数据类型。真正在数字电路中起作用的数据类型是寄存器类型和线网数据...
  • m序列的原理以及verilog实现

    万次阅读 热门讨论 2017-09-21 19:19:16
    always@(posedge sclk or negedge rst_n) begin if(rst_n == 0)begin shift_reg ;//初值不可为全零 end else begin shift_reg[7] (shift_reg[0] & POLY[7])^ (shift_reg[1] & POLY[6])^ (shift_...
  • always @ (negedge clk or negedge rst_n) if(!rst_n) begin out2 <= 1'b0; cnt <= 2'd0; end else begin cnt <= cnt + 1'b1; if(cnt == 2'd1) out2 <= ~out2; else if(cnt == 2'd2) begin ...
  • Verilog支持设计者从算法的角度,即从电路的外部行为对其进行描述。 -结构化过程语句:initial语句和always语句。Verilog中的各个执行流程(进程)并发执行,每个initial语句和always语句代表一个独立的执行过程,...
  • always @ (posedge clk or negedge reset_n) if(!reset_n) bcd ; else if(load) bcd ; else if(en) if(bcd[3:0] ) bcd[3:0] [3:0] + 1'b1; else if(bcd[7:4] ) begin bcd[7:4][7:4] + 1'b1;bcd[3...
  • end 函数规则 函数不能包含任何时间控制的语句,如#, @, wait, posedge, negedge 函数不能调用任务,因为它可能会消耗仿真时间,但可以调用其他函数。 函数应该至少有一个输入 函数不能有非阻塞性的赋值或force…...
  • Verilog初级教程(10)Verilog的always块

    千次阅读 多人点赞 2020-07-12 01:57:45
    always块是Verilog中的程序块之一。always块内的语句是按顺序执行的。
  • Verilog 中 task的使用方法

    千次阅读 2020-06-04 20:59:14
    bit任务,并传入数据8‘h55 end endtask //经过以上两个任务中的调用,但是实际中任务仍然不会执行,要使任务在程序中执行则必须在initial或always中调用它 //调用任务 always @(posedge clk or negedge rst_n) tx_...
  • FPGA/Verilog 设计FIR滤波器

    千次阅读 多人点赞 2018-12-19 01:50:03
    FPGA/Verilog 设计FIR滤波器 文章目录FPGA/Verilog 设计FIR滤波器前言设计目标基础知识数字滤波器FIR滤波器具体实现matlab-获取FIR抽头系数matlab-产生波形数据FPGA-导入波形数据FPGA - FIR结构设计part1-移位寄存器...
  • Verilog设计实例(7)基于Verilog的数字电子钟设计

    万次阅读 多人点赞 2020-06-17 21:51:43
    基于模块化的设计思想, 采用 Verilog HDL 语言设计一个能进行时、分、秒计时的二十四小时制的数字电子钟, 并具有整点报时功能。 采用数码管进行时间显示,要求显示格式为:小时-分钟-秒钟。
  • Verilog 交通灯控制器

    千次阅读 多人点赞 2019-11-20 15:05:06
    Verilog完整代码实现如下: /*------------------------------------------------- Filename: traffic_light_controller.v Function: 交通灯控制器顶层模块(用于综合成实际电路) Author: Zhang Kaizhou Date: 2019...
  • Verilog】一、Verilog的always使用

    千次阅读 多人点赞 2019-10-09 20:29:20
    Verilog】一、always使用 有不足请各位观众老爷批评指正~ 一、Verilog HDL 模块的模板(仅考虑用于逻辑综合的程序) module<顶层模块名>(<输入输出端口列表>); output 输出端口列表; input 输入...
  • FPGA Verilog-1995 VS Verilog-2001 今天给大侠带来FPGA Verilog 1995-VS Verilog-2001,话不多说,上货。 2001年3月IEEE正式批准了Verilog‐2001标准(IEEE1364‐2001),与Verilog‐1995相比主要有以下提高。 ...
  • Verilog基本语法初学

    2020-08-11 20:27:30
    (七)任务与函数 1、任务 2、函数 (八)顺序执行与并发执行 (九)Verilog—2001语言标准 1、改进和增强的语法结构 提高Verilog行为级和RTL级建模的能力; 改进Verilog在深亚微米设计和IP建模的能力; 纠正和改进...
  • 就是因为简单、基础,能清晰说明单端口RAM的原理,顺手给出设计,也能说明你的设计基础,作为专题Verilog设计实例中的一员,单端口RAM必然上榜了! 曾经也写过很多类似的博文,在博客首页搜索即可,给出搜索链接: ...
  • Verilog 按键消抖的一些分析和想法

    千次阅读 多人点赞 2019-11-25 18:04:09
    最近在网上看了下 Verilog 按键消抖方面的设计,有一些个人的想法,做一些分析和记录; 电路板上,通常会提供若干按键,每个按键下赋予了不同的含义,按键的含义由具体的场景来定义; 打个比方,一组电路板上的...
  • 基于Verilog的SPI接口设计

    千次阅读 2020-06-12 16:14:12
    //写相对于spi来说是输出 always @(negedge sclk or negedge reset) if (!reset) wr_rd ; else if (cnt_full_d && cstate_d) wr_rd [15];//地址读取完后将最高位赋值给写,若为1则表明是进行写操作 reg [7:0] wdata...
  • 正文 背景介绍及回顾 我们在互联网上经常会看到这种按键防抖的Verilog设计,那就是大概每20ms读取一次开关,所谓的公认按键时间小于20ms。 事实上,不同的按键,其抖动时间是不一样的,参考资料:debouncing中,...
  • Windows下高效Verilog/System Verilog 开发环境搭建 0. 前言 ​ 在我们工程设计的过程中,经常会存在不直接跑EDA软件(如Vivado Quartus)编写Verilog 以及SV代码的情景 。 今天我就来安利大家一个小巧的Verilog/...
  • Verilog中的状态机

    2020-10-23 15:38:29
    //1 always block to describe state transition, state output, input condition always @ (posedge clk or negedge nrst) if (!nrst) begin NS ; {o1,o2,err} ; end else begin NS ; {o1,o2,err} ; case (NS) ...
  • Verilog实现序列检测器

    万次阅读 多人点赞 2019-10-13 14:02:34
    Verilog描述一个可综合的序列检测器用于检测输入数据码流中的特定序列(本次检测序列为10010,只要修改状态转移关系即可实现其他目标序列的检测)。当检测到10010序列(包括重叠的情况)时,序列检测器输出1,否则输出...
  • verilog寄存器复用小技巧

    千次阅读 2019-12-10 21:42:07
    在编写较为复杂的电路时,寄存器往往需要进行复用。... always @(posedge clk or negedge rst_n) begin if(!rst_n)begin state ; regfile ; end else begin state ; regfile ; end end endmodule
  • 常见不可综合的语句 敏感列表中同时带有posedge和negedge的不可被综合 always @(posedge clk or negedge rst_n) ...Verilog不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行
  • 文章目录FIFO 用Verilog实现一、FIFO 整理1、FIFO简介2、多时钟域设计中,不同时钟域数据如何进行交换?3、时序电路如何实现延时?4、非同源时钟同步化:二、异步FIFO设计1、FIFO的 空/满 检测**FIFO为空**:读写...
  • System VerilogVerilog 的关系标准当前的System Verilog标准是由IEEE(国际电子电气工程师协会)和Accellera(基于工业的标准协会)两个国际组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,051
精华内容 3,220
关键字:

negedgeverilog