Menu Close

Verilog 语法练习(7)计数器,算术右移,LFSR实现

1.

时序电路下实现一个带有高电平同步复位信号(复位到0)的4-bit counter, 触发器应由 clk 的上升沿触发,每个时钟的上升沿,计数器加1,加到15之后,再加1计数器回0。

module top_module (
    input clk,
    input reset,      
    output reg [3:0] q
);
    

endmodule

 

2.

时序电路下实现一个带有高电平同步复位信号(复位到0),从 0 到 9 计数的十进制计数器(4-bit counter),加到9之后,再加1时,计数器回0,循环往复。计数器并不是总是在每个时钟周期递增,当en信号为高时,计数器才能在时钟上升沿增加1。

module top_module (
    input clk,
    input en,
    input reset,
    output reg [3:0] q);


endmodule

 

3.

时序电路下实现一个高电平异步复位信号(复位到0)的4-bit的移位寄存器(右移)。要点如下:

  • areset:高电平异步复位信号
  • load:高电平时将data赋值给移位寄存器
  • ena:高电平时开始向右移位,并在最左边填入0。
  • q:4-bit 移位寄存器
  • 注意:load的优先级高于ena
module top_module(
    input clk,
    input areset, 
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q
); 
       

endmodule

 

4.

时序电路下实现循环移动(rotate)99-bit寄存器,即可以向左也可以向右循环移动。循环移动不丢失寄存器的任意位。要点如下:

  • load:高电平时将data赋值给移位寄存器
  • q:99-bit 循环移动寄存器
  • ena[1:0]控制循环移动的方向:
    • 2’b01:每次向右循环移动1-bit
    • 2’b10:每次向左循环移动1-bit
    • 2’b00或2’b11不做任何操作
  • 注意:load优先级高于ena
module top_module(
    input clk,
    input load,
    input [1:0] ena,
    input [99:0] data,
    output reg [99:0] q
); 

        

endmodule

 

5.

在问题3中右移位过程中高位补0也叫做逻辑右移(logical shift right),对于算术右移(arithmetic shift right)来说,高位应该补充符号位。在时序电路下实现一个64-bit的算术移位寄存器。要点如下:

  • load:高电平时将data赋值给移位寄存器
  • ena:选择是否需要移位
  • q:64-bit移位寄存器
  • amount:选择算术移位方向和位数:
    • 2’b00:左移1-bit
    • 2’b01:左移8-bit
    • 2’b10:右移1-bit
    • 2’b11:右移8-bit
module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q
); 


endmodule

 

参考代码:

[content_control]

arithematic_shift.txt

[/content_control]

 

6.

实现线性反馈移位寄存器(LFSR, Linear Feedback Shift Register)。LFSR是在移位寄存器的基础上添加了一些XOR门。这些添加XOR门,影响下一个状态的bit位叫做抽头(tap),如下图所示,tap在5和3(注意tap的位置一般从1开始)。这里bit 5虽然有tap,但是XOR门其中的一个输入是0(也就相当于没有XOR门)。代码实现要点如下:

  • reset:高电平同步复位信号,将q复位到5’h1
  • 注意q[4:0]是5-bit移位寄存器(不是q[5:1])

 

module top_module(
    input clk,
    input reset, 
    output reg [4:0] q
); 

endmodule

 

参考代码:

[content_control]

lfsr.txt

[/content_control]

 

7.

实现带有多路复用器(MUX)的LFSR,如下图所示:注意代码中提供的r和Q是[2:0],图中画的是从低位到高位。

module top_module (
    input [2:0] r,  
    input L,
    input clk,

    output reg [2:0] Q
);

endmodule

参考代码:

[content_control]

mux_lfsr.txt

[/content_control]

 

8.

在问题6的基础上,实现一个在位置 32、22、2 和 1 有tap的32-bit LFSR。

module top_module(
    input clk,
    input reset,    // 高电平同步复位,将q复位到32'h1
    output reg [31:0] q
); 


endmodule

 

参考代码:

[content_control]

32_lfsr.txt

[/content_control]

 

9.

实现下图所示移位寄存器。注意resetn是低电平同步复位信号。

module top_module (
    input clk,
    input resetn, 
    input in,
    output out
);

endmodule

 

参考代码:

[content_control]

in_out.txt

[/content_control]

 

10.

实现一个3-1 查找表,要点如下:

  • 模块内有一个8-bit寄存器Q [7:0],在enable信号为高的时候,不断左移,输入S补充空出来的位(低位不是补0)。
  • 输入A,B,C选择Q对应的索引,比如输入A,B,C分别为1,0,1,那么对应输出的Z应该为Q[3’b101] = Q[5]
module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output Z
 ); 
    
     

endmodule

 

参考代码:

[content_control]

3_1_lookup.txt

[/content_control]

 

对应视频:

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

发表回复

相关链接