【USTC】verilog 习题练习 41-45

发布时间:2024年01月23日

41?下降沿触发的寄存器

题目描述

在时序逻辑电路中,敏感变量不但可以是触发信号的上升沿(posedge),也可以是下降沿(negedge),试创建 8bit 位宽的寄存器,所有 DFF 都应该由 clk 的下降沿(负边缘)触发。同时采用高电平有效的同步复位方式,复位值为 0x34 而不是零。

输入格式

输入信号 clk,时钟信号。 输入信号 reset,复位信号,高电平有效(复位)。 输入信号 d,位宽 8bit,任意数据信号。

输出格式

输出信号 q,位宽 8bit,在时钟下降沿取输入信号 d 的值,若复位信号有效则复位为值 0x34,复位方式为同步复位。

module top_module (
    input				clk		,
    input				reset	,
    input		[7:0]	d		,
    output	reg	[7:0]	q
);
	// Write your code here
    always @(negedge clk) begin
        if(reset) begin
            q <= 8'h34;
        end else begin
            q <= d;
        end
    end
endmodule

42?异步复位的寄存器

题目描述

在前面的例子中,复位信号只能在触发信号的触发边沿才能起作用,也就是说如果没有触发边沿就无法对电路复位,这大大限制了复位的功能,因此还有一种经常使用的复位方式,称为异步复位。
为了使复位信号不依赖于时钟边沿,则复位信号也应该放在always进程块的敏感变量列表中。复位信号高电平有效和低电平有效在编码时稍有不同,对于高电平有效的复位信号来说,可以写成如下形式:

always@(posedge clk or posedge reset)
begin
    if(reset) …
    else …
end

如果是低电平有效的复位信号,则应写成如下形式:

always@(posedge clk or negedge reset)
begin
    if(~reset) …
    else …
end

试创建Verilog模块,实现一个时钟上升沿触发的,支持高电平有效的异步复位功能的8bit寄存器,寄存器复位值为0。

输入格式

2个 1bit 位宽的信号 clk、areset 1个 8bit 位宽的信号 d

输出格式

1个 8bit 位宽的信号 q

module top_module (
    input clk,
    input areset,   // active high asynchronous reset
    input [7:0] d,
    output reg [7:0] q
);
// Write your code here
    always@(posedge clk or posedge areset)
        begin
            if(areset) q <= 8'b0;
            else q <= d;
        end
endmodule

43?带使能的寄存器

题目描述

在前面的电路中,寄存器输出端 q 在每个时钟的上升沿都会更新一次,但有时候我们可能需要使输出端保持不变,这时就需要加入使能信号,创建一 16bit 位宽(2byte)的寄存器,其中每字节都由一个使能信号控制,使能为 0 时,输出保持不变,使能为 1 时更新 q。时钟上升沿触发,同步复位,复位低电平有效,复位值为 0。

输入格式

任意有效的 16bit 位宽数据

输出格式

每个字节都由一个使能信号控制:使能为0时输出保持不变,使能为1时更新q

module top_module(
  input clk,
  input resetn,
  input [1:0] byteena,
  input [15:0] d,
  output reg [15:0] q

);
    always @(posedge clk) begin
        if (~resetn)
            q <= 16'd0;
        else
            case(byteena)
                2'b11 : q <= d;
                2'b10 : q[15:8] <= d[15:8]; //byteena[1] 控制上字节 d[15:8]
                2'b01 : q[7:0] <= d[7:0];   //byteena[0] 控制下字节 d[7:0]
                default : q <= q;
            endcase
        end
endmodule

44?触发器+逻辑门

题目描述

编写verilog代码,实现下图所示的电路功能

输入格式

1

输出格式

1

module top_module (
    input clk,
    input in, 
    output reg out);
    //your code
	wire res;
    assign res = in ^ out;
    always @(posedge clk) begin
    	out <= res;
    end
endmodule

45?寄存器+逻辑门

题目描述

编写Verilog代码,实现下图所示的电路功能,假设所有D触发器的初始复位值为0

输入格式

clk,x

输出格式

z

module top_module (
    input clk,
    input x,
    output z
); 
    reg Q1=0,Q2=0,Q3=0;
    wire D1,D2,D3;
    
    assign D1 = x ^ Q1;
    assign D2 = x & ~Q2;
    assign D3 = x | ~Q3;
    
    always @(posedge clk) begin
    	Q1 <= D1;
    	Q2 <= D2;
    	Q3 <= D3;
    end
    
    assign z = ~(Q1|Q2|Q3);
endmodule

文章来源:https://blog.csdn.net/luhputu520/article/details/135747932
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。