中科大OJ Verilog 在线评测题解 48-51

最近跟着老师学习Verilog,做了中科大的练习题,将答案记录一下

Q48计数器

题目描述

计数器是一种比较简单且常用的时序逻辑电路,下面电路图是一个从0到15循环计数的累加计数器,每个时钟的上升沿计数值加一,采用异步复位方式,高电平有效,复位值为0,该电路是由一个4bit加法器和一个4bit寄存器构成,波形如下所示。

试编写Verilog代码,完成上述电路功能。

输入格式

时钟clk,异步复位信号reset

输出格式

4位的计时器q

代码

module top_module (
    input clk,
    input reset,      // 异步复位,高电平有效,复位值为0
    output reg [3:0] q);
    always@(posedge clk or posedge reset)begin
        if(reset)
            q<=0;
        else
            q<=q+1;
    end
endmodule

Q49十进制计数器

题目描述

设计一个十进制计数器电路,从1到10循环计数,采用同步复位方式,高电平有效,复位值为1,如下面波形图所示

输入格式

一位线网型变量clk,时钟信号; 一位线网型变量rst,复位信号

输出格式

三位寄存器信号q, 计数器结果

代码

module top_module (
    input 				clk		,	//时钟信号
    input 				reset	,   //同步高电平有效复位信号
    output reg 	[3:0] 	q			//计数结果
);
// 请用户在下方编辑代码

    always@(posedge clk)begin
        if(reset)
            q<=1;
        else if(q==4'd10)
            q<=1;
        else
            q=q+1;
    end

//用户编辑到此为止 
endmodule

Q50带使能的计数器

题目描述

创建一带有使能信号的递减计数器,当使能信号有效(高电平)时,从15到5循环递减计数,每个周期减1,使能信号无效时,计数值保持不变,电路采用同步复位方式,高电平有效,复位值为5,电路结构如下图所示

输入格式

时钟信号clk, 同步复位信号reset, 使能信号en

输出格式

4bit计数信号q

代码

module top_module(
    input clk,
    input reset,
    input en,
  	output reg [3:0]q);
    always@(posedge clk)begin
        if(reset)
            q<=5;
        else if(en)
            if(q <= 4'b0101)
                        q <= 4'b1111;
            else
                        q <= q - 1;
        else
            q<=q;
    end
endmodule

Q51秒表

题目描述

在前面的时序逻辑电路中,我们没有对时钟频率做限定,但实际上在某些电路中时钟频率对设计有显著影响,例如秒表等计时电路。假设时钟频率为 4Hz,要求设计一个秒表电路,每 1 秒钟计数加一,计数结果用 BCD 码表示,共需 8bit,其中高 4 位为十位数(0~5,每 10 秒钟加 1),低 4 位为个位数(0~9,每 1 秒钟加 1),电路采用高电平有效的同步复位方式,复位值为 0。

输入格式

输入信号 clk, 时钟信号,频率 4Hz。 输入信号 reset,复位信号,高电平有效(复位)。

输出格式

输出信号 ss,位宽 8bit,每秒钟自增1,复位方式为同步复位,,复位值为 0。

代码

module top_module(
    input 			clk		,  //4Hz
    input 			reset	,
	output	[7:0]	ss
); 
	// Write your code here
  	reg [3:0]bit1,bit2; //个位、十位
    reg clk_s = 0;      //4分频1HZ
    reg clk_count = 0;  //用于分频

    always@(posedge clk) begin    //分频

        if(reset) begin
            bit1 = 0;
            bit2 = 0;
            clk_count = 0;
            clk_s = 0;
        end
        else begin
            clk_count <= clk_count + 1;
            if(clk_count)//2分频
                clk_s <= ~clk_s;
            else;
        end
    end


    always@(negedge clk_s) begin

        if(bit1 < 4'd10)
            bit1 <= bit1 + 1;    //累加个位
        else begin
            bit1 <=0;
            if(bit2 < 4'd6)    
                bit2 <= bit2+1;   //累加十位
            else
                bit2 <= 0;
        end

    end

    assign ss = {bit2,bit1};	
endmodule

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值