Naredili bomo komponento za merilno kartico RedPitaya, ki bo vsebovala vmesnik za sistemsko vodilo z enim registrom in obdelavo podatkov iz enega vhodnega analognega kanala.
Naloga
Naredili bomo vezje red_pitaya_proc, ki vsebuje signale za sistemski vmesnik, v katerem bo en 8-bitni register. Uporabi vzorec kode za izdelavo vmesnika s sistemskim vodilom.
Vmesnik vsebuje signale:
Izdelavo vmesnika za sistemsko vodilo si bomo ogledali na primeru izseka kode komponente red_pitaya_hk v jeziku Verilog:
//--------------------------------------------------------------------------------- // // System bus connection: base addr+0 = ID value(read), addr+0x30 = led_o(read/write) always @(posedge clk_i) if (rstn_i == 1'b0) begin led_o <= {8'b0}; end else if (sys_wen) begin if (sys_addr[19:0]==20'h30) led_o <= sys_wdata[8:0]; end wire sys_en; assign sys_en = sys_wen | sys_ren; always @(posedge clk_i) if (rstn_i == 1'b0) begin sys_err <= 1'b0; sys_ack <= 1'b0; end else begin sys_err <= 1'b0; casez (sys_addr[19:0]) 20'h00000: begin sys_ack <= sys_en; sys_rdata <= {id_value}; end 20'h00030: begin sys_ack <= sys_en; sys_rdata <= {{32-8{1'b0}}, led_o}; end default: begin sys_ack <= sys_en; sys_rdata <= 32'h0; end endcase end
Prevodi nekaterih izrazov jezika Verilog v VHDL:
always @(posedge clk_i) | if rising_edge(clk_i) |
1'b0 | '0' |
8'b0 | "00000000" |
20'h30 | X"00030" |
Vrednost registra v vmesniku naj določa faktor skaliranja 14-bitnega analognega vhodnega signala (adc_i). Vhodni signal predstavlja vrednosti vzorčene z enim kanalom ADC, ki so zapisane v dvojiškem komplementu, zato jih najprej pretvori v 14-bitni notranji signal tipa signed. Vrednost v registru vmesnika pa naj bo 8-bitno nepredznačeno število, ki ga pretvori v 9-bitno predznačeno število. Rezultat množenja je 23-bitni vektor, ki ga skrči nazaj na 14-bitni izhod (adc_o). Če pride pri množenju do prekoračitve območja 14-bitnih vrednosti, naj gre izhodna vrednost v pozitivno ali negativno nasičenje.
Opiši vezje in preveri delovanje na simulaciji.