Verilog基础
重点:在tb模块中的赋值方式取决于逻辑功能中的逻辑方式,如何使组合逻辑就用阻塞赋值,如果是时序逻辑就用非阻塞赋值。
1、always写组合逻辑最好不要超过6级,避免时序紊乱(华为标准)。
2、parameter 后的参数尽量使用大写,避免与变量混淆。
3、逻辑运算符(我们实现当a大于3小于9时输出b等于1,否则输出b等于0).
b= 1; b = 1;
else else
b= 0; b= 0;
(一) (二)
分析这两段代码假如a分别等于2,4,10那么(一)和(二)中的b分别为多少。
当a=2时
对于(一)首先判断2>3为0,此时0<9为1,故b=1
对于(二)2>3为0,2<9为1,0 &&1为0,故b=0;
当a=4时
对于(一)首先判断4>3为1,此时1<9为1,故b=1
对于(二)4>3为1,4<9为1,1 &&1为1,故b=1;
当a=10时
对于(一)首先判断10>3为1,此时1<9为1,故b=1
对于(二)10>3为1,10<9为0,1 &&0为0,故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_reg,a_reg为a的前一拍的信号,如果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 |