如何用Verilog将输入文件的每个字符存储到数组中?
用Verilog将文件字符存入数组的实现方案
你可以利用Verilog字符串本身就是字节数组的特性,直接通过下标访问$fgets读取到的每行字符串的单个字符,再存入目标数组。以下是修改后的代码,实现把每个字符(可按需处理换行符)存入数组:
首先定义全局的字符数组和索引变量,用来累计存储所有字符:
reg [7:0] char_array[0:100]; // 定义足够大的字符数组,每个元素存ASCII字符(8位) integer array_idx = 0; // 数组的当前存储索引 integer infile; reg [255:0] str; // 存储每行的字符串 integer c, r;
然后修改读取逻辑,遍历每行的每个字符存入数组:
initial begin infile = $fopen("input.txt", "r"); if (infile == 0) begin $display("Failed to open file!"); $finish; end c = $fgetc(infile); while(c != `EOF) begin r = $ungetc(c, infile); $fgets(str, infile); // 读取一行到str // 遍历当前行的每个字符,存入char_array for (int i=0; str[i] != 8'h00; i++) begin // 空字符'\0'是字符串结束标志 // 可选:跳过换行符或回车符,按需保留 if (str[i] != 8'h0A && str[i] != 8'h0D) begin char_array[array_idx] = str[i]; array_idx = array_idx + 1; end end c = $fgetc(infile); end $fclose(infile); // 打印验证存储结果 $display("Stored characters in array:"); for (int i=0; i<array_idx; i++) begin $display("char_array[%0d] = '%c'", i, char_array[i]); end end
关键说明
- Verilog的字符串变量(比如
str)本质是8位字节的数组,str[0]就是该行的第一个字符,str[1]是第二个,以此类推,直到遇到空字符8'h00结束。 - 用
array_idx累计存储位置,避免每次读行覆盖之前的存储内容。 - 代码里加了换行符(
8'h0A)和回车符(8'h0D)的判断,如果你需要保留这些换行符,删掉这个判断即可。 - 确保
char_array的大小足够容纳文件所有字符,根据实际文件大小调整数组范围。
内容的提问来源于stack exchange,提问作者ak1234
相关产品推荐
相关产品推荐

