最近跟着老师学习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