如何动态反转verilog中的位位置?

时间:2015-01-23 12:01:03

标签: verilog

wire [9:0] data_reg;
reg [3:0] Reverse_Count = 8;  //This register is derived in logic and I need to use it in following logic in order to reverse the bit position. 
assign data_reg[9:0] = 10'h88;  // Data Register

genvar i;
for (i=0; i< Reverse_Count; i=i+1) 
   assign IReg_swiz[i] = IReg[Reverse_Count - 1 -i];

这会产生语法错误。我可以在verilog

中知道如何做到这一点

4 个答案:

答案 0 :(得分:2)

如果你有Reverse_Count为常数,那么你的任务归结为只是电汇混合,这在HDL中基本上是免费的。 在您的情况下,可以很好地将任务简化为首先镜像宽数据,然后移位Reverse_Count以获得其位置上的LBS位,这本身仅由一对N对1多路复用器完成。

integer i;
reg  [9:0] reversed;
wire [9:0] result;

// mirror bits in wide 10-bit value    
always @*
for(i=0;i<10;i=i+1)
    reversed[i] = data_reg[9-i];

// settle LSB on its place
assign result = reversed>>(10-Reverse_Count);

答案 1 :(得分:0)

Reverse_Count不是常数,即它不是parameterlocalparam

这意味着您将根据需要创建和销毁硬件的generate语句,这在verilog中是不允许的,因为它在硬件中是不可能的。

您的反转在编译时应具有固定宽度的总线,应该可以将Reverse_Count声明为参数。

答案 2 :(得分:0)

由于Reverse_Count dunamic的值,您不能使用generate语句。您可以使用带循环的always块。要进行综合,for循环需要能够静态展开。要确定哪些位反转,请使用if条件来比较索引值和Reverse_Count

示例:

parameter MAX = 10;
reg [MAX-1:0] IReg_swiz;
integer i;
always @* begin
  for (i=0; i < MAX ; i=i+1) begin
    if (i < Reverse_Count) begin
       IReg_swiz[i] = IReg[Reverse_Count - 1 -i];
    end
    else begin
       // All bits need to be assigned or complex latching logic will be inferred.
       IReg_swiz[i] = IReg[i]; // Other values okay depending on your requirements.
    end
  end 
end

答案 3 :(得分:-2)

你可以在这里做类似这样的代码: http://www.edaplayground.com/x/4FJ