可合成的Verilog模块化移位寄存器

时间:2016-04-30 11:15:17

标签: verilog digital-logic shift-register

我正在使用不同宽度信号进行流水线操作,并且想要一个SYNTHESIZEABLE模块,其中我可以传递2个参数:1)管道数量(L)和2)信号宽度(W)。

这样我只需要实例化模块并传递2个值,这比通过伪寄存器键入负载和信号传播负载简单而强大......容易出错和等等。

我有HALF写了verilog代码,如果我错了,请你纠正我。

I AM FACING COMPILE ERROR ... SEE COMMENTS

*****************************************************************
PARTIAL VERILOG CODE FOR SERIAL IN SERIAL OUT SHIFT REGISTER WITH
1) Varying number of shifts / stages  : L 
2) Varying number of signal / register width : W
*****************************************************************

module SISO (clk, rst, Serial_in, Serial_out);  // sIn -> [0|1|2|3|...|L-1] -> sOut
parameter L = 60; //   Number of stages
parameter W = 60; //   Width of Serial_in / Serial_out 

input  clk,rst;
input  reg Serial_in; 
output reg Serial_out;


// reg [L-1:0][W-1:0] R; 
reg [L-1:0] R;           // Declare a register which is L bit long

always @(posedge clk or posedge rst) 
begin
  if (rst)                  // Reset = active high  
//**********************
     begin
        R[0] <= 'b0;            // Exceptional case : feeding input to pipe 
        Serial_out <= 'b0;      // Exceptional case : vomiting output from pipe 

     genvar j;
     for(j = 1; j<= L; j=j+1)   // Ensuring ALL registers are reset when rst = 1
     begin : rst_regs           // Block name = reset_the_registers
        R[L] <= 'b0;            // Verilog automatically assumes destination width @ just using  'b0
     end
     end
  else
//**********************
    begin
        generate
        genvar i;
        for(i = 1; i< L; i=i+1) 
            begin : declare_reg
                R[0] <= Serial_in;    // <----  COMPILE ERROR POINTED HERE 
                R[L] <= R[L-1];       
                Serial_out <= R[L-1];
            end
        endgenerate;
    end
//**********************
 endmodule
//**********************

1 个答案:

答案 0 :(得分:1)

为什么这么复杂?以下代码将更简单易懂:

module SISO #(
    parameter L = 60, // Number of stages (1 = this is a simple FF)
    parameter W = 60  // Width of Serial_in / Serial_out
) (
    input clk, rst,
    input [W-1:0] Serial_in,
    output [W-1:0] Serial_out
);
    reg [L*W-1:0] shreg;

    always @(posedge clk) begin
        if (rst)
            shreg <= 0;
        else
            shreg <= {shreg, Serial_in};
    end

    assign Serial_out = shreg[L*W-1:(L-1)*W];
endmodule

但是,查看代码时会出现以下问题:

  1. 您将Serial_in声明为input reg。这是不可能的,input不能是reg

  2. 您在始终阻止中使用generate..endgenerate。生成块是模块项,不能在always块中使用。只需删除generateendgenerate语句,并将i声明为integer

  3. 显然,Serial_inSerial_out必须声明为大小为[W-1:0]的向量。

  4. 您正在使用R作为记忆。声明如下:reg [W-1:0] R [0:L-1]

  5. 您没有在{for循环中使用i。显然你的意思是将R的所有元素链接在一起,但你只是访问第0个,第(L-1)个和第L个元素。 (显然Lth元素是不存在的,这个数组将从0到L-1。

  6. 我现在正在停止撰写此列表,因为,对不起,我认为通过改进您发布的代码确实没有什么好处。

相关问题