如何在 verilog 中动态反转位位置

  • 本文关键字:位置 动态 verilog 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中执行此操作吗

如果你有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);

Reverse_Count不是常量,即它不是parameterlocalparam

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

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

由于 的值Reverse_Count dunamic,因此不能使用 generate 语句。您可以使用带有 for 循环的始终块。要合成,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

最新更新