我是靠谱客的博主 正直雪糕,最近开发中收集的这篇文章主要介绍[HDLbits] Count clock(12小时制时钟问题)易错点:am到pm的变化verilog代码tb激励文件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

易错点:am到pm的变化

11:00am --> 12:00pm
11:00pm --> 12:00am

verilog代码

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 

    wire h_reset;
    wire [2:0] enable;
    assign enable[0] = ena;
    assign enable[1] = (ss == 8'b0101_1001);
    assign enable[2] = (mm == 8'b0101_1001)&&(ss == 8'b0101_1001);
    

    
    my_bcd my_bcd0(clk, reset, enable[0], ss);		//1s -> 60s(1min)
    my_bcd my_bcd1(clk, reset, enable[1], mm);		//1min -> 60min(1h)
    my_bcd_hh my_bcd2(clk, reset , enable[2], hh, pm);		//1h -> 12h
    
endmodule

module my_bcd(
	input clk,
    input reset,
    input enable,
    output reg [7:0] q
  
);
    
    always @(posedge clk)begin
        if(reset || ((q == 8'b0101_1001)&&enable))
            q <= 8'b00000000;
        else if(enable && (q[3:0]!=4'b1001))
            q <= q + 4'b1;
        else if(enable && (q[3:0]==4'b1001))begin
            q[7:4] <= q[7:4] + 4'b1;
            q[3:0] <= 4'b0;
        end
    end
            
            
    
    
endmodule

module my_bcd_hh(
	input clk,
    input reset,
    input enable,
    output reg  [7:0]  q,
    output reg pm
  
);
    
    
    always @(posedge clk)begin
        if(reset)begin
            q <= 8'b0001_0010;			//12 am 
        	pm <= 1'b0;
        end
        else if(enable && (q == 8'b0001_0010))begin		//12 --> 1
            q <= 8'b0000_0001;
        end
        else if(enable && (q == 8'b0001_0001) &&(pm == 1'b1))begin		//11pm --> 12am
            q <= 8'b0001_0010;
            pm <= 1'b0;
        end
        else if(enable && (q == 8'b0001_0001) &&(pm == 1'b0))begin		//11am --> 12pm
            q <= 8'b0001_0010;
            pm <= 1'b1;
        end
        else if(enable && (q[3:0]!=4'b1001))
            q <= q + 4'b1;
        else if(enable && (q[3:0]==4'b1001))begin
            q[7:4] <= q[7:4] + 4'b1;
            q[3:0] <= 4'b0;
        end
    end
  
endmodule

tb激励文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/01/30 13:35:00
// Design Name: 
// Module Name: module_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module module_tb(

//输入
	reg clk; 
	reg rst_n; 
	reg ena;
//输出
  wire  [7:0] hh;
  wire  [7:0] mm;
  wire  [7:0] ss;
  wire pm;

//信号初始化
initial begin
	clk = 1'b0;
	rst_n = 1'b1;
	ena = 1'b0;
	#100 rst_n = 1'b0;//延时100ns开始启动
	#100 ena = 1'b1;//延时100ns开始启动
end

//生成时钟,模拟晶振实际的周期时序
always #10 clk = ~clk; //每10ns,sys_clk进行翻转,达到模拟晶振周期为20ns
//或者:forever clk = #10 ~clk;

//模块例化
top_module top_module_tb(
    .clk(clk),
    .reset(rst_n),
    .ena(ena),
    . pm(pm),
    . hh(hh),
    . mm(mm),
    . ss(ss)
    ); 

endmodule

最后

以上就是正直雪糕为你收集整理的[HDLbits] Count clock(12小时制时钟问题)易错点:am到pm的变化verilog代码tb激励文件的全部内容,希望文章能够帮你解决[HDLbits] Count clock(12小时制时钟问题)易错点:am到pm的变化verilog代码tb激励文件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部