[原创] Verilog基础2

一纸玫瑰   2016-10-23 20:26 楼主

Verilog基础

重点:在tb模块中的赋值方式取决于逻辑功能中的逻辑方式,如何使组合逻辑就用阻塞赋值,如果是时序逻辑就用非阻塞赋值。

1always写组合逻辑最好不要超过6级,避免时序紊乱(华为标准)。

2parameter  后的参数尽量使用大写,避免与变量混淆。

3、逻辑运算符(我们实现当a大于3小于9时输出b等于1,否则输出b等于0.

If(33 && a<9)

   b= 1;                   b = 1;

else                     else

   b= 0;                    b= 0;

  ()                     (二)

分析这两段代码假如a分别等于2,4,10那么(一)和(二)中的b分别为多少。

a=2

   对于(一)首先判断2>30,此时0<91,故b=1

   对于(二)2>302<91,0 &&10,故b=0

a=4

   对于(一)首先判断4>31,此时1<91,故b=1

   对于(二)4>314<91,1 &&11,故b=1

a=10

   对于(一)首先判断10>31,此时1<91,故b=1

   对于(二)10>3110<90,1 &&00,故b=0

5、位拼接

a = 4’b1101    b = 4’b0000 a的由低位完全移出至b

b0=1000 b1=0100 b2=1010 b3=1101  b <= {rx,b[2:0]}

a = 4’b1101    b = 4’b0000 a的由高位完全移出至b

b0=0001 b1=0011 b2=0101 b3=1101  b <= {b[3:1],rx}

总结:在位拼接移位的过程中,由低位移出则最后移出的移位是发送者的最高位,所以应该放在接受者的最高位,剩下的故为接受者的次高位到0    由高位移出则最后最后移出的为接受者的最低位,剩下的故为发送者的最高位到次低位。

6、边沿检测

  
file:///C:/Users/wwt/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
  

波形分析

   如果要检测信号a的上升沿,我们就要将a进行打拍,通过一级寄存器将信号a打了一拍得到a_rega_rega的前一拍的信号,如果a的现态为1前一拍为0,则表示遇到了a的上升沿。如果a的现态为0前一拍为1,则表示遇到a的下降沿。

代码实现

  
module dge(
  
    input       wire            sclk,
  
    input       wire            rst_n,
  
    input       wire            a,
  
    output  wire            led
  
);
  
  
reg     a_reg;
  
reg     podge;//posedge
  
reg     nedge;//negedge
  
  
/*
  
    通过寄存器打一拍得到的a_reg是
  
    信号a的前一个时钟周期的值
  
*/
  
always@(posedge sclk or negedge rst_n)
  
    if(!rst_n)
  
         a_reg <= 1'b0;
  
    else
  
         a_reg <= a;
  
/*
  
    上升沿的出现取决于信号a的现态为1,
  
    现态的前一个状态为0
  
*/      
  
always@(posedge sclk or negedge rst_n)
  
    if(!rst_n)
  
         podge <= 1'b0;
  
     else if((a == 1'b1) && (a_reg == 1'b0)) //({a,a_reg} == 2'b10)
  
         podge <= 1'b1;
  
     else
  
         podge <= 1'b0;  
  
/*
  
    下降沿的出现取决于信号a的现态为0,
  
    现态的前一个状态为1
  
*/         
  
always@(posedge sclk or negedge rst_n)
  
     if(!rst_n)
  
         nedge <= 1'b0;
  
     else if((a == 1'b0) && (a_reg == 1'b1)) //({a,a_reg} == 2'b01)
  
         nedge <= 1'b1;  
  
     else
  
         nedge <= 1'b0;  
  
         
  
assign led = nedge && podge;        
  
         
  
endmodule      
  

仿真代码

  
`timescale 1ns/1ns
  
  
module tb_dge();
  
  
reg         sclk;
  
reg         rst_n;
  
reg         a;
  
wire            led;
  
  
dge dge_inst(
  
    .sclk       (sclk),
  
    .rst_n  (rst_n),
  
    .a      (a),
  
    .led        (led)
  
);
  
  
initial sclk = 1;
  
always #10 sclk = ~sclk;
  
  
initial begin
  
     rst_n <= 0;
  
    a  <= 0;
  
    #40;
  
     rst_n <= 1;
  
    #120;
  
    a  <= 1;
  
    #40;
  
    a  <= 0;
  
    #80;
  
    a  <= 1;
  
    #60;
  
    a  <= 0;
  
   
  
end
  
  
endmodule
  

仿真波形

  
file:///C:/Users/wwt/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
  




回复评论 (4)

2推荐 reallmy 

打拍那个补充一下,a信号必须是输入clk时钟域的信号,如果a与clk不是一个时钟域的则需要再打三拍,用后两拍来判断,这个是单bit跨时钟域的做法!
点赞  2016-10-24 18:32
顶一下
点赞  2016-10-25 22:20
顶一下
点赞  2016-10-25 22:21
引用: reallmy 发表于 2016-10-24 18:32
打拍那个补充一下,a信号必须是输入clk时钟域的信号,如果a与clk不是一个时钟域的则需要再打三拍,用后两拍 ...

嗯对的
点赞  2016-10-26 15:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复