• Verilog零基础入门(边看边练与测试仿真)-时序逻辑-笔记(4-6讲)


    第四讲

    1、计数器
    在这里插入图片描述
    代码:

    //计数器
    `timescale 1ns/10ps
    module counter(
    								clk,
    								res,
    								y
    								);
    input           clk;
    input           res;
    output[7:0]     y;
    
    reg[7:0]        y;
    wire[7:0]        sum;//+1运算的结果(1)
    assign           sum=y+1;//组合逻辑部分(2)
    
    always@(posedge clk or negedge res)
    if(~res) begin
    	y<=0;
    end
    else begin
    	y<=sum;             //可省略上面(1)(2)语句,y<=y+1;
    end
    endmodule
    
    
    //--------testbench of counter------
    module counter_tb;
    reg             clk,res;
    wire[7:0]       y;
    
    counter counter(
    								.clk(clk),
    								.res(res),
    								.y(y)
    								);
    								
    initial begin
    								clk<=0;res<=0;
    				#17     res<=1;
    			  #6000   $stop;
    end
    
    always #5 clk<=~clk;
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    仿真结果:
    在这里插入图片描述
    2、4级伪随机码发生器
    在这里插入图片描述
    在这里插入图片描述

    代码:

    //四级伪随机码发生器
    `timescale 1ns/10ps
    module m_gen(
    											clk,
    											res,
    											y
    											);
    input                 clk;
    input                 res;
    output                y;
    
    reg[3:0]              d;
    assign                y=d[0];
    
    always@(posedge clk or negedge res)
    if(~res)begin
    	d<=4'b1111;
    end
    else begin
    	d[2:0]<=d[3:1];      //右移一位
    	d[3]<=d[3]+d[0];     //模二加
    end
    
    endmodule
    
    //-------testbench of m_gen-------
    module m_gen_tb;
    reg                    clk,res;
    wire                   y;
    m_gen m_gen(
    											.clk(clk),
    											.res(res),
    											.y(y)
    											);
    											
    initial begin
    						clk=0;res=0;
    		#17     res=1;
    		#600   $stop;
    end
    always #5 clk=~clk;
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    仿真波形图:
    在这里插入图片描述
    在这里插入图片描述
    小结:
    在这里插入图片描述

    第五讲

    1、秒计数器(s_counter, 0-9秒循环计数)

    在这里插入图片描述
    代码:

    //2023-09-07,time
    //秒计数器,0-9循环;
    `timescale 1ns/10ps
    module s_counter(
    										clk,
    										res,
    										s_num
    										);
    input               clk;
    input               res;
    output[3:0]         s_num;
    
    parameter           frequency_clk=24;//24MHz
    
    reg[24:0]             con_t;     //秒脉冲分频计数器;
    reg                  s_pulse;   //秒脉冲尖;
    reg[3:0]       			 s_num;
    always@(posedge clk or negedge res)
    if(~res)begin
    	 con_t<=0;s_pulse<=0;s_num<=0;
    	
    end
    else begin
    	//if( con_t==frequency_clk*1000000-1)begin
    	if( con_t==frequency_clk*1000-1)begin//为了仿真方便观察,数值改小了
    		 con_t<=0;
    	end
    	else begin
    	   con_t<= con_t+1;
    	end
    	
    	if( con_t==0)begin
    		s_pulse<=1;
    	end
    	else begin
    		s_pulse<=0;
    	end
    	if(s_pulse)begin
    		if(s_num==9)begin
    			s_num<=0;
    		end
    		else begin
    		  s_num<=s_num+1;
    	  end
    	end
    end
    endmodule
    
    //-------testbench of s_counter------
    module s_counter_tb;
    reg           clk,res;
    wire[3:0]     s_num;
    s_counter s_counter(
    										.clk(clk),
    										.res(res),
    										.s_num(s_num)
    										);
    										
    initial begin
    	            clk<=0;res<=0;
    	      #17   res<=1;
    	      #300000 $stop;
    end
    
    always#5 clk=~clk;
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    仿真图:
    在这里插入图片描述2、秒计数器加数码管显示

    在这里插入图片描述
    3、0-59秒显示
    在这里插入图片描述
    小结:
    在这里插入图片描述

    第六讲

    1、相邻点累加
    在这里插入图片描述
    构想:
    在这里插入图片描述
    代码:

    //2023-09-11,time
    //相邻16点相加;
    `timescale 1ns/10ps
    module sigma_16p(
    												clk,
    												res,
    												data_in,
    												syn_in,
    												data_out,
    												syn_out
    											 	);
    input                   clk;
    input        						res;
    input[7:0]              data_in;//采样信号
    input                   syn_in;//采样时钟
    output[11:0]            data_out;//累加结果输出
    output                  syn_out;//累加结果同步脉冲
    
    reg                     syn_in_n1;//syn_in的反向延时;
    wire                    syn_pulse;//采样时钟上升沿识别脉冲;
    assign									syn_pulse=syn_in&syn_in_n1;
    reg[3:0]                con_syn;//采样时钟循环计数器
    
    wire[7:0]               comp_8;//补码
    wire[11:0]              d_12;//升位结果
    assign                  comp_8=data_in[7]?{data_in[7],~data_in[6:0]+1}:data_in;//补码运算;
    assign                  d_12={comp_8[7],comp_8[7],comp_8[7],comp_8[7],comp_8};
    reg[11:0]               sigma;//累加计算;
    reg[11:0]								data_out;
    reg                     syn_out;
    
    always@(posedge clk or negedge res)
    if(~res)begin
    	syn_in_n1<=0;con_syn<=0;sigma<=0;data_out<=0;
    	syn_out<=0;
    end
    else begin
    	syn_in_n1<=~syn_in;
    	if(syn_pulse)begin
    		con_syn<=con_syn+1;
    	end
    	
    	if(syn_pulse)begin
    		if(con_syn==15)begin
    			sigma<=d_12;
    			data_out<=sigma;
    			syn_out<=1;
    		end
    		else begin
    			sigma<=sigma+d_12;
    	  end
    	 end
    	 else begin
    			syn_out<=0;
    	 end
    end
    
    endmodule
    
    //---------testbench of sigma_16p_tb-------
    module sigma_16p_tb;
    reg                     clk,res;
    reg[7:0]                data_in;
    reg                     syn_in;
    wire[11:0]              data_out;
    wire                    syn_out;
    sigma_16p sigma_16p(
    												.clk(clk),
    												.res(res),
    												.data_in(data_in),
    												.syn_in(syn_in),
    												.data_out(data_out),
    												.syn_out(syn_out)
    											 	);
    
    initial begin
    	                   clk<=0;res<=0;data_in=1;syn_in<=0;
    	           #17     res<=1;
    	           #25000  $stop;
    end
    
    always #5 clk<=~clk;
    
    always #100 syn_in<=~syn_in;
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    仿真结果:
    data_in=1:
    在这里插入图片描述
    data_in=8’b1000_0001 //data_in=-1在这里插入图片描述

    小结:
    在这里插入图片描述

  • 相关阅读:
    IOS Swift 从入门到精通: 结构体的访问控制、静态属性和惰性
    爬虫 代理ip池构建及使用
    源码编译OpenCV 启用cuda 加速
    Android wifiMac地址显示异常坑
    深度学习实战02-卷积神经网络(CNN)实现服装图像分类
    Python期末复习题:面向对象
    【JUC】并发编程学习笔记(一)
    C语言的特点
    【Vue项目】面包屑处理品牌信息
    linux C语言 手写线程池
  • 原文地址:https://blog.csdn.net/qq_43374681/article/details/132732417