Menu Close

Verilog 语法练习(6)触发器模型

1.

根据下图给出的波形图,构建输出输出out的逻辑表达式。

 

module top_module ( 
    input x, 
    input y, 
    output out 
);

// 使用assign语句实现

endmodule

 

2.

对100-bit的输入向量in做以下操作:

  • 判断in的每bit是否与左边相邻的bit都为1,即输出in[x] AND in[x+1] 的结果。因为in[99]没有左边相邻的bit,所以输出out_and为99-bit
  • 判断in的每bit是否与右边相邻的bit任意为1,即输出in[x] OR in[x-1] 的结果,因为in[0]没有右边相邻的bit,所以输出out_or为99-bit
  • 判断in的每bit是否与左边相邻的bit不相同,即输出in[x] XOR in[x-1] 的结果,定义in[99]左边的相邻bit为in[0],输出100-bit的out_xor
module top_module( 
    input [99:0] in,
    output [98:0] out_and,
    output [99:1] out_or,
    output [99:0] out_xor );
  
//使用assign语句实现  

endmodule

 

对于接下来的问题,都是和时序电路相关,参考时序电路的基础Verilog 时钟的使用及触发器模型 。

3.

实现时序电路中常见的D触发器, 触发器应由 clk 的上升沿触发。

module top_module (
    input clk,    
    input d,
    output reg q 
);

    // always @ (posedge clk)...

endmodule

 

4.

如果问题3中的d和q都是8-bit的向量,实现D 触发器,触发器应由 clk 的上升沿触发。

 

module top_module (
    input clk,    
    input [7:0] d,
    output reg [7:0] q 
);

    // always @ (posedge clk)...

endmodule

 

5.

在问题4的基础上,添加一个高电平有效同步复位的 D 触发器。 触发器应由 clk 的上升沿触发。

module top_module (
    input clk,
    input reset,            //高电平有效同步复位
    input [7:0] d,
    output reg [7:0] q
);

endmodule

 

6.

修改问题5中的触发条件为clk时钟的下降沿触发,并且在reset信号为高电平时,将q复位成0x39,而不是0。

module top_module (
    input clk,
    input reset,            //高电平有效同步复位
    input [7:0] d,
    output reg [7:0] q
);

endmodule

 

7.

将问题5中的高电平有效同步复位的 D 触发器修改为高电平异步复位D触发器,触发器应由 clk 的上升沿触发。

 

module top_module (
    input clk,
    input areset,   //高电平有效异步复位
    input [7:0] d,
    output reg [7:0] q
);

endmodule

 

8.

实现16-bit的D触发器,复位条件为低电平同步复位信号,注意这里添加了一个2-bit的byte_en:byte_en[0]控制q[7:0],byte_en[1]控制q[15:8]。触发器应由 clk 的上升沿触发。

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

            

endmodule

 

参考代码:

[content_control]

byte_en.txt

[/content_control]

 

9.

实现以下电路,触发器应由 clk 的上升沿触发。

module top_module (
    input clk,
    input in, 
    output reg q
);

endmodule

 

10.

实现以下电路,触发器应由 clk 的上升沿触发。

module top_module (
    input clk,
    input x,
    output z
); 


endmodule

 

11.

使用D触发器构建J-K触发器,注意Qold是Q在时钟上升沿到来之前的值,触发器应由 clk 的上升沿触发。

module top_module (
    input clk,
    input j,
    input k,
    output Q); 


endmodule

 

12.

检测输入8-bit向量in的每一bit何时从一个时钟周期的 0 变为下一个时钟周期的 1(上升沿检测)。下图特意列出了in[1] 和 pedge[1] 波形来说明。pedge是输出的8-bit向量。注意pedge对每个上升沿只维持了一个时钟周期。触发器应由 clk 的上升沿触发。

 

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] pedge
);


endmodule

 

参考代码:

[content_control]

pedge.txt

[/content_control]

 

13.

在问题12的基础上,将检查上升沿的输出8-bit向量pedge换成检查任意边沿(上升沿或是下降沿)的8-bit向量anyedge,如下图所示。触发器应由 clk 的上升沿触发。

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] anyedge
);

endmodule

 

14.

检测输入32-bit向量in的每一bit何时从一个时钟周期的 1 变为下一个时钟周期的 0(下降沿检测)。如果没有高电平同步复位信号reset,对应的输出向量out会一直挂起,如下图所示。触发器应由 clk 的上升沿触发。

module top_module (
    input clk,
    input reset,
    input [31:0] in,
    output [31:0] out
);

endmodule

 

参考代码:

[content_control]

solution.txt

[/content_control]

 

15.

双边沿触发器在Verilog中不存在相应的模型,不过可以通过巧妙的使用单边沿触发器实现。双边沿触发器的波形图如下所示:

 

module top_module (
    input clk,
    input d,
    output q
    
);


endmodule

 

参考代码:

[content_control]

dual.txt

[/content_control]

 

对应视频:

Posted in FPGA, FPGA 教材教案, FPGA习题库, 教材与教案, 文章

发表回复

相关链接