Назначить символ ASCII для подключения в Verilog - PullRequest
3 голосов
/ 27 января 2012

Я понимаю, что вы можете объявить строку в тестовом стенде Verilog следующим образом:

reg [8*14:1] string_value;  

initial 
    string_value = "Hello, World!";

Затем я могу что-то делать с этой строкой, например, использовать $display на тестовом стенде для ее отображения.

Мне не удалось сделать то же самое в модуле, когда я прошил его на свою FPGA:

reg [8*14:1] string_value;  

always @(reset) 
begin
    string_value = "Hello, World!";
    // Do stuff with string value

Даже присвоение одного значения не работает:

reg [8:1] char_value;  

always @(reset) 
begin
    char_value = "A";
    if (char_value == 8'h41)
        // Do stuff!

Я хочу перевести отдельные символы на 8-битной шине на ЖК-экран для отображения.

Как мне работать со строками в Verilog?

Ответы [ 6 ]

6 голосов
/ 13 сентября 2012

Вы можете назначить строку для типа регистра.Тот, кто говорит иначе, неправ.Возможно, вы захотите сделать ваши регистры 0 'для правильной работы.Я сделал это в реальных ПЛИС, и это работает.

4 голосов
/ 20 октября 2014

Определите массив байтов, затем присвойте ASCII каждому элементу массива:

wire [7:0] foo [0:11];
assign foo[0]  = "H";
assign foo[1]  = "e";
assign foo[2]  = "l";
assign foo[3]  = "l";
assign foo[4]  = "o";
assign foo[5]  = " ";
assign foo[6]  = "W";
assign foo[7]  = "o";
assign foo[8]  = "r";
assign foo[9]  = "l";
assign foo[10] = "d";
assign foo[11] = "!";

Теперь у вас есть константа со значениями ASCII, в которую вы можете индексировать.

reg [7:0] data_out;
reg       data_out_valid;
reg [3:0] some_index;
:
// pushing data onto a bus
data_out       <= foo[some_index];
data_out_valid <= 1'd1;
some_index     <= some_index + 4'd1;

С соответствующей проверкой индекса и контролем, который должен работать.

1 голос
/ 25 июня 2013

Это работает для меня:

    reg [8*16:1] line1data = "Hello, World!   ";

Как в симуляции, так и на Spartan-3E FPGA

0 голосов
/ 13 апреля 2014
output [8*14:1]string_value1;  
reg [8*14:1]string_value1;

always @ (posedge BIWEn)

if (BIWEn==1'b1 ||BIREn==1'b1)
    begin:START_STATE_WRITE
        psW=idleW;  //psW is Present State Write
        string_value1= "IDLE";
    end

![test bench] (c:\pictures)
0 голосов
/ 07 февраля 2012

SystemVerilog должен поддерживать присвоение строк, как указано в спецификации:

For example, to store the 12-character string "Hello world\n" requires a variable 8x12, or 96 bits wide. 
     bit [8*12:1] stringvar = "Hello world\n";

Не уверен, поддерживает ли старый verilog это или нет.

0 голосов
/ 27 января 2012

Мне кажется, что в модуле работают строки:

module tb;

reg [8:1] char_value;

initial begin
    char_value = "A";
    $display("%h", char_value);
    if (char_value == 8'h41) begin
        $display("match");
    end else begin
        $display("no match");
    end
end

endmodule

/*

Prints out:

41
match

*/

Что у тебя не работает?

Тип данных string был введен в стандарт SystemVerilog в 2005 году (см. IEEE 1800-2005 или 1800-2009).

...