Как я могу преобразовать код ASCII в символы на языке Verilog - PullRequest
0 голосов
/ 01 декабря 2019

Я изучал это, но поиск, кажется, ни к чему не приводит. Это может быть слишком просто, чтобы быть описанным, но здесь я почесал голову ... Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

Вы, вероятно, введены в заблуждение неправильным представлением о персонажах. В оборудовании нет такого понятия, как персонаж. Есть только наборы битов или кодов. Единственное, что преобразует двоичные коды в символы, это ваш терминал. Он интерпретирует коды определенным образом и формирует буквы для вас. Таким образом, все printfs в 'c' и $display в verilog только отправляют коды на терминал (или в файл).

Для преобразования символов в коды используется клавиатура, которую вы также используете для ввода в программе. Затем компилятор интерпретирует вашу программу. Компилятор Verilog (а также компилятор 'c') представляет строки в двойных кавычках (которые вы ввели) в виде набора байтов напрямую. Verilog, а также 'c' используют кодировку ascii-8 для таких символьных строк, что означает, что код для 'a' является десятичным 97, а 'b' - 98, .... Каждый символ имеет 8-битную ширину и заключен в кавычкиstring формирует конкатенацию байтов кодов ascii.

Итак, отвечая на ваш вопрос, вы можете преобразовать коды ascii в символы, отправив их на терминал через функцию $ display (или другую), используя модификатор% s.

Итак, пример:

module A;
    reg[8*5-1:0] hello; 
    reg[8*3 - 1: 0] bye;
    initial begin
       hello = "hello"; // 5 bytes of characters
       bye = {8'd98, 8'd121, 8'd101}; // 3 bytes 'b' 'y' 'e'
       $display("hello=%s bye=%s", hello, bye);
    end
endmodule
0 голосов
/ 01 декабря 2019

Verilog знает о «строках».

Для одного символа ASCII требуется 8 бит. Таким образом, для хранения 8 символов вам нужно 64 бита:

wire [63:0] string8;

assign string8 = "12345678";

Есть некоторые ошибки:

  • Нет символа конца строки (как нулевой символ C)
  • Наиболее RHS-символ находится в битах 7: 0.
    Таким образом, строка 8 [7: 0] будет содержать 8h'38. ("8").
  • Для обхода строки необходимо использовать, например: string[ index +: 8];
  • Как и для всех назначений вектора Verilog: неиспользуемые биты устанавливаются в ноль, таким образом
    assign string8 = "ABCD"; // MS bit63:32 are zero
  • Вы можете не использовать двумерные массивы:
    wire [7:0] string5 [0:4]; assign string5 = "Wrong";
...