我在维护位顺序符号方面遇到一些困难,想验证我在 Vivado/Verilog 中分配和连接电线的方式。
基本上,我从 128 根线的传入输入开始,每根线都是 14 位 [13:0]。
我通过这样做将所有这些并行线连接成串行流:
module DAC_slave_rearrange(
input clk,
input [13:0] data_im0,
input [13:0] data_im1,
input [13:0] data_im2,...
output [2047:0] s12_i );
wire [13:0] in_im_tmp [127:0];
assign in_im_tmp[0] = data_im0;
assign in_im_tmp[1] = data_im1; ....
genvar iter;
generate
for (iter = 0; iter < 128; iter = iter +1) begin
assign s12_i[16*iter +: 16] = {in_im_tmp[iter],2'b00} ; //{in_re_tmp[iter], 2'b00 } ;
end
endgenerate
这 128 条线在 32 MHz 时钟上运行。但我需要在 128 MHz 时钟上处理它们,因此我需要将 128 相转换为 16 相。由于采样率保持不变,因此不需要缓冲区,只需基本的数据操作。然而,似乎我的位顺序引起了问题。
module rate_convTx(
input clk_32,
input clk_128,
input rst,
input enTx,
input [2047:0] data_in_i,
output [255:0] data_outi
)
parameter [3:0] IDLE = 4'd0, phase_1 = 4'd1, phase_2 = 4'd2, phase_3 = 4'd3, phase_4 = 4'd4, phase_5 = 4'd5, phase_6 = 4'd6, phase_7 =4'd7, phase_8 = 4'd8;
reg [3:0] state;
reg [2047:0] buffer_32_i;
reg [255:0] buffer_128i;
assign data_outi = buffer_128i;
always @ (posedge clk_32) begin
if(rst) begin
buffer_32_i <= 2048'b0;
end else begin
buffer_32_i <= data_in_i;
end
end
always @ (posedge clk_128) begin
if(rst)begin
buffer_128i <= 256'b0;
buffer_128q <= 256'b0;
end else begin
case(state)
phase_8: begin buffer_128i <= buffer_32_i[255:0] ;end
phase_7: begin buffer_128i <= buffer_32_i[511:256] ; end
phase_6: begin buffer_128i <= buffer_32_i[767:512] ;end
phase_5: begin buffer_128i <= buffer_32_i[1023:768] ; end
phase_4: begin buffer_128i <= buffer_32_i[1279:1024] ; end
phase_3: begin buffer_128i <= buffer_32_i[1535:1280]; end
phase_2: begin buffer_128i <= buffer_32_i[1791:1536]; end
phase_1: begin buffer_128i <= buffer_32_i[2047:1792]; end
default : begin buffer_128i <= 256'b0; buffer_128q <= 256'b0; end
endcase
end
end
我通过保留符号 [MSB:LSB](小端)来确保在整个代码中保持字节序,但似乎位顺序引起了问题,有什么想法吗?
在rate_convTx模块中,case语句依赖于一个名为state的变量。状态被声明但从未分配,并且永远不会改变。