В этом примере показано, как можно импортировать файл, содержащий код Verilog, и сгенерировать соответствующую модель Simulink при помощи importhdl
функция. importhdl
импорт и синтаксические анализы заданные файлы Verilog, чтобы сгенерировать соответствующую модель Simulink. Код Verilog в этом примере содержит алгоритм CORDIC atan2.
Этот файл входа Verilog реализует алгоритм CORDIC atan2.
type('cordic_atan2.v');
Этот проект Verilog содержит различные обычно используемые построения Verilog, такие как:
Непрерывные присвоения
Всегда блоки
Условные операторы
Инстанцирование модуля
Сгенерируйте построения
Цикл for
Чтобы импортировать файл Verilog, задайте имя файла в качестве аргумента к importhdl
функция.
importhdl('cordic_atan2.v');
importhdl
анализирует входной файл и отображает сообщения процесса импорта в Командном окне MATLAB™. Импорт обеспечивает ссылку на сгенерированную модель Simulink cordic_atan2.slx
. Сгенерированная модель использует то же имя в качестве главного модуля в файле входа Verilog.
Чтобы открыть сгенерированную модель Simulink, щелкните по ссылке в Командном окне. Модель сохранена в hdlimport/cordic_atan2
путь относительно текущей папки. Можно симулировать модель и наблюдать результаты симуляции.
addpath('hdlimport/cordic_atan2') open_system('cordic_atan2/cordic_atan2') Simulink.BlockDiagram.arrangeSystem('cordic_atan2') set_param('cordic_atan2', 'UnconnectedOutputMsg', 'None'); sim('cordic_atan2.slx');
Код Verilog инстанцирует 15
модули ядра при помощи сгенерировать построения. В сгенерированной модели Simulink, 15
модули ядра замечены.
generate for (i = 0; i<15; i =i+1) begin Kernel cordic_iterator (.clk(clk), .reset(reset), .enable(enable), .itr_num(i), .x_in(x_k[i]), .y_in(y_k[i]), .z_in(z_k[i]), .lut_constant(LUT[i]), .x_out(x_k[i+1]), .y_out(y_k[i+1]), .z_out(z_k[i+1])); end endgenerate
module Kernel( input clk, input reset, input enable, input signed [17:0]x_in, input signed [17:0]y_in, input signed [17:0]z_in, input [4:0]itr_num, input signed [15:0]lut_constant, output reg signed [17:0]x_out, output reg signed [17:0]y_out, output reg signed [17:0]z_out);
wire signed [17:0] lut_constant_signExtension = {{2{lut_constant[15]}},lut_constant};
always @(posedge clk)begin if(reset)begin x_out <={18{1'b0}}; y_out <={18{1'b0}}; z_out <= {18{1'b0}}; end else if(enable)begin if(y_in[17])begin x_out <= x_in -(y_in>>>itr_num); y_out <= y_in + (x_in>>>itr_num); z_out <= z_in - lut_constant_signExtension; end else begin x_out <= x_in +(y_in>>>itr_num); y_out <= y_in - (x_in>>>itr_num); z_out <= z_in + lut_constant_signExtension; end end end
endmodule