18266|4

14

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Verilog基础2 [复制链接]


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
  




verilog基础10-23.doc

319 KB, 下载次数: 7

此帖出自FPGA/CPLD论坛

最新回复

顶一下  详情 回复 发表于 2016-10-25 22:21
点赞 关注(2)
 

回复
举报

59

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
打拍那个补充一下,a信号必须是输入clk时钟域的信号,如果a与clk不是一个时钟域的则需要再打三拍,用后两拍来判断,这个是单bit跨时钟域的做法!
此帖出自FPGA/CPLD论坛
 
 

回复

18

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
顶一下
此帖出自FPGA/CPLD论坛
 
 
 

回复

18

帖子

1

TA的资源

一粒金砂(中级)

4
 
顶一下
此帖出自FPGA/CPLD论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

5
 
reallmy 发表于 2016-10-24 18:32
打拍那个补充一下,a信号必须是输入clk时钟域的信号,如果a与clk不是一个时钟域的则需要再打三拍,用后两拍 ...

嗯对的
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表