[an error occurred while processing this directive]
|
А Вы посмотрите в RTL просмотрщике Квартуса, где накосячили.
По мне, так нельзя по enable обнулять счетчик. Он свободно должен период отсчитывать и по переносу подхватывать значение, записанное в регистре. Поэтому схема на базе компаратора приемлема функционально.
Удобнее использовать два счетчика. Один отсчитывает период, другой в этом периоде отсчитывает нужную длительность.
module shim
(
input clk,
input ss_n, // интервал передачи данных
input sck, // mode=1, (CPOL=0, CPHA=1) по переднему фронту устанавливаем данные, по заднему пишем
input mosi, /// MSB first (DORD = 0)
output out
);
reg [2:0] bit_ct;
reg [7:0] byte;
reg [7:0] out_port;
reg [2:0] shift_rg;
reg [7:0] ct_a;
reg [7:0] ct_b;
reg dff_a;
always @(posedge sck or posedge ss_n) begin
if(ss_n) bit_ct <= 3'd0;
else bit_ct <= bit_ct - 1'b1; end
always @(negedge sck) begin
byte[bit_ct] <= mosi; end
always @(posedge clk) begin
shift_rg <= {shift_rg[1:0], ss_n};
ct_a <= ct_a + 1'b1;
if (~shift_rg[2] & shift_rg[1]) out_port <= byte;
if (ct_a == 8'd255) ct_b <= (out_port == 8'd0) ? 8'd1 : out_port;
else ct_b <= ct_b - 1'b1;
if (ct_a == 8'd255) dff_a <= 1'b0;
else if (ct_b == 8'd1) dff_a <= 1'b1; end
assign out = dff_a;
endmodule
E-mail: info@telesys.ru