DanielBakker
Quidquid latine dictum sit, altum viditur
ik heb een flashcontroller aangepast, die eerst 16 bits waardes uit een flash haalde en op een 16 bits uitgang zette, maar ik heb een 8 bits flash, dus ik moet de 8 bits omzetten naar 16 bits. ik dacht dat het wel handig was om met de MSB van het adres te kiezen tussen de bovenste en onderste byte. maar nu moet de data nog weer in elkaar gezet worden. ik neem er nu 2 clockcycles voor, de 2e cycle wordt cyccomplete hoog gemaakt. updown spreekt voor zich. reg0 en reg1 zijn de hoge en lage byte van de word.
bij de plekken waar ik wat heb aangepast heb ik het erachter gezet.
module flash_cntrl (
// Wishbone slave interface
input wb_clk_i,
input wb_rst_i,
input [15:0] wb_dat_i,
output [15:0] wb_dat_o,
input [17:1] wb_adr_i,
input wb_we_i,
input wb_tga_i,
input wb_stb_i,
input wb_cyc_i,
output reg wb_ack_o,
// Pad signals
output reg [21:0] flash_addr_,
input [7:0] flash_data_,
output flash_we_n_,
output reg flash_ce2_
);
// Registers and nets
reg [11:0] base;
reg [7:0] reg0, reg1;
wire op;
wire opbase;
reg cyccomplete;
wire updown;
// Continuous assignments
assign flash_we_n_ = 1'b1;
assign op = wb_cyc_i & wb_stb_i;
assign opbase = op & wb_tga_i & wb_we_i;
assign flash_addr_[21] = updown; //aangepast
// Behaviour
// flash_addr, 21 bits
always @(posedge wb_clk_i)
flash_addr_[20:0] <= wb_tga_i ? { 1'b1, base, wb_adr_i[8:1] }
: { 5'h0, wb_adr_i[17],
wb_adr_i[15:1] };
always @(posedge wb_clk_i) flash_ce2_ <= op;
always @(posedge wb_clk_i) wb_ack_o <= op & cyccomplete;
always @(posedge wb_clk_i) wb_dat_o <= {reg1, reg0}; //aangepast
always @(posedge wb_clk_i) //dit blokje heb ik er in gezet.
if (updown == 1'b0)
begin
reg0 <= flash_data_;
updown <= 1'b1;
cyccomplete <= 1'b0;
end
else
begin
reg1 <= flash_data_;
updown <= 1'b0;
cyccomplete <= 1'b1;
end
// base
always @(posedge wb_clk_i)
base <= wb_rst_i ? 12'h0: ((opbase) ? wb_dat_i[11:0] : base);
endmodule
de vraag is nu: gaat dit werken? vooral dat updown meteen wordt geinverteerd en weer aan de ingang van de flipflop wordt aangeboden als gekeken is welke waarde hij heeft?
het duurt trouwens bijna 1 clockcycle voordat de data van het adres aan de flash ook op de uitgangen staat.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
bonkerdebonkbonkbonkk bonk bommelde bom bommelebom .. ( ik val van de trap )
miljaar wa is me dat zeg..
module flash_cntrl (
// Wishbone slave interface
input wb_clk_i,
input wb_rst_i,
input [15:0] wb_dat_i,
output reg [15:0] wb_dat_o,
input [17:1] wb_adr_i,
input wb_we_i,
input wb_tga_i,
input wb_stb_i,
input wb_cyc_i,
output reg wb_ack_o,
// Pad signals
output reg [21:0] flash_addr_,
input [7:0] flash_data_,
output flash_we_n_,
output reg flash_ce2_
);
reg cycle;
always @ posedge (wb_clk_i)
cycle <= ~cycle;
wb_ack_o <= 1'b0;
flash_addr <= {3'b0,wb_adr_i,cycle}; // aanpassen van breedte
if (~cycle) wb_dat_o[7:0] <= flash_data;
else wb_dat_o[15:0] <=flash_data;
if wb_cyc (cycle <=1'b0) // lanceer een cycle
end;
endmodule
maar er klopt iets niet. er moet nog een handshake signaal zijn. ik veronderstel dat wb_cyc een aanvraag is tot lezen en dat je wanneer de data klaar is de ACK moet geven ?
heb je de timing van die bus ?
DanielBakker
Quidquid latine dictum sit, altum viditur
ik had eerlijk gezegd een verhaal over draken verwacht, maar een trap is weer ens wat anders.
die bus zit toch wel enigzins complex in elkaar, maar ik zal dat wat jij hebt veranderd invlooien in wat er was, en dan testen maar.